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
that are also used in drizzle schema
and on encoding I'm lost brand information that drizzle orm requires
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),
);
}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(),
}
);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();
},
)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();
},
)