mirror of
https://github.com/linsa-io/linsa.git
synced 2026-01-12 12:20:23 +01:00
73 lines
2.9 KiB
TypeScript
73 lines
2.9 KiB
TypeScript
// Jazz schema for LA
|
||
// if field does not have `co.optional` it is required
|
||
// rule: list all required fields first, then optional fields
|
||
// rule: any field that is generated by AI, should be prefixed with `ai`, e.g. `aiSummary`
|
||
// TODO: move more fields from old edgedb schema to jazz (where it makes sense): https://github.com/learn-anything/explore/blob/main/archive/api/edgedb/dbschema/default-latest.esdl
|
||
// TODO: all instances of (unique) should be enforced by jazz itself, it means that only one instance with that name of field can exist
|
||
// sadly jazz does not allow enforcing that, so solutions for (unique) fields is: ignore duplicates or create a supporting look up structure (CoMap.Record from url to GlobalLink) and then I’ll let you know once the better way exists
|
||
// open issue about it: https://github.com/gardencmp/jazz/issues/44
|
||
// TODO: figure out how to do default values, e.g. `GlobalLink.protocol` should have default value `https` so we don't have to supply it every time in code..
|
||
// TODO: can jazz support vector fields? e.g. `GlobalLinkAiSummary.vectorContent`, would be nice to store website content as vector for semantic search
|
||
import { CoMap, co, Account, Profile } from "jazz-tools"
|
||
import { PersonalPageLists } from "./personal-page"
|
||
import { PersonalLinkLists } from "./personal-link"
|
||
import { ListOfTopics } from "./master/topic"
|
||
|
||
declare module "jazz-tools" {
|
||
interface Profile {
|
||
avatarUrl?: string
|
||
}
|
||
}
|
||
export class UserRoot extends CoMap {
|
||
name = co.string
|
||
username = co.string
|
||
avatar = co.optional.string
|
||
website = co.optional.string
|
||
bio = co.optional.string
|
||
is_public = co.optional.boolean
|
||
|
||
personalLinks = co.ref(PersonalLinkLists)
|
||
personalPages = co.ref(PersonalPageLists)
|
||
|
||
topicsWantToLearn = co.ref(ListOfTopics)
|
||
topicsLearning = co.ref(ListOfTopics)
|
||
topicsLearned = co.ref(ListOfTopics)
|
||
}
|
||
|
||
export class LaAccount extends Account {
|
||
profile = co.ref(Profile)
|
||
root = co.ref(UserRoot)
|
||
|
||
migrate(this: LaAccount, creationProps?: { name: string; avatarUrl?: string }) {
|
||
// since we dont have a custom AuthProvider yet.
|
||
// and still using the DemoAuth. the creationProps will only accept name.
|
||
// so just do default profile create provided by jazz-tools
|
||
super.migrate(creationProps)
|
||
|
||
if (!this._refs.root && creationProps) {
|
||
this.root = UserRoot.create(
|
||
{
|
||
name: creationProps.name,
|
||
username: creationProps.name,
|
||
avatar: creationProps.avatarUrl || "",
|
||
website: "",
|
||
bio: "",
|
||
is_public: false,
|
||
|
||
personalLinks: PersonalLinkLists.create([], { owner: this }),
|
||
personalPages: PersonalPageLists.create([], { owner: this }),
|
||
|
||
topicsWantToLearn: ListOfTopics.create([], { owner: this }),
|
||
topicsLearning: ListOfTopics.create([], { owner: this }),
|
||
topicsLearned: ListOfTopics.create([], { owner: this })
|
||
},
|
||
{ owner: this }
|
||
)
|
||
}
|
||
}
|
||
}
|
||
|
||
export * from "./master/topic"
|
||
export * from "./personal-link"
|
||
export * from "./personal-page"
|