11import { HttpApiBuilder } from "@effect/platform" ;
22import { SyncApi } from "@local/sync" ;
3- import { LoroSchemaTransform } from "@local/sync/loro" ;
3+ import { SnapshotToLoroDoc } from "@local/sync/loro" ;
44import { and , eq } from "drizzle-orm" ;
55import { Array , Effect , Layer , Schema } from "effect" ;
66import { workspaceTable } from "../db/schema" ;
@@ -17,7 +17,7 @@ export const SyncDataGroupLive = HttpApiBuilder.group(
1717 "push" ,
1818 ( { payload : { clientId, snapshot } , path : { workspaceId } } ) =>
1919 Effect . gen ( function * ( ) {
20- const doc = yield * Schema . encode ( LoroSchemaTransform ) ( snapshot ) ;
20+ const doc = yield * Schema . decode ( SnapshotToLoroDoc ) ( snapshot ) ;
2121
2222 const workspace = yield * query ( {
2323 Request : Schema . Struct ( {
@@ -39,26 +39,29 @@ export const SyncDataGroupLive = HttpApiBuilder.group(
3939
4040 doc . import ( workspace . snapshot ) ; // 🪄
4141
42- const newSnapshot =
43- yield * Schema . decode ( LoroSchemaTransform ) ( doc ) ;
42+ const newSnapshot = yield * Schema . encode ( SnapshotToLoroDoc ) ( doc ) ;
4443
45- yield * query ( {
44+ const newWorkspace = yield * query ( {
4645 Request : Schema . Struct ( {
47- newSnapshot : Schema . Uint8Array ,
46+ newSnapshot : Schema . Uint8ArrayFromSelf ,
4847 } ) ,
4948 execute : ( db , { newSnapshot : snapshot } ) =>
50- db . insert ( workspaceTable ) . values ( {
51- snapshot,
52- clientId : workspace . clientId ,
53- workspaceId : workspace . workspaceId ,
54- ownerClientId : workspace . ownerClientId ,
55- // createdAt
56- } ) ,
57- } ) ( { newSnapshot } ) ;
49+ db
50+ . insert ( workspaceTable )
51+ . values ( {
52+ snapshot,
53+ clientId : workspace . clientId ,
54+ workspaceId : workspace . workspaceId ,
55+ ownerClientId : workspace . ownerClientId ,
56+ } )
57+ . returning ( ) ,
58+ } ) ( { newSnapshot } ) . pipe ( Effect . flatMap ( Array . head ) ) ;
5859
59- return yield * Effect . fail ( {
60- message : "Not (fully) implemented" as const ,
61- } ) ;
60+ return {
61+ workspaceId : newWorkspace . workspaceId ,
62+ createdAt : newWorkspace . createdAt ,
63+ snapshot : newWorkspace . snapshot ,
64+ } ;
6265 } ) . pipe ( Effect . mapError ( ( error ) => error . message ) )
6366 )
6467 . handle ( "pull" , ( { path : { workspaceId } } ) =>
0 commit comments