Effect CommunityEC
Effect Community4w ago
1 reply
semenovdl

Preserving Branded Types in Model Encoding for Database Operations

Is there a way to keep branded types when encoding to Model insert/update?

I have branded identifiers in models
export const EvidenceListTemplateId = SerialId.pipe(
  Schema.brand("EvidenceListTemplateId"),
);

export type EvidenceListTemplateId = typeof EvidenceListTemplateId.Type;

export const EvidenceListTemplateItemId = SerialId.pipe(
  Schema.brand("EvidenceListTemplateItemId"),
);

export type EvidenceListTemplateItemId = typeof EvidenceListTemplateItemId.Type;

export class EvidenceListTemplateItemModel extends Model.Class<EvidenceListTemplateItemModel>(
  "@app/backend/case/EvidenceListTemplateItemModel",
)({
  id: Model.Generated(EvidenceListTemplateItemId),
  templateId: EvidenceListTemplateId,
  createdAt: Model.DateTimeInsertFromDate,
  updatedAt: Model.DateTimeUpdateFromDate,
}) {
  static readonly arrayToDBInsert = Schema.encode(
    Schema.Array(EvidenceListTemplateItemModel.insert),
  );
}

that are also used in drizzle schema
export const evidenceListTemplateItems = pgTable(
  "evidence_list_template_items",
  {
    id: serial().$type<EvidenceListTemplateItemId>().primaryKey(),
    templateId: integer()
      .$type<EvidenceListTemplateId>()
      .notNull()
      .references(() => evidenceListTemplates.id, { onDelete: "cascade" }),
    ...timestampColumns(),
  }
);


and on encoding I'm lost brand information that drizzle orm requires
upsert: Effect.fn("EvidenceListTemplateItemRepo.upsert")(
  function* (values) {
    const data =
      yield* EvidenceListTemplateItemModel.arrayToDBInsert(values);
    return yield* db
      .insert(evidenceListTemplateItems)
      .values(data) // templateId should be branded
      .onConflictDoNothing();
    },
  )
Was this page helpful?