// 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"