From 28a517323b2b5d28c7e9b6ac67de79262247ee8e Mon Sep 17 00:00:00 2001 From: Julien Oculi Date: Tue, 18 Jun 2024 14:05:45 +0200 Subject: [PATCH] feat(model): :sparkles: add new static method `load` to create ressources from partial entry --- src/models/src/credential.ts | 15 +++++++++++++++ src/models/src/group.ts | 17 +++++++++++++++++ src/models/src/machine.ts | 19 +++++++++++++++++++ src/models/src/ressource.ts | 4 ++++ src/models/src/service.ts | 19 +++++++++++++++++++ src/models/src/user.ts | 31 +++++++++++++++++++++++++++++++ 6 files changed, 105 insertions(+) diff --git a/src/models/src/credential.ts b/src/models/src/credential.ts index 7641d0a..cdf900d 100644 --- a/src/models/src/credential.ts +++ b/src/models/src/credential.ts @@ -1,6 +1,7 @@ import type { Base64String, ToJson, UUID } from '@/types.ts' import { Ressource } from '@models/ressource.ts' import type { Ref } from '@models' +import { Avatar } from '@/src/models/utils/avatar.ts' export class Credential extends Ressource { static fromJSON( @@ -27,6 +28,20 @@ export class Credential extends Ressource { }) } + static load({ + category, + store, + name, + avatar = Avatar.fromEmoji('🔑'), + }: { + name: Credential['name'] + category: T + store: Credential['store'] + avatar?: Credential['avatar'] + }): Credential { + return this.create({ category, store, name, avatar }) + } + #category: T #store: Readonly> diff --git a/src/models/src/group.ts b/src/models/src/group.ts index fb33415..ba6a8d2 100644 --- a/src/models/src/group.ts +++ b/src/models/src/group.ts @@ -1,6 +1,7 @@ import type { Posix, ToJson, UUID } from '@/types.ts' import { Ressource } from '@models/ressource.ts' import { Ref } from '@models' +import { Avatar } from '@/src/models/utils/avatar.ts' export class Group extends Ressource { static fromJSON( @@ -32,6 +33,22 @@ export class Group extends Ressource { }) } + static load({ + name, + groups = [], + permissions = {}, + posix, + avatar = Avatar.fromEmoji('👥'), + }: { + name: Group['name'] + permissions?: Group['permissions'] + posix?: Group['posix'] + avatar?: Group['avatar'] + groups?: Group['groups'] + }): Group { + return this.create({ name, groups, permissions, posix, avatar }) + } + #posix?: Posix #permissions: Readonly<{ [serviceOrMachine: UUID]: { diff --git a/src/models/src/machine.ts b/src/models/src/machine.ts index 8155d39..005cc34 100644 --- a/src/models/src/machine.ts +++ b/src/models/src/machine.ts @@ -2,6 +2,7 @@ import { Ref } from '@/src/models/utils/ref.ts' import type { ToJson, UrlString } from '@/types.ts' import type { Group } from '@models/group.ts' import { Ressource } from '@models/ressource.ts' +import { Avatar } from '@/src/models/utils/avatar.ts' export class Machine extends Ressource { static fromJSON( @@ -32,6 +33,24 @@ export class Machine extends Ressource { }) } + static load({ + name, + avatar = Avatar.fromEmoji('🖨️'), + tags = [], + url, + status = 'unknown', + groups = [], + }: { + name: Machine['name'] + avatar?: Machine['avatar'] + tags?: Machine['tags'] + url: Machine['url'] + status?: Machine['status'] + groups?: Machine['groups'] + }): Machine { + return this.create({ name, avatar, tags, url, status, groups }) + } + #tags: readonly string[] #url: UrlString #status: diff --git a/src/models/src/ressource.ts b/src/models/src/ressource.ts index b1b77a3..c7a23bf 100644 --- a/src/models/src/ressource.ts +++ b/src/models/src/ressource.ts @@ -25,6 +25,10 @@ export class Ressource { return new Ressource({ name, avatar, uuid, createdAt, updatedAt }) } + static load(_options: never): Ressource { + throw new Error('not implemented') + } + #name: string #uuid: UUID #createdAt: DateString diff --git a/src/models/src/service.ts b/src/models/src/service.ts index 5d03a7c..aa38b8e 100644 --- a/src/models/src/service.ts +++ b/src/models/src/service.ts @@ -2,6 +2,7 @@ import { Ref } from '@/src/models/utils/ref.ts' import type { ToJson, UrlString } from '@/types.ts' import type { Group } from '@models/group.ts' import { Ressource } from '@models/ressource.ts' +import { Avatar } from '@/src/models/utils/avatar.ts' export class Service extends Ressource { static fromJSON( @@ -33,6 +34,24 @@ export class Service extends Ressource { }) } + static load({ + name, + avatar = Avatar.fromEmoji('⚙️'), + tags = [], + url, + category, + groups = [], + }: { + name: Service['name'] + url: Service['url'] + avatar?: Service['avatar'] + tags?: Service['tags'] + category: Service['category'] + groups?: Service['groups'] + }): Service { + return this.create({ name, avatar, tags, url, category, groups }) + } + #category: 'web' | 'fs' | 'git' #url: UrlString #groups: readonly Ref[] diff --git a/src/models/src/user.ts b/src/models/src/user.ts index cd42bd4..bcd9955 100644 --- a/src/models/src/user.ts +++ b/src/models/src/user.ts @@ -4,6 +4,7 @@ import { regex, toLogin } from '@/utils.ts' import type { Credential, CredentialCategory } from '@models/credential.ts' import type { Group } from '@models/group.ts' import { Ressource } from '@models/ressource.ts' +import { Avatar } from '@/src/models/utils/avatar.ts' export class User extends Ressource { static fromJSON(json: ToJson): User { @@ -66,6 +67,36 @@ export class User extends Ressource { return new User({ name, avatar, uuid, createdAt, updatedAt, ...props }) } + static load({ + lastname, + firstname, + mail, + groups = [], + posix, + avatar = Avatar.fromEmoji('👤'), + credentials = [], + }: { + lastname: User['lastname'] + firstname: User['firstname'] + mail: User['mail'] + groups?: User['groups'] + posix?: User['posix'] + avatar?: User['avatar'] + credentials?: User['credentials'] + }): User { + const name = `${firstname} ${lastname}` + return this.create({ + name, + lastname, + firstname, + mail, + groups, + posix, + avatar, + credentials, + }) + } + #lastname: string #firstname: string #login: Login