Skip to content

Commit 6cb2f14

Browse files
committed
fut: add prisma provider
1 parent bbc3269 commit 6cb2f14

File tree

5 files changed

+249
-503
lines changed

5 files changed

+249
-503
lines changed

Diff for: package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "chat-toolkit",
3-
"version": "0.2.2",
3+
"version": "0.2.3",
44
"description": "",
55
"author": "",
66
"private": false,
@@ -24,9 +24,11 @@
2424
"@nestjs/common": "^10.0.0",
2525
"@nestjs/core": "^10.0.0",
2626
"@nestjs/platform-express": "^10.0.0",
27+
"@prisma/client": "5.22.0",
2728
"@types/ramda": "^0.30.2",
2829
"dotenv": "^16.4.5",
2930
"moment": "^2.30.1",
31+
"prisma": "^5.22.0",
3032
"ramda": "^0.30.1",
3133
"reflect-metadata": "^0.2.0",
3234
"rxjs": "^7.8.1",

Diff for: prisma/schema/chat-toolkits.prisma

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
model User {
3+
id BigInt @id
4+
first_name String
5+
state State?
6+
}
7+
8+
model State {
9+
id Int @id @default(autoincrement())
10+
11+
state String
12+
arguments String?
13+
14+
on_return_switch_to String?
15+
on_return_switch_args String?
16+
17+
created_at DateTime
18+
19+
user User @relation(fields: [userId], references: [id])
20+
events Event[]
21+
22+
userId BigInt @unique
23+
}
24+
25+
model Event {
26+
id Int @id @default(autoincrement())
27+
28+
eventName String
29+
data String?
30+
31+
created_at DateTime
32+
33+
State State? @relation(fields: [stateId], references: [id])
34+
stateId Int?
35+
}

Diff for: prisma/schema/schema.prisma

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
generator client {
2+
provider = "prisma-client-js"
3+
previewFeatures = ["prismaSchemaFolder"]
4+
}
5+
6+
datasource db {
7+
provider = "postgresql"
8+
url = env("DATABASE_URL")
9+
}

Diff for: src/providers/prisma.ts

+127
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import { superjson } from "@/lib/superjson";
2+
import { PrismaClient, User } from "@prisma/client";
3+
import { Context } from "chat-toolkit";
4+
import { RecordedEvent, TransactionT } from 'chat-toolkit/src/state/state';
5+
6+
7+
type DefaultPrismaStateManagerImplementation = (prisma: PrismaClient) => (params: { currentUser: User; defaultState: string; }) => Context['manage']
8+
type FindOrCreateUserPrisma = (prisma: PrismaClient) => (user_id: any, first_name?: any) => Promise<User>
9+
10+
export const defaultPrismaStateManagerImplementation: DefaultPrismaStateManagerImplementation
11+
= prisma => params => {
12+
const { currentUser, defaultState } = params;
13+
14+
const cachedCurrentState = {
15+
async set(state: string, args: any, session?: TransactionT) {
16+
console.warn("CREATE STATE")
17+
18+
await prisma.state.create({
19+
data: {
20+
state: state,
21+
arguments: superjson.stringify(args),
22+
created_at: new Date(),
23+
userId: currentUser.id
24+
}
25+
});
26+
},
27+
28+
async get(it?: TransactionT) {
29+
console.log("Getting current state");
30+
return await findCurrentState(it);
31+
}
32+
};
33+
34+
const findCurrentState = (session?: TransactionT) => prisma.state.findFirst({ where: { userId: currentUser.id } });
35+
36+
const state: Context['manage']['state'] = {
37+
async save(state: string, args: any, params): Promise<void> {
38+
await cachedCurrentState.set(state, args, params?.session);
39+
},
40+
41+
default(): string {
42+
return defaultState;
43+
},
44+
45+
async current(): Promise<string | undefined> {
46+
const result = await cachedCurrentState.get();
47+
return result?.state;
48+
},
49+
50+
async currentFull(): Promise<any | undefined> {
51+
return await cachedCurrentState.get();
52+
},
53+
54+
async delete(params): Promise<void> {
55+
await prisma.state.delete({
56+
where: {
57+
userId: currentUser.id
58+
}
59+
});
60+
},
61+
};
62+
63+
const events: Context['manage']['events'] = {
64+
async loadAll() {
65+
console.warn("load all events")
66+
67+
const currenState = await cachedCurrentState.get();
68+
69+
const all = await prisma.event.findMany({
70+
where: {
71+
stateId: currenState.id
72+
},
73+
orderBy: {
74+
created_at: 'asc'
75+
}
76+
});
77+
78+
return all.map(({ eventName, data }) => ({ eventName, data: data ? superjson.parse(data) : undefined })) as RecordedEvent[];
79+
},
80+
81+
async save(event) {
82+
console.warn("save event")
83+
84+
const state = await cachedCurrentState.get();
85+
86+
await prisma.event.create({
87+
data: {
88+
eventName: event.eventName,
89+
data: superjson.stringify(event.data),
90+
created_at: new Date(),
91+
stateId: state.id,
92+
}
93+
});
94+
},
95+
96+
async deleteAll(params) {
97+
console.warn("DELETE ALL events")
98+
const state = await cachedCurrentState.get();
99+
100+
await prisma.event.deleteMany({
101+
where: { stateId: state.id }
102+
});
103+
}
104+
};
105+
106+
return {
107+
state,
108+
events
109+
};
110+
}
111+
112+
113+
export const findOrCreateUserPrisma: FindOrCreateUserPrisma
114+
= (prisma) => (user_id: any, first_name = '') =>
115+
prisma.user.upsert({
116+
create: {
117+
id: user_id,
118+
first_name,
119+
},
120+
update: {
121+
first_name
122+
},
123+
where: {
124+
id: user_id
125+
}
126+
})
127+

0 commit comments

Comments
 (0)