1 Commits

Author SHA1 Message Date
Gergő Jedlicska 06e97372f0 WIP: add different implementation sketches 2024-05-10 17:25:53 +02:00
9 changed files with 140 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
import { knex } from "../../db";
import { Knex } from "knex";
type Thing = {
id: string;
name: string;
};
// talk to the DB
const repo =
(db: Knex<Thing>) =>
async (id: string): Promise<Thing | null> => {
return (await db.where({ id }).first()) ?? null;
};
// business / domain logic
const service =
(thingGetter: (id: string) => Promise<Thing | null>) =>
async (id: string): Promise<Thing | null> => {
return thingGetter(id);
};
const getThingClient = (id: string | undefined): Knex => {
if (!id) return knex;
return knex;
};
// graphql entry
export const resolver = async (args: { id: string }): Promise<Thing> => {
const thing = await service(repo(getThingClient(args.id)))(args.id);
if (!thing) throw new Error("not found");
return thing;
};
+33
View File
@@ -0,0 +1,33 @@
import { Knex } from "knex";
import { knex } from "../../db";
type Thing = {
id: string;
name: string;
};
type ServedThing = {
foo: number;
} & Thing;
// talk to the DB
const repo =
({ db }: { db: Knex<Thing> }) =>
async (id: string): Promise<Thing | null> => {
return (await db().where({ id }).first()) ?? null;
};
// business / domain logic
const service =
({ thingGetter }: { thingGetter: (id: string) => Promise<Thing | null> }) =>
async (id: string): Promise<ServedThing | null> => {
const thing = await thingGetter(id);
const foo = 123;
return thing ? { ...thing, foo } : null;
};
// graphql entry
export const resolver = async (id: string): Promise<ServedThing> => {
const thing = await service({ thingGetter: repo({ db: knex }) })(id);
if (!thing) throw new Error("not found");
return thing;
};
+8
View File
@@ -0,0 +1,8 @@
export type Thing = {
id: string;
};
export type ThingRepo = {
findThing: (id: string) => Promise<Thing | null>;
queryThing: () => Promise<Thing[]>;
};
+12
View File
@@ -0,0 +1,12 @@
import { Knex } from "knex";
import { Thing } from "./domain";
const findThing =
({ db }: { db: Knex }) =>
async (id: string): Promise<Thing | null> => {
return null;
};
export const thingRepo = ({ db }: { db: Knex }) => ({
findThing: findThing({ db }),
});
+11
View File
@@ -0,0 +1,11 @@
import { ServedThing, service } from "./services/service";
import { thingRepo } from "./repo";
import { knex } from "../../db";
export const resolver = async (id: string): Promise<ServedThing> => {
const thing = await service({
thingRepo: thingRepo({ db: knex }),
})(id);
if (!thing) throw new Error("not found");
return thing;
};
+19
View File
@@ -0,0 +1,19 @@
import { Thing, type ThingRepo } from "../domain";
export type ServedThing = {
foo: number;
} & Thing;
export const service =
({ thingRepo }: { thingRepo: Pick<ThingRepo, "findThing"> }) =>
async (id: string): Promise<ServedThing | null> => {
const thing = await thingRepo.findThing(id);
const foo = 123;
return thing ? { ...thing, foo } : null;
};
export const service2 = ({
thingRepo,
}: {
thingRepo: Pick<ThingRepo, "queryThing">;
}) => {};
View File
+24
View File
@@ -0,0 +1,24 @@
import { knex } from "../../db";
type Thing = {
id: string;
name: string;
};
const Things = () => knex<Thing>("things");
// talk to the DB
const repo = async (id: string): Promise<Thing | null> => {
return (await Things().where({ id }).first()) ?? null;
};
// business / domain logic
const service = async (id: string): Promise<Thing | null> => {
return repo(id);
};
// graphql entry
export const resolver = async (id: string): Promise<Thing> => {
const thing = await service(id);
if (!thing) throw new Error("not found");
return thing;
};
View File