feat(model): ✨ add base ressource
definition
This commit is contained in:
parent
d1ddde757d
commit
bb0ff728e3
101
src/models/src/ressource.ts
Normal file
101
src/models/src/ressource.ts
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
import { DateString, ToJson, UUID } from '@/types.ts'
|
||||||
|
import { regex } from '@/utils.ts'
|
||||||
|
|
||||||
|
export class Ressource {
|
||||||
|
static fromJSON(
|
||||||
|
json: ToJson<Ressource>,
|
||||||
|
): Ressource {
|
||||||
|
return new Ressource({
|
||||||
|
name: json.name,
|
||||||
|
uuid: json.uuid,
|
||||||
|
createdAt: json.createdAt,
|
||||||
|
updatedAt: json.updatedAt,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static create({ name }: Pick<Ressource, 'name'>): Ressource {
|
||||||
|
const uuid = crypto.randomUUID() as UUID
|
||||||
|
const createdAt = new Date().toISOString() as DateString
|
||||||
|
const updatedAt = createdAt
|
||||||
|
|
||||||
|
return new Ressource({ name, uuid, createdAt, updatedAt })
|
||||||
|
}
|
||||||
|
|
||||||
|
#name: string
|
||||||
|
#uuid: UUID
|
||||||
|
#createdAt: DateString
|
||||||
|
#updatedAt: DateString
|
||||||
|
|
||||||
|
protected constructor(
|
||||||
|
{ name, uuid, createdAt, updatedAt }: Pick<
|
||||||
|
Ressource,
|
||||||
|
'name' | 'uuid' | 'createdAt' | 'updatedAt'
|
||||||
|
>,
|
||||||
|
) {
|
||||||
|
this.#name = name
|
||||||
|
if (!regex.uuidV4.test(uuid)) {
|
||||||
|
throw new SyntaxError(
|
||||||
|
`the following uuid "${uuid}" is not a valid UUID V4`,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
this.#uuid = uuid
|
||||||
|
if (!regex.isoDateString.test(createdAt)) {
|
||||||
|
throw new SyntaxError(
|
||||||
|
`the following create date "${createdAt}" is not a valid UTC ISO string`,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
this.#createdAt = createdAt
|
||||||
|
if (!regex.isoDateString.test(updatedAt)) {
|
||||||
|
throw new SyntaxError(
|
||||||
|
`the following update date "${updatedAt}" is not a valid UTC ISO string`,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
this.#updatedAt = updatedAt
|
||||||
|
}
|
||||||
|
|
||||||
|
get type(): 'user' | 'machine' | 'service' | 'group' | 'credential' {
|
||||||
|
throw new Error('ressource super class has no type')
|
||||||
|
}
|
||||||
|
get uuid(): UUID {
|
||||||
|
return this.#uuid
|
||||||
|
}
|
||||||
|
get name(): string {
|
||||||
|
return this.#name
|
||||||
|
}
|
||||||
|
get createdAt(): DateString {
|
||||||
|
return this.#createdAt
|
||||||
|
}
|
||||||
|
get updatedAt(): DateString {
|
||||||
|
return this.#updatedAt
|
||||||
|
}
|
||||||
|
|
||||||
|
update(
|
||||||
|
props: Partial<Omit<Ressource, 'type' | 'uuid' | 'createdAt'>>,
|
||||||
|
): Ressource {
|
||||||
|
const updated = new Ressource({ ...this, ...props })
|
||||||
|
updated.#updatedAt = new Date().toISOString() as DateString
|
||||||
|
return updated
|
||||||
|
}
|
||||||
|
|
||||||
|
toJSON() {
|
||||||
|
return {
|
||||||
|
type: this.type,
|
||||||
|
uuid: this.uuid,
|
||||||
|
name: this.name,
|
||||||
|
createdAt: this.createdAt,
|
||||||
|
updatedAt: this.updatedAt,
|
||||||
|
} as const
|
||||||
|
}
|
||||||
|
|
||||||
|
toString(): string {
|
||||||
|
return `Ressource (${JSON.stringify(this)})`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Ressource {
|
||||||
|
type: 'user' | 'machine' | 'service' | 'group' | 'credential'
|
||||||
|
uuid: UUID
|
||||||
|
name: string
|
||||||
|
createdAt: DateString
|
||||||
|
updatedAt: DateString
|
||||||
|
}
|
Loading…
Reference in a new issue