[fabric/sqlite-store] Refactor to include changes to JSONUtils and Models

This commit is contained in:
Pablo Baleztena 2024-10-24 00:01:44 -03:00
parent a053ca225b
commit 623e67afeb
6 changed files with 31 additions and 31 deletions

View File

@ -1,5 +1,6 @@
import { import {
AsyncResult, AsyncResult,
JSONUtils,
MaybePromise, MaybePromise,
PosixDate, PosixDate,
Run, Run,
@ -11,7 +12,6 @@ import {
EventFromKey, EventFromKey,
EventStore, EventStore,
EventSubscriber, EventSubscriber,
JSONUtils,
StoredEvent, StoredEvent,
StoreQueryError, StoreQueryError,
} from "@fabric/domain"; } from "@fabric/domain";

View File

@ -8,7 +8,7 @@ describe("ModelToSQL", () => {
name: Field.string(), name: Field.string(),
age: Field.integer(), age: Field.integer(),
// isTrue: Field.boolean(), // isTrue: Field.boolean(),
date: Field.timestamp(), date: Field.posixDate(),
reference: Field.reference({ targetModel: "somethingElse" }), reference: Field.reference({ targetModel: "somethingElse" }),
}); });

View File

@ -40,7 +40,7 @@ const FieldSQLDefinitionMap: FieldSQLDefinitionMap = {
DecimalField: (n, f): string => { DecimalField: (n, f): string => {
return [n, "REAL", modifiersFromOpts(f)].join(" "); return [n, "REAL", modifiersFromOpts(f)].join(" ");
}, },
TimestampField: (n, f): string => { PosixDateField: (n, f): string => {
return [n, "NUMERIC", modifiersFromOpts(f)].join(" "); return [n, "NUMERIC", modifiersFromOpts(f)].join(" ");
}, },
EmbeddedField: (n, f): string => { EmbeddedField: (n, f): string => {
@ -49,6 +49,9 @@ const FieldSQLDefinitionMap: FieldSQLDefinitionMap = {
BooleanField: (n, f): string => { BooleanField: (n, f): string => {
return [n, "BOOLEAN", modifiersFromOpts(f)].join(" "); return [n, "BOOLEAN", modifiersFromOpts(f)].join(" ");
}, },
EmailField: (n, f): string => {
return [n, "TEXT", modifiersFromOpts(f)].join(" ");
},
}; };
function fieldDefinitionToSQL(name: string, field: FieldDefinition) { function fieldDefinitionToSQL(name: string, field: FieldDefinition) {
return FieldSQLDefinitionMap[field[VariantTag]](name, field as any); return FieldSQLDefinitionMap[field[VariantTag]](name, field as any);

View File

@ -1,5 +1,5 @@
// deno-lint-ignore-file no-explicit-any // deno-lint-ignore-file no-explicit-any
import { PosixDate, VariantTag } from "@fabric/core"; import { JSONUtils, PosixDate, VariantTag } from "@fabric/core";
import { FieldDefinition, FieldToType, Model } from "@fabric/domain"; import { FieldDefinition, FieldToType, Model } from "@fabric/domain";
export function transformRow(model: Model) { export function transformRow(model: Model) {
@ -39,7 +39,8 @@ const FieldSQLInsertMap: FieldSQLInsertMap = {
ReferenceField: (_, v) => v, ReferenceField: (_, v) => v,
FloatField: (_, v) => v, FloatField: (_, v) => v,
DecimalField: (_, v) => v, DecimalField: (_, v) => v,
TimestampField: (_, v) => new PosixDate(v), PosixDateField: (_, v) => new PosixDate(v),
EmbeddedField: (_, v: string) => JSON.parse(v), EmbeddedField: (_, v: string) => JSONUtils.parse(v),
BooleanField: (_, v) => v, BooleanField: (_, v) => v,
EmailField: (_, v) => v,
}; };

View File

@ -1,6 +1,7 @@
// deno-lint-ignore-file no-explicit-any // deno-lint-ignore-file no-explicit-any
import { VariantTag } from "@fabric/core"; import { JSONUtils, VariantTag } from "@fabric/core";
import { FieldDefinition, FieldToType } from "@fabric/domain"; import { FieldDefinition, FieldToType } from "@fabric/domain";
import { isNullish } from "@fabric/validations";
type FieldSQLInsertMap = { type FieldSQLInsertMap = {
[K in FieldDefinition[VariantTag]]: ( [K in FieldDefinition[VariantTag]]: (
@ -20,13 +21,14 @@ const FieldSQLInsertMap: FieldSQLInsertMap = {
ReferenceField: (_, v) => v, ReferenceField: (_, v) => v,
FloatField: (_, v) => v, FloatField: (_, v) => v,
DecimalField: (_, v) => v, DecimalField: (_, v) => v,
TimestampField: (_, v) => v.timestamp, PosixDateField: (_, v) => v.timestamp,
EmbeddedField: (_, v: string) => JSON.stringify(v), EmbeddedField: (_, v: string) => JSONUtils.stringify(v),
BooleanField: (_, v) => v, BooleanField: (_, v) => v,
EmailField: (_, v) => v,
}; };
export function fieldValueToSQL(field: FieldDefinition, value: any) { export function fieldValueToSQL(field: FieldDefinition, value: any) {
if (value === null) { if (isNullish(value)) {
return null; return null;
} }
const r = FieldSQLInsertMap[field[VariantTag]] as any; const r = FieldSQLInsertMap[field[VariantTag]] as any;

View File

@ -1,14 +1,7 @@
import { Run, UUID } from "@fabric/core"; import { Run } from "@fabric/core";
import { Field, isLike, Model } from "@fabric/domain"; import { Field, isLike, Model } from "@fabric/domain";
import { UUIDGeneratorMock } from "@fabric/domain/mocks"; import { UUIDGeneratorMock } from "@fabric/domain/mocks";
import { import { afterEach, beforeEach, describe, expect, test } from "@fabric/testing";
afterEach,
beforeEach,
describe,
expect,
expectTypeOf,
test,
} from "@fabric/testing";
import { SQLiteStateStore } from "./state-store.ts"; import { SQLiteStateStore } from "./state-store.ts";
describe("State Store", () => { describe("State Store", () => {
@ -16,6 +9,7 @@ describe("State Store", () => {
Model.entityFrom("demo", { Model.entityFrom("demo", {
value: Field.float(), value: Field.float(),
owner: Field.reference({ targetModel: "users" }), owner: Field.reference({ targetModel: "users" }),
optional: Field.string({ isOptional: true }),
}), }),
Model.entityFrom("users", { Model.entityFrom("users", {
name: Field.string(), name: Field.string(),
@ -52,12 +46,12 @@ describe("State Store", () => {
const result = await store.from("users").select().unwrapOrThrow(); const result = await store.from("users").select().unwrapOrThrow();
expectTypeOf(result).toEqualTypeOf< // expectTypeOf(result).toEqualTypeOf<
{ // {
id: UUID; // id: UUID;
name: string; // name: string;
}[] // }[]
>(); // >();
expect(result).toEqual([ expect(result).toEqual([
{ {
@ -95,12 +89,12 @@ describe("State Store", () => {
}) })
.select().unwrapOrThrow(); .select().unwrapOrThrow();
expectTypeOf(result).toEqualTypeOf< // expectTypeOf(result).toEqualTypeOf<
{ // {
id: UUID; // id: UUID;
name: string; // name: string;
}[] // }[]
>(); // >();
expect(result).toEqual([ expect(result).toEqual([
{ {