import type { Faisan } from "../../faisan/src/helpers" interface Env {} const MAXU32 = 4294967295 export class User { env: Env state: DurableObjectState constructor(state: DurableObjectState, env: Env) { this.state = state this.env = env } async fetch(request: Request): Promise<Response> { console.log("parsing json") let json = <Faisan.Cmd>await request.json() console.log(`parsed ${JSON.stringify(json)}`) return await this.fetchCmd(json) } async fetchCmd(json: Faisan.Cmd): Promise<Response> { let headers = new Headers(); headers.set("Content-Type", "application/json"); // Faisan if ("ListProjets" in json) { return new Response(JSON.stringify(await this.listprojets()), { headers }) } if ("CreateProjet" in json) { let id = crypto.randomUUID() let t = ('0000000000' + (MAXU32 - Date.now())).slice(-10) await Promise.all([ this.state.storage.put( `pi.${id}`, { name: json.CreateProjet.name, porteur: json.CreateProjet.porteur, tel: json.CreateProjet.tel, adresse: json.CreateProjet.adresse, simulation: json.CreateProjet.simulation, t, } ), this.state.storage.put( `pt.${t}`, { id: id, name: json.CreateProjet.name }, ) ]) return new Response(id, { headers }) } if ("SaveProjet" in json) { let x: undefined | Faisan.GetProjetResp = await this.state.storage.get(`pi.${json.SaveProjet.id}`) if (x) { x.name = json.SaveProjet.name || x.name x.porteur = json.SaveProjet.porteur || x.porteur x.tel = json.SaveProjet.tel || x.tel x.adresse = json.SaveProjet.adresse || x.adresse x.simulation = json.SaveProjet.simulation || x.simulation await this.state.storage.put(`pi${json.SaveProjet.id}`, x) } return new Response("null", { headers }) } if ("GetProjet" in json) { let resp = <Faisan.GetProjetResp> await this.state.storage.get( `pi.${json.GetProjet}` ) console.log("resp", JSON.stringify(resp)) if(resp) { resp.id = json.GetProjet } return new Response(JSON.stringify(resp || null), { headers }) } if ("DelProjet" in json) { let t: undefined | { t: string } = await this.state.storage.get(`pi.${json.DelProjet.id}`) if(t) { await Promise.all([ this.state.storage.delete( `pi.${json.DelProjet.id}` ), this.state.storage.delete( `pt.${t.t}` ) ]) } return new Response("null", { headers }) } const exhaustiveCheck: never = json; throw new Error(exhaustiveCheck) } async listprojets(from?: number): Promise<Faisan.ListProjetsResp> { let opts = { prefix: 'pt.', limit: 100, startAfter: from ? `pt.${('0000000000' + (MAXU32 - from)).slice(-10)}` : undefined } let keys: Map<string, { id: string, name: string }> = await this.state.storage.list(opts) console.log(opts, [...keys.entries()]) let result: Faisan.ListProjetsResp = [] for (let v of keys.values()) { result.push({ id: v.id, name: v.name }) } return result } }