Skip to content

Commit 25617b2

Browse files
Fixes: Db zod schemas; EventBus repository schema (#102)
* coerce dates in zod db schemas * parse zod schema in queuehandler * change event schema to only send ids in props * remove logs
1 parent 6f8f1fb commit 25617b2

File tree

8 files changed

+65
-20
lines changed

8 files changed

+65
-20
lines changed

apps/extract-stack/src/create-message.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,18 @@ export function createMessage<QueueUrl extends string, Shape extends ZodRawShape
6666

6767
return {
6868
send,
69-
sendAll
69+
sendAll,
70+
shapes: {
71+
contentShape,
72+
metadataShape,
73+
}
7074
}
7175
}
7276

7377
type Sender<Shape extends ZodRawShape, MetadataShape extends ZodRawShape> = {
7478
send: Send<Shape, MetadataShape>;
7579
sendAll: BatchSend<Shape, MetadataShape>
80+
shapes: { contentShape: Shape, metadataShape: MetadataShape };
7681
}
7782

7883
type MessagePayload<Shape extends ZodRawShape, MetadataShape extends ZodRawShape> = {
@@ -86,6 +91,10 @@ export function QueueHandler<Shape extends ZodRawShape, MetadataShape extends Zo
8691
message: MessagePayload<Shape, MetadataShape>
8792
) => Promise<void>
8893
) {
94+
const schema = z.object({
95+
content: z.object(_sender.shapes.contentShape),
96+
metadata: z.object(_sender.shapes.metadataShape)
97+
});
8998
/**
9099
* TODO:
91100
* - Do consumers always recieve batches ?
@@ -94,7 +103,8 @@ export function QueueHandler<Shape extends ZodRawShape, MetadataShape extends Zo
94103
return async (event: SQSEvent) => {
95104
if (event.Records.length > 1) console.warn('WARNING: QueueHandler should process 1 message but got', event.Records.length);
96105
for (const record of event.Records) {
97-
await cb(JSON.parse(record.body) as MessagePayload<Shape, MetadataShape>);
106+
const parsed = schema.parse(JSON.parse(record.body) as unknown) as MessagePayload<Shape, MetadataShape>;
107+
await cb(parsed);
98108
}
99109
}
100110
}

apps/extract-stack/src/events.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import { EventBus } from "sst/node/event-bus";
22
import { z } from "zod";
33

4-
import { RepositorySchema } from "@acme/extract-schema";
54
import { MergeRequestSchema } from "@acme/extract-schema/src/merge-requests";
6-
import { NamespaceSchema } from "@acme/extract-schema/src/namespaces";
75
import { createEvent } from "./create-event";
86

97
const extractRepositoryEventSchema = z.object({
10-
repository: RepositorySchema,
11-
namespace: z.nullable(NamespaceSchema),
8+
repositoryId: z.number(),
9+
namespaceId: z.nullable(z.number()),
1210
});
1311

1412
const metadataSchema = z.object({

apps/extract-stack/src/extract-members.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ import { createClient } from "@libsql/client";
55
import { drizzle } from "drizzle-orm/libsql";
66
import { getMembers } from "@acme/extract-functions";
77
import type { Context, GetMembersEntities, GetMembersSourceControl } from "@acme/extract-functions";
8-
import { members, repositoriesToMembers } from "@acme/extract-schema";
8+
import { members, namespaces, repositories, repositoriesToMembers } from "@acme/extract-schema";
99
import type { Namespace, Repository } from "@acme/extract-schema";
1010
import { GitHubSourceControl, GitlabSourceControl } from "@acme/source-control";
1111
import type { Pagination } from "@acme/source-control";
1212
import { Config } from "sst/node/config";
1313
import { extractMemberPageMessage } from "./messages";
1414

1515
import { QueueHandler } from "./create-message";
16+
import { eq } from "drizzle-orm";
1617

1718
const clerkClient = Clerk({ secretKey: Config.CLERK_SECRET_KEY });
1819
const client = createClient({ url: Config.DATABASE_URL, authToken: Config.DATABASE_AUTH_TOKEN });
@@ -72,18 +73,26 @@ const extractMembersPage = async ({ namespace, repository, sourceControl, userId
7273
};
7374

7475
export const eventHandler = EventHandler(extractRepositoryEvent, async (ev) => {
76+
if (!ev.properties.namespaceId) throw new Error("Missing namespaceId");
77+
78+
const repository = await db.select().from(repositories).where(eq(repositories.id, ev.properties.repositoryId)).get();
79+
const namespace = await db.select().from(namespaces).where(eq(namespaces.id, ev.properties.namespaceId)).get();
80+
81+
if (!repository) throw new Error("invalid repo id");
82+
if (!namespace) throw new Error("Invalid namespace id");
83+
7584
const pagination = await extractMembersPage({
76-
namespace: ev.properties.namespace,
77-
repository: ev.properties.repository,
85+
namespace: namespace,
86+
repository: repository,
7887
sourceControl: ev.metadata.sourceControl,
7988
userId: ev.metadata.userId,
8089
});
8190

8291
const arrayOfExtractMemberPageMessageContent: { repository: Repository, namespace: Namespace | null, pagination: Pagination }[] = [];
8392
for (let i = 2; i <= pagination.totalPages; i++) {
8493
arrayOfExtractMemberPageMessageContent.push({
85-
namespace: ev.properties.namespace,
86-
repository: ev.properties.repository,
94+
namespace: namespace,
95+
repository: repository,
8796
pagination: {
8897
page: i,
8998
perPage: pagination.perPage,

apps/extract-stack/src/extract-repository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export const handler = ApiHandler(async (ev) => {
106106

107107
const { repository, namespace } = await getRepository({ externalRepositoryId: repositoryId, repositoryName, namespaceName }, context);
108108

109-
await extractRepositoryEvent.publish({ repository, namespace }, { caller: 'extract-repository', timestamp: new Date().getTime(), version: 1, sourceControl, userId: sub });
109+
await extractRepositoryEvent.publish({ repositoryId: repository.id, namespaceId: namespace?.id || null }, { caller: 'extract-repository', timestamp: new Date().getTime(), version: 1, sourceControl, userId: sub });
110110

111111
return {
112112
statusCode: 200,

packages/schemas/extract/src/members.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { InferModel } from 'drizzle-orm';
22
import { sql } from 'drizzle-orm';
33
import { sqliteTable, text, integer, uniqueIndex } from 'drizzle-orm/sqlite-core';
44
import { createInsertSchema, createSelectSchema } from 'drizzle-zod';
5+
import { z } from 'zod';
56

67
export const members = sqliteTable('members', {
78
id: integer('id').primaryKey(),
@@ -16,5 +17,11 @@ export const members = sqliteTable('members', {
1617

1718
export type Member = InferModel<typeof members>;
1819
export type NewMember = InferModel<typeof members, 'insert'>;
19-
export const MemberSchema = createSelectSchema(members);
20-
export const NewMemberSchema = createInsertSchema(members);
20+
export const MemberSchema = createSelectSchema(members, {
21+
createdAt: z.coerce.date(),
22+
updatedAt: z.coerce.date(),
23+
});
24+
export const NewMemberSchema = createInsertSchema(members, {
25+
createdAt: z.coerce.date(),
26+
updatedAt: z.coerce.date(),
27+
});

packages/schemas/extract/src/merge-requests.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { InferModel } from "drizzle-orm";
22
import { sql } from "drizzle-orm";
33
import { integer, sqliteTable, uniqueIndex } from "drizzle-orm/sqlite-core";
44
import { createInsertSchema } from "drizzle-zod";
5+
import { z } from "zod";
56

67
export const mergeRequests = sqliteTable(
78
"merge_requests",
@@ -24,5 +25,11 @@ export const mergeRequests = sqliteTable(
2425

2526
export type MergeRequest = InferModel<typeof mergeRequests>;
2627
export type NewMergeRequest = InferModel<typeof mergeRequests, "insert">;
27-
export const MergeRequestSchema = createInsertSchema(mergeRequests);
28-
export const NewMergeRequestSchema = createInsertSchema(mergeRequests);
28+
export const MergeRequestSchema = createInsertSchema(mergeRequests, {
29+
createdAt: z.coerce.date(),
30+
updatedAt: z.coerce.date(),
31+
});
32+
export const NewMergeRequestSchema = createInsertSchema(mergeRequests, {
33+
createdAt: z.coerce.date(),
34+
updatedAt: z.coerce.date(),
35+
});

packages/schemas/extract/src/namespaces.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { InferModel } from 'drizzle-orm';
22
import { sql } from 'drizzle-orm';
33
import { sqliteTable, text, integer, uniqueIndex } from 'drizzle-orm/sqlite-core';
44
import { createInsertSchema, createSelectSchema } from 'drizzle-zod';
5+
import { z } from 'zod';
56

67
export const namespaces = sqliteTable('namespaces', {
78
id: integer('id').primaryKey(),
@@ -15,5 +16,11 @@ export const namespaces = sqliteTable('namespaces', {
1516

1617
export type Namespace = InferModel<typeof namespaces>;
1718
export type NewNamespace = InferModel<typeof namespaces, 'insert'>;
18-
export const NewNamespaceSchema = createInsertSchema(namespaces);
19-
export const NamespaceSchema = createSelectSchema(namespaces);
19+
export const NewNamespaceSchema = createInsertSchema(namespaces, {
20+
createdAt: z.coerce.date(),
21+
updatedAt: z.coerce.date(),
22+
});
23+
export const NamespaceSchema = createSelectSchema(namespaces, {
24+
createdAt: z.coerce.date(),
25+
updatedAt: z.coerce.date(),
26+
});

packages/schemas/extract/src/repositories.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { InferModel } from 'drizzle-orm';
22
import { sql } from 'drizzle-orm';
33
import { sqliteTable, integer,text, uniqueIndex } from 'drizzle-orm/sqlite-core';
44
import { createInsertSchema, createSelectSchema } from 'drizzle-zod';
5+
import { z } from 'zod';
56

67
export const repositories = sqliteTable('repositories', {
78
id: integer('id').primaryKey(),
@@ -15,5 +16,11 @@ export const repositories = sqliteTable('repositories', {
1516

1617
export type Repository = InferModel<typeof repositories>;
1718
export type NewRepository = InferModel<typeof repositories, 'insert'>;
18-
export const NewRepositorySchema = createInsertSchema(repositories);
19-
export const RepositorySchema = createSelectSchema(repositories);
19+
export const NewRepositorySchema = createInsertSchema(repositories, {
20+
createdAt: z.coerce.date(),
21+
updatedAt: z.coerce.date(),
22+
});
23+
export const RepositorySchema = createSelectSchema(repositories, {
24+
createdAt: z.coerce.date(),
25+
updatedAt: z.coerce.date(),
26+
});

0 commit comments

Comments
 (0)