refactor(profile): handles and profiles move into halkyon_base

People's public profiles are the instance's register's (ADR 0016), so
the module now holds them: the public_profile table (unchanged, so
Learn's migration records versions only; devices get the table empty,
as they hold every module's tables), the profile and profiles
endpoints under `base`, the handle rules, the link checks and the page
at /@handle, whose foot names the app as the host's configuration says
(profilePageNote). Deleting a person deletes their profile in the
module's core.

Hosts read profiles through the module (profileOf, profilesOf,
personWithHandle, fixHandle; saveProfile for their tests), behind an
AccountRegister that is this server's own database for now. Learn's
feedback, discussions and publishing ask it; publishing fixes the
handle just before it writes the release, outside its transaction.
Explore still joins the table in its search, so Learn holds the
register wherever it runs. Learn's app calls the module's endpoints;
a profile not found is ProfileNotFoundException. Todo's database gets
the table too (it was never deployed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-19 22:20:27 +02:00
commit 4107cc3087
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
6 changed files with 38851 additions and 1197 deletions

View file

@ -11,12 +11,17 @@
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _ida;
import 'dart:typed_data' as _idt;
import 'package:halkyon_base_client/src/protocol/auth/email_code_accepted.dart'
as _ioeosfv3;
import 'package:halkyon_base_client/src/protocol/auth/sign_in_ways.dart'
as _ifld8s4r;
import 'package:halkyon_base_client/src/protocol/instance/instance_basics.dart'
as _isnyur2i;
import 'package:halkyon_base_client/src/protocol/profile/profile.dart'
as _i8qdmv6n;
import 'package:halkyon_base_client/src/protocol/profile/profile_refusal.dart'
as _ih722tf9;
import 'package:serverpod_auth_core_client/serverpod_auth_core_client.dart'
as _iacc;
import 'package:serverpod_auth_idp_client/serverpod_auth_idp_client.dart'
@ -209,6 +214,123 @@ class EndpointInstance extends _isc.EndpointRef {
);
}
/// Your public profile (Halkyon Learn's ADR 0005, rule 2; ADR 0016): the
/// handle others find you by, your display name, bio and links, the same in
/// every service of the instance. Only for people with an identity: a profile
/// is for others to see.
///
/// The person always comes from the session, never from the client: a
/// profile is only ever the caller's own.
/// {@category Endpoint}
class EndpointProfile extends _isc.EndpointRef {
EndpointProfile(_isc.EndpointCaller caller) : super(caller);
@override
String get name => 'halkyon_base.profile';
/// Your public profile; null while you have none.
_ida.Future<_i8qdmv6n.Profile?> mine() =>
caller.callServerEndpoint<_i8qdmv6n.Profile?>(
'halkyon_base.profile',
'mine',
{},
);
/// Saves your public profile, making it if you have none. Throws
/// [ProfileRefusedException] when it can't be saved (see
/// [ProfileRefusal]): a handle someone else has, whatever its case, or a
/// new handle once yours is fixed.
_ida.Future<_i8qdmv6n.Profile> save(
String handle,
String displayName,
String bio,
List<String> links,
) => caller.callServerEndpoint<_i8qdmv6n.Profile>(
'halkyon_base.profile',
'save',
{
'handle': handle,
'displayName': displayName,
'bio': bio,
'links': links,
},
);
/// Checks which of your links' pages link back to your profile's page
/// with `rel="me"` (Halkyon Learn's ADR 0011), and keeps the answer: the
/// app asks after a link is saved, and on Check again. At most 10 times an
/// hour, as each check fetches every page linked
/// ([ProfileRefusal.tooManyLinkChecks]). Throws [ProfileNotFoundException]
/// while you have no profile.
_ida.Future<_i8qdmv6n.Profile> checkLinks() =>
caller.callServerEndpoint<_i8qdmv6n.Profile>(
'halkyon_base.profile',
'checkLinks',
{},
);
/// Why [handle] couldn't be yours, as saving it would refuse it: not a
/// handle, reserved for the instance, someone else's whatever its case,
/// or a new one once yours is fixed; null when it can, as your own can. For
/// the app to say so while it is typed; saving checks again. Whose a handle
/// is, anyone can find out already ([ProfilesEndpoint.byHandle]), so this
/// tells nothing new.
_ida.Future<_ih722tf9.ProfileRefusal?> checkHandle(String handle) =>
caller.callServerEndpoint<_ih722tf9.ProfileRefusal?>(
'halkyon_base.profile',
'checkHandle',
{'handle': handle},
);
/// Shows [png] as your avatar, in place of any before: a PNG of at most
/// 1 MB, which the app draws from the picture chosen. Throws
/// [ProfileRefusedException] for anything else, and
/// [ProfileNotFoundException] while you have no profile.
_ida.Future<_i8qdmv6n.Profile> setAvatar(_idt.ByteData png) =>
caller.callServerEndpoint<_i8qdmv6n.Profile>(
'halkyon_base.profile',
'setAvatar',
{'png': png},
);
/// Shows no avatar any more. Throws [ProfileNotFoundException] while you
/// have no profile.
_ida.Future<_i8qdmv6n.Profile> removeAvatar() =>
caller.callServerEndpoint<_i8qdmv6n.Profile>(
'halkyon_base.profile',
'removeAvatar',
{},
);
/// Removes your public profile, freeing its handle; nothing when you have
/// none. Throws [ProfileRefusedException] once your handle is fixed:
/// others refer to it.
_ida.Future<void> remove() => caller.callServerEndpoint<void>(
'halkyon_base.profile',
'remove',
{},
);
}
/// The public profiles of others, found by their handles. Any signed-in
/// person may read them: they are public.
/// {@category Endpoint}
class EndpointProfiles extends _isc.EndpointRef {
EndpointProfiles(_isc.EndpointCaller caller) : super(caller);
@override
String get name => 'halkyon_base.profiles';
/// The public profile with [handle], whatever its case. Throws
/// [ProfileNotFoundException] when there is none.
_ida.Future<_i8qdmv6n.Profile> byHandle(String handle) =>
caller.callServerEndpoint<_i8qdmv6n.Profile>(
'halkyon_base.profiles',
'byHandle',
{'handle': handle},
);
}
class Caller extends _isc.ModuleEndpointCaller {
Caller(_isc.ServerpodClientShared client) : super(client) {
account = EndpointAccount(this);
@ -218,6 +340,8 @@ class Caller extends _isc.ModuleEndpointCaller {
gitHubSignIn = EndpointGitHubSignIn(this);
gitHubUpgrade = EndpointGitHubUpgrade(this);
instance = EndpointInstance(this);
profile = EndpointProfile(this);
profiles = EndpointProfiles(this);
}
late final EndpointAccount account;
@ -234,6 +358,10 @@ class Caller extends _isc.ModuleEndpointCaller {
late final EndpointInstance instance;
late final EndpointProfile profile;
late final EndpointProfiles profiles;
@override
Map<String, _isc.EndpointRef> get endpointRefLookup => {
'halkyon_base.account': account,
@ -243,5 +371,7 @@ class Caller extends _isc.ModuleEndpointCaller {
'halkyon_base.gitHubSignIn': gitHubSignIn,
'halkyon_base.gitHubUpgrade': gitHubUpgrade,
'halkyon_base.instance': instance,
'halkyon_base.profile': profile,
'halkyon_base.profiles': profiles,
};
}

View file

@ -0,0 +1,203 @@
/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */
/* To generate run: "serverpod generate" */
// ignore_for_file: implementation_imports
// ignore_for_file: library_private_types_in_public_api
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: public_member_api_docs
// ignore_for_file: type_literal_in_constant_pattern
// ignore_for_file: use_super_parameters
// ignore_for_file: invalid_use_of_internal_member
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:halkyon_base_client/src/protocol/protocol.dart' as _iwgbpyo5;
import 'package:serverpod_client/serverpod_client.dart' as _isc;
/// A person's public profile as the app shows it (ADR 0005, rule 2): never
/// whose it is, only who they say they are.
abstract class Profile
implements _isc.SerializableModel, _isc.ProtocolSerialization {
Profile._({
required this.handle,
required this.address,
required this.displayName,
required this.bio,
required this.links,
this.verifiedLinks,
this.pageUrl,
this.avatarUrl,
required this.handleFixed,
});
factory Profile({
required String handle,
required String address,
required String displayName,
required String bio,
required List<String> links,
List<String>? verifiedLinks,
String? pageUrl,
String? avatarUrl,
required bool handleFixed,
}) = _ProfileImpl;
factory Profile.fromJson(Map<String, dynamic> jsonSerialization) {
return Profile(
handle: jsonSerialization['handle'] as String,
address: jsonSerialization['address'] as String,
displayName: jsonSerialization['displayName'] as String,
bio: jsonSerialization['bio'] as String,
links: _iwgbpyo5.Protocol().deserialize<List<String>>(
jsonSerialization['links'],
),
verifiedLinks: jsonSerialization['verifiedLinks'] == null
? null
: _iwgbpyo5.Protocol().deserialize<List<String>>(
jsonSerialization['verifiedLinks'],
),
pageUrl: jsonSerialization['pageUrl'] as String?,
avatarUrl: jsonSerialization['avatarUrl'] as String?,
handleFixed: _isc.BoolJsonExtension.fromJson(
jsonSerialization['handleFixed'],
),
);
}
/// The handle as its person wrote it.
String handle;
/// The handle with the account domain, as the fediverse knows it
/// (`raisondetredev@halkyon.eu`).
String address;
/// The name shown beside the handle; empty for none.
String displayName;
/// A few words about the person; empty for none.
String bio;
/// Pages about the person, in their order.
List<String> links;
/// Those of [links] whose pages link back to [pageUrl] with `rel="me"`
/// (ADR 0011). Null from servers that predate it: none.
List<String>? verifiedLinks;
/// The profile's page on the web (`https://halkyon.eu/@raisondetredev`),
/// which a person's other pages link back to. Null where the instance
/// has none, and from servers that predate it.
String? pageUrl;
/// Where their avatar is, a PNG; null for none.
String? avatarUrl;
/// Whether the handle is fixed, as its person has published.
bool handleFixed;
/// Returns a shallow copy of this [Profile]
/// with some or all fields replaced by the given arguments.
@_isc.useResult
Profile copyWith({
String? handle,
String? address,
String? displayName,
String? bio,
List<String>? links,
List<String>? verifiedLinks,
String? pageUrl,
String? avatarUrl,
bool? handleFixed,
});
@override
Map<String, dynamic> toJson() {
return {
'__className__': 'halkyon_base.Profile',
'handle': handle,
'address': address,
'displayName': displayName,
'bio': bio,
'links': links.toJson(),
if (verifiedLinks != null) 'verifiedLinks': verifiedLinks?.toJson(),
if (pageUrl != null) 'pageUrl': pageUrl,
if (avatarUrl != null) 'avatarUrl': avatarUrl,
'handleFixed': handleFixed,
};
}
@override
Map<String, dynamic> toJsonForProtocol() {
return {
'__className__': 'halkyon_base.Profile',
'handle': handle,
'address': address,
'displayName': displayName,
'bio': bio,
'links': links.toJson(),
if (verifiedLinks != null) 'verifiedLinks': verifiedLinks?.toJson(),
if (pageUrl != null) 'pageUrl': pageUrl,
if (avatarUrl != null) 'avatarUrl': avatarUrl,
'handleFixed': handleFixed,
};
}
@override
String toString() {
return _isc.SerializationManager.encode(this);
}
}
class _Undefined {}
class _ProfileImpl extends Profile {
_ProfileImpl({
required String handle,
required String address,
required String displayName,
required String bio,
required List<String> links,
List<String>? verifiedLinks,
String? pageUrl,
String? avatarUrl,
required bool handleFixed,
}) : super._(
handle: handle,
address: address,
displayName: displayName,
bio: bio,
links: links,
verifiedLinks: verifiedLinks,
pageUrl: pageUrl,
avatarUrl: avatarUrl,
handleFixed: handleFixed,
);
/// Returns a shallow copy of this [Profile]
/// with some or all fields replaced by the given arguments.
@_isc.useResult
@override
Profile copyWith({
String? handle,
String? address,
String? displayName,
String? bio,
List<String>? links,
Object? verifiedLinks = _Undefined,
Object? pageUrl = _Undefined,
Object? avatarUrl = _Undefined,
bool? handleFixed,
}) {
return Profile(
handle: handle ?? this.handle,
address: address ?? this.address,
displayName: displayName ?? this.displayName,
bio: bio ?? this.bio,
links: links ?? this.links.map((e0) => e0).toList(),
verifiedLinks: verifiedLinks is List<String>?
? verifiedLinks
: this.verifiedLinks?.map((e0) => e0).toList(),
pageUrl: pageUrl is String? ? pageUrl : this.pageUrl,
avatarUrl: avatarUrl is String? ? avatarUrl : this.avatarUrl,
handleFixed: handleFixed ?? this.handleFixed,
);
}
}

View file

@ -0,0 +1,72 @@
/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */
/* To generate run: "serverpod generate" */
// ignore_for_file: implementation_imports
// ignore_for_file: library_private_types_in_public_api
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: public_member_api_docs
// ignore_for_file: type_literal_in_constant_pattern
// ignore_for_file: use_super_parameters
// ignore_for_file: invalid_use_of_internal_member
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:serverpod_client/serverpod_client.dart' as _isc;
/// The person asked for has no public profile here, or the caller has none
/// to change.
abstract class ProfileNotFoundException
implements
_isc.SerializableException,
_isc.SerializableModel,
_isc.ProtocolSerialization {
ProfileNotFoundException._({required this.what});
factory ProfileNotFoundException({required String what}) =
_ProfileNotFoundExceptionImpl;
factory ProfileNotFoundException.fromJson(
Map<String, dynamic> jsonSerialization,
) {
return ProfileNotFoundException(what: jsonSerialization['what'] as String);
}
/// What was looked for: `profile`.
String what;
/// Returns a shallow copy of this [ProfileNotFoundException]
/// with some or all fields replaced by the given arguments.
@_isc.useResult
ProfileNotFoundException copyWith({String? what});
@override
Map<String, dynamic> toJson() {
return {
'__className__': 'halkyon_base.ProfileNotFoundException',
'what': what,
};
}
@override
Map<String, dynamic> toJsonForProtocol() {
return {
'__className__': 'halkyon_base.ProfileNotFoundException',
'what': what,
};
}
@override
String toString() {
return 'ProfileNotFoundException(what: $what)';
}
}
class _ProfileNotFoundExceptionImpl extends ProfileNotFoundException {
_ProfileNotFoundExceptionImpl({required String what}) : super._(what: what);
/// Returns a shallow copy of this [ProfileNotFoundException]
/// with some or all fields replaced by the given arguments.
@_isc.useResult
@override
ProfileNotFoundException copyWith({String? what}) {
return ProfileNotFoundException(what: what ?? this.what);
}
}

View file

@ -0,0 +1,82 @@
/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */
/* To generate run: "serverpod generate" */
// ignore_for_file: implementation_imports
// ignore_for_file: library_private_types_in_public_api
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: public_member_api_docs
// ignore_for_file: type_literal_in_constant_pattern
// ignore_for_file: use_super_parameters
// ignore_for_file: invalid_use_of_internal_member
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:serverpod_client/serverpod_client.dart' as _isc;
/// Why saving or removing a public profile was refused; nothing changed.
enum ProfileRefusal implements _isc.SerializableModel {
/// The handle isn't 1 to 30 letters (a to z), digits or underscores.
handleInvalid,
/// The handle is kept for the instance (`admin`, `support`, …).
handleReserved,
/// Someone else has the handle, whatever its case.
handleTaken,
/// The person has published: their handle can't change, nor their profile
/// go, any more.
published,
/// The display name is longer than 30 characters.
displayNameTooLong,
/// The bio is longer than 500 characters.
bioTooLong,
/// More than 4 links.
tooManyLinks,
/// A link isn't an absolute HTTP(S) URL of at most 2,000 characters.
linkInvalid,
/// The avatar isn't a PNG of at most 1 MB.
avatarInvalid,
/// The links were checked too often in the last hour.
tooManyLinkChecks;
static ProfileRefusal fromJson(String name) {
switch (name) {
case 'handleInvalid':
return ProfileRefusal.handleInvalid;
case 'handleReserved':
return ProfileRefusal.handleReserved;
case 'handleTaken':
return ProfileRefusal.handleTaken;
case 'published':
return ProfileRefusal.published;
case 'displayNameTooLong':
return ProfileRefusal.displayNameTooLong;
case 'bioTooLong':
return ProfileRefusal.bioTooLong;
case 'tooManyLinks':
return ProfileRefusal.tooManyLinks;
case 'linkInvalid':
return ProfileRefusal.linkInvalid;
case 'avatarInvalid':
return ProfileRefusal.avatarInvalid;
case 'tooManyLinkChecks':
return ProfileRefusal.tooManyLinkChecks;
default:
throw ArgumentError(
'Value "$name" cannot be converted to "ProfileRefusal"',
);
}
}
@override
String toJson() => name;
@override
String toString() => name;
}

View file

@ -0,0 +1,77 @@
/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */
/* To generate run: "serverpod generate" */
// ignore_for_file: implementation_imports
// ignore_for_file: library_private_types_in_public_api
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: public_member_api_docs
// ignore_for_file: type_literal_in_constant_pattern
// ignore_for_file: use_super_parameters
// ignore_for_file: invalid_use_of_internal_member
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:serverpod_client/serverpod_client.dart' as _isc;
import '../profile/profile_refusal.dart' as _i5pl5k19;
/// Saving or removing a public profile was refused; nothing changed.
abstract class ProfileRefusedException
implements
_isc.SerializableException,
_isc.SerializableModel,
_isc.ProtocolSerialization {
ProfileRefusedException._({required this.reason});
factory ProfileRefusedException({required _i5pl5k19.ProfileRefusal reason}) =
_ProfileRefusedExceptionImpl;
factory ProfileRefusedException.fromJson(
Map<String, dynamic> jsonSerialization,
) {
return ProfileRefusedException(
reason: _i5pl5k19.ProfileRefusal.fromJson(
(jsonSerialization['reason'] as String),
),
);
}
/// Why it was refused.
_i5pl5k19.ProfileRefusal reason;
/// Returns a shallow copy of this [ProfileRefusedException]
/// with some or all fields replaced by the given arguments.
@_isc.useResult
ProfileRefusedException copyWith({_i5pl5k19.ProfileRefusal? reason});
@override
Map<String, dynamic> toJson() {
return {
'__className__': 'halkyon_base.ProfileRefusedException',
'reason': reason.toJson(),
};
}
@override
Map<String, dynamic> toJsonForProtocol() {
return {
'__className__': 'halkyon_base.ProfileRefusedException',
'reason': reason.toJson(),
};
}
@override
String toString() {
return 'ProfileRefusedException(reason: $reason)';
}
}
class _ProfileRefusedExceptionImpl extends ProfileRefusedException {
_ProfileRefusedExceptionImpl({required _i5pl5k19.ProfileRefusal reason})
: super._(reason: reason);
/// Returns a shallow copy of this [ProfileRefusedException]
/// with some or all fields replaced by the given arguments.
@_isc.useResult
@override
ProfileRefusedException copyWith({_i5pl5k19.ProfileRefusal? reason}) {
return ProfileRefusedException(reason: reason ?? this.reason);
}
}

View file

@ -23,6 +23,10 @@ import 'auth/github_sign_in_refusal.dart' as _ir1gd9p5;
import 'auth/github_sign_in_refused_exception.dart' as _i0xfcu5n;
import 'auth/sign_in_ways.dart' as _ie6tbh85;
import 'instance/instance_basics.dart' as _i8jixqx6;
import 'profile/profile.dart' as _ia5j8fch;
import 'profile/profile_not_found_exception.dart' as _iim3hfcf;
import 'profile/profile_refusal.dart' as _i6j6efd1;
import 'profile/profile_refused_exception.dart' as _idvc5e7p;
export 'auth/email_code_accepted.dart';
export 'auth/email_sign_in_refusal.dart';
export 'auth/email_sign_in_refused_exception.dart';
@ -30,6 +34,10 @@ export 'auth/github_sign_in_refusal.dart';
export 'auth/github_sign_in_refused_exception.dart';
export 'auth/sign_in_ways.dart';
export 'instance/instance_basics.dart';
export 'profile/profile.dart';
export 'profile/profile_not_found_exception.dart';
export 'profile/profile_refusal.dart';
export 'profile/profile_refused_exception.dart';
export 'client.dart';
class Protocol extends _isc.SerializationManager {
@ -98,6 +106,18 @@ class Protocol extends _isc.SerializationManager {
if (t == _i8jixqx6.InstanceBasics) {
return _i8jixqx6.InstanceBasics.fromJson(data) as T;
}
if (t == _ia5j8fch.Profile) {
return _ia5j8fch.Profile.fromJson(data) as T;
}
if (t == _iim3hfcf.ProfileNotFoundException) {
return _iim3hfcf.ProfileNotFoundException.fromJson(data) as T;
}
if (t == _i6j6efd1.ProfileRefusal) {
return _i6j6efd1.ProfileRefusal.fromJson(data) as T;
}
if (t == _idvc5e7p.ProfileRefusedException) {
return _idvc5e7p.ProfileRefusedException.fromJson(data) as T;
}
if (t == _isc.getType<_iys46ui1.EmailCodeAccepted?>()) {
return (data != null ? _iys46ui1.EmailCodeAccepted.fromJson(data) : null)
as T;
@ -131,6 +151,37 @@ class Protocol extends _isc.SerializationManager {
return (data != null ? _i8jixqx6.InstanceBasics.fromJson(data) : null)
as T;
}
if (t == _isc.getType<_ia5j8fch.Profile?>()) {
return (data != null ? _ia5j8fch.Profile.fromJson(data) : null) as T;
}
if (t == _isc.getType<_iim3hfcf.ProfileNotFoundException?>()) {
return (data != null
? _iim3hfcf.ProfileNotFoundException.fromJson(data)
: null)
as T;
}
if (t == _isc.getType<_i6j6efd1.ProfileRefusal?>()) {
return (data != null ? _i6j6efd1.ProfileRefusal.fromJson(data) : null)
as T;
}
if (t == _isc.getType<_idvc5e7p.ProfileRefusedException?>()) {
return (data != null
? _idvc5e7p.ProfileRefusedException.fromJson(data)
: null)
as T;
}
if (t == List<String>) {
return (data as List).map((e) => deserialize<String>(e)).toList() as T;
}
if (t == _isc.getType<List<String>?>()) {
return (data != null
? (data as List).map((e) => deserialize<String>(e)).toList()
: null)
as T;
}
if (t == List<String>) {
return (data as List).map((e) => deserialize<String>(e)).toList() as T;
}
try {
return _iaic.Protocol().deserialize<T>(data, t);
} on _isc.DeserializationTypeNotFoundException catch (_) {}
@ -149,6 +200,10 @@ class Protocol extends _isc.SerializationManager {
_i0xfcu5n.GitHubSignInRefusedException => 'GitHubSignInRefusedException',
_ie6tbh85.SignInWays => 'SignInWays',
_i8jixqx6.InstanceBasics => 'InstanceBasics',
_ia5j8fch.Profile => 'Profile',
_iim3hfcf.ProfileNotFoundException => 'ProfileNotFoundException',
_i6j6efd1.ProfileRefusal => 'ProfileRefusal',
_idvc5e7p.ProfileRefusedException => 'ProfileRefusedException',
_ => null,
};
}
@ -180,6 +235,14 @@ class Protocol extends _isc.SerializationManager {
return 'SignInWays';
case _i8jixqx6.InstanceBasics():
return 'InstanceBasics';
case _ia5j8fch.Profile():
return 'Profile';
case _iim3hfcf.ProfileNotFoundException():
return 'ProfileNotFoundException';
case _i6j6efd1.ProfileRefusal():
return 'ProfileRefusal';
case _idvc5e7p.ProfileRefusedException():
return 'ProfileRefusedException';
}
return null;
}
@ -211,6 +274,18 @@ class Protocol extends _isc.SerializationManager {
if (dataClassName == 'InstanceBasics') {
return deserialize<_i8jixqx6.InstanceBasics>(data['data']);
}
if (dataClassName == 'Profile') {
return deserialize<_ia5j8fch.Profile>(data['data']);
}
if (dataClassName == 'ProfileNotFoundException') {
return deserialize<_iim3hfcf.ProfileNotFoundException>(data['data']);
}
if (dataClassName == 'ProfileRefusal') {
return deserialize<_i6j6efd1.ProfileRefusal>(data['data']);
}
if (dataClassName == 'ProfileRefusedException') {
return deserialize<_idvc5e7p.ProfileRefusedException>(data['data']);
}
return super.deserializeByClassName(data);
}