Skip to content
This repository was archived by the owner on Apr 11, 2024. It is now read-only.

Commit 1927cc7

Browse files
committed
postgres db setup
1 parent b1cc42c commit 1927cc7

24 files changed

+9112
-149
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,6 @@ yarn-error.log*
3838
# typescript
3939
*.tsbuildinfo
4040
next-env.d.ts
41+
42+
# ignore mongoexport old db file
43+
db.json

package.json

+5-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
"lint": "eslint --fix",
2020
"prettier": "prettier './src' --write",
2121
"db:generate": "prisma db push --force-reset --accept-data-loss && prisma db seed",
22+
"db:generate:account": "prisma db push --force-reset --accept-data-loss --schema src/db/account.prisma && ts-node ./src/db/account-seed",
2223
"db:studio": "prisma studio",
24+
"db:studio:account": "prisma studio --schema src/db/account.prisma",
2325
"swagger:generate": "ts-node ./src/swagger/generate",
2426
"postinstall": "tsc && yarn swagger:generate && yarn db:generate"
2527
},
@@ -55,7 +57,7 @@
5557
"dependencies": {
5658
"@ethersproject/providers": "^5.7.1",
5759
"@octokit/rest": "^19.0.7",
58-
"@prisma/client": "4.11.0",
60+
"@prisma/client": "^5.11.0",
5961
"cors": "^2.8.5",
6062
"cross-fetch": "^3.1.5",
6163
"dayjs": "^1.11.7",
@@ -66,10 +68,9 @@
6668
"handlebars": "^4.7.7",
6769
"helmet": "^6.0.1",
6870
"markdown-it": "^13.0.1",
69-
"prisma": "^4.11.0",
7071
"puppeteer": "18.2.1",
7172
"slugify": "^1.6.5",
72-
"sqlite3": "^5.1.4",
73+
"sqlite3": "^5.1.7",
7374
"swagger-ui-express": "^4.6.0"
7475
},
7576
"devDependencies": {
@@ -97,6 +98,7 @@
9798
"lint-staged": "^13.1.0",
9899
"nodemon": "^2.0.20",
99100
"prettier": "^2.8.3",
101+
"prisma": "^5.11.0",
100102
"supertest": "^6.3.3",
101103
"swagger-autogen": "^2.22.0",
102104
"ts-jest": "^29.0.5",

src/db/account-seed.ts

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { PrismaClient } from '../db/clients/account'
2+
import { FileHandle, open } from 'node:fs/promises'
3+
import path from 'path'
4+
5+
const client = new PrismaClient()
6+
const testLimit = 0
7+
8+
async function main() {
9+
let file: FileHandle | undefined
10+
try {
11+
file = await open(path.join(__dirname, '../../', 'db.json'))
12+
} catch (e) {
13+
console.log('Error opening file')
14+
console.error(e)
15+
}
16+
if (!file) return
17+
18+
let connected = false
19+
while (!connected) {
20+
console.log('Connecting to db..')
21+
try {
22+
await client.$connect()
23+
connected = true
24+
} catch (e) {
25+
console.log('Error connecting to db. Retrying in 5 secs..')
26+
await new Promise((resolve) => setTimeout(resolve, 5000))
27+
}
28+
}
29+
30+
let i = 0
31+
let accounts = []
32+
console.log('Importing accounts from db.json file..')
33+
for await (const line of file.readLines()) {
34+
i++
35+
const accountImport = JSON.parse(line)
36+
const interested = accountImport.appState.sessions.filter((s: any) => s.level === 'interested').map((i: any) => i.id)
37+
const attending = accountImport.appState.sessions.filter((s: any) => s.level === 'attending').map((i: any) => i.id)
38+
39+
accounts.push({
40+
username: accountImport.username,
41+
email: accountImport.email,
42+
addresses: accountImport.addresses ?? [],
43+
disabled: accountImport.disabled ?? false,
44+
45+
favorite_speakers: accountImport.appState.speakers,
46+
interested_sessions: [],
47+
attending_sessions: [],
48+
publicSchedule: accountImport.appState.publicSchedule,
49+
notifications: false,
50+
appState_bogota: JSON.stringify({ interested, attending }),
51+
52+
createdAt: new Date(accountImport.createdAt['$date']),
53+
updatedAt: accountImport.updatedAt ? new Date(accountImport.updatedAt['$date']) : new Date(),
54+
})
55+
56+
if (testLimit > 0 && i >= testLimit) break
57+
}
58+
59+
console.log(`Importing ${i} accounts..`)
60+
const result = await client.account.createMany({
61+
data: accounts,
62+
})
63+
console.log(`Imported ${result.count} accounts.`)
64+
console.log('Done!')
65+
}
66+
67+
main()
68+
.then(async () => {
69+
await client.$disconnect()
70+
})
71+
.catch(async (e) => {
72+
console.error(e)
73+
await client.$disconnect()
74+
process.exit(1)
75+
})

src/db/account.prisma

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
datasource db {
2+
provider = "postgres"
3+
url = env("DB_CONNECTION_STRING")
4+
}
5+
6+
generator client {
7+
provider = "prisma-client-js"
8+
output = "./clients/account"
9+
}
10+
11+
model VerificationToken {
12+
id String @default(cuid()) @id
13+
identifier String
14+
nonce Int
15+
issued DateTime @default(now())
16+
expires DateTime
17+
}
18+
19+
model Account {
20+
id String @default(cuid()) @id
21+
username String?
22+
email String?
23+
addresses String[]
24+
disabled Boolean @default(false)
25+
26+
favorite_speakers String[]
27+
interested_sessions String[]
28+
attending_sessions String[]
29+
publicSchedule Boolean @default(false)
30+
notifications Boolean @default(false)
31+
appState_bogota String?
32+
33+
createdAt DateTime @default(now())
34+
updatedAt DateTime?
35+
}

src/db/clients/account/default.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './index'

src/db/clients/account/default.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = { ...require('.') }

src/db/clients/account/edge.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './default'

src/db/clients/account/edge.js

+203
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
4+
const {
5+
PrismaClientKnownRequestError,
6+
PrismaClientUnknownRequestError,
7+
PrismaClientRustPanicError,
8+
PrismaClientInitializationError,
9+
PrismaClientValidationError,
10+
NotFoundError,
11+
getPrismaClient,
12+
sqltag,
13+
empty,
14+
join,
15+
raw,
16+
Decimal,
17+
Debug,
18+
objectEnumValues,
19+
makeStrictEnum,
20+
Extensions,
21+
warnOnce,
22+
defineDmmfProperty,
23+
Public,
24+
getRuntime
25+
} = require('./runtime/edge.js')
26+
27+
28+
const Prisma = {}
29+
30+
exports.Prisma = Prisma
31+
exports.$Enums = {}
32+
33+
/**
34+
* Prisma Client JS version: 5.11.0
35+
* Query Engine version: efd2449663b3d73d637ea1fd226bafbcf45b3102
36+
*/
37+
Prisma.prismaVersion = {
38+
client: "5.11.0",
39+
engine: "efd2449663b3d73d637ea1fd226bafbcf45b3102"
40+
}
41+
42+
Prisma.PrismaClientKnownRequestError = PrismaClientKnownRequestError;
43+
Prisma.PrismaClientUnknownRequestError = PrismaClientUnknownRequestError
44+
Prisma.PrismaClientRustPanicError = PrismaClientRustPanicError
45+
Prisma.PrismaClientInitializationError = PrismaClientInitializationError
46+
Prisma.PrismaClientValidationError = PrismaClientValidationError
47+
Prisma.NotFoundError = NotFoundError
48+
Prisma.Decimal = Decimal
49+
50+
/**
51+
* Re-export of sql-template-tag
52+
*/
53+
Prisma.sql = sqltag
54+
Prisma.empty = empty
55+
Prisma.join = join
56+
Prisma.raw = raw
57+
Prisma.validator = Public.validator
58+
59+
/**
60+
* Extensions
61+
*/
62+
Prisma.getExtensionContext = Extensions.getExtensionContext
63+
Prisma.defineExtension = Extensions.defineExtension
64+
65+
/**
66+
* Shorthand utilities for JSON filtering
67+
*/
68+
Prisma.DbNull = objectEnumValues.instances.DbNull
69+
Prisma.JsonNull = objectEnumValues.instances.JsonNull
70+
Prisma.AnyNull = objectEnumValues.instances.AnyNull
71+
72+
Prisma.NullTypes = {
73+
DbNull: objectEnumValues.classes.DbNull,
74+
JsonNull: objectEnumValues.classes.JsonNull,
75+
AnyNull: objectEnumValues.classes.AnyNull
76+
}
77+
78+
79+
80+
/**
81+
* Enums
82+
*/
83+
exports.Prisma.TransactionIsolationLevel = makeStrictEnum({
84+
ReadUncommitted: 'ReadUncommitted',
85+
ReadCommitted: 'ReadCommitted',
86+
RepeatableRead: 'RepeatableRead',
87+
Serializable: 'Serializable'
88+
});
89+
90+
exports.Prisma.VerificationTokenScalarFieldEnum = {
91+
id: 'id',
92+
identifier: 'identifier',
93+
nonce: 'nonce',
94+
issued: 'issued',
95+
expires: 'expires'
96+
};
97+
98+
exports.Prisma.AccountScalarFieldEnum = {
99+
id: 'id',
100+
username: 'username',
101+
email: 'email',
102+
addresses: 'addresses',
103+
disabled: 'disabled',
104+
favorite_speakers: 'favorite_speakers',
105+
interested_sessions: 'interested_sessions',
106+
attending_sessions: 'attending_sessions',
107+
publicSchedule: 'publicSchedule',
108+
notifications: 'notifications',
109+
appState_bogota: 'appState_bogota',
110+
createdAt: 'createdAt',
111+
updatedAt: 'updatedAt'
112+
};
113+
114+
exports.Prisma.SortOrder = {
115+
asc: 'asc',
116+
desc: 'desc'
117+
};
118+
119+
exports.Prisma.QueryMode = {
120+
default: 'default',
121+
insensitive: 'insensitive'
122+
};
123+
124+
exports.Prisma.NullsOrder = {
125+
first: 'first',
126+
last: 'last'
127+
};
128+
129+
130+
exports.Prisma.ModelName = {
131+
VerificationToken: 'VerificationToken',
132+
Account: 'Account'
133+
};
134+
/**
135+
* Create the Client
136+
*/
137+
const config = {
138+
"generator": {
139+
"name": "client",
140+
"provider": {
141+
"fromEnvVar": null,
142+
"value": "prisma-client-js"
143+
},
144+
"output": {
145+
"value": "/home/w/Code/devcon-api/src/db/clients/account",
146+
"fromEnvVar": null
147+
},
148+
"config": {
149+
"engineType": "library"
150+
},
151+
"binaryTargets": [
152+
{
153+
"fromEnvVar": null,
154+
"value": "debian-openssl-3.0.x",
155+
"native": true
156+
}
157+
],
158+
"previewFeatures": [],
159+
"isCustomOutput": true
160+
},
161+
"relativeEnvPaths": {
162+
"rootEnvPath": null,
163+
"schemaEnvPath": "../../../../.env"
164+
},
165+
"relativePath": "../..",
166+
"clientVersion": "5.11.0",
167+
"engineVersion": "efd2449663b3d73d637ea1fd226bafbcf45b3102",
168+
"datasourceNames": [
169+
"db"
170+
],
171+
"activeProvider": "postgresql",
172+
"inlineDatasources": {
173+
"db": {
174+
"url": {
175+
"fromEnvVar": "DB_CONNECTION_STRING",
176+
"value": null
177+
}
178+
}
179+
},
180+
"inlineSchema": "datasource db {\n provider = \"postgres\"\n url = env(\"DB_CONNECTION_STRING\")\n}\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"./clients/account\"\n}\n\nmodel VerificationToken {\n id String @default(cuid()) @id\n identifier String\n nonce Int\n issued DateTime @default(now())\n expires DateTime\n}\n\nmodel Account {\n id String @default(cuid()) @id\n username String?\n email String?\n addresses String[]\n disabled Boolean @default(false)\n \n favorite_speakers String[]\n interested_sessions String[]\n attending_sessions String[]\n publicSchedule Boolean @default(false)\n notifications Boolean @default(false)\n appState_bogota String?\n\n createdAt DateTime @default(now())\n updatedAt DateTime?\n}\n",
181+
"inlineSchemaHash": "f9a95bb20669ea54b0f8ea74f6b4e960b17382b534f52d8d04a619060eb53a42",
182+
"copyEngine": true
183+
}
184+
config.dirname = '/'
185+
186+
config.runtimeDataModel = JSON.parse("{\"models\":{\"VerificationToken\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identifier\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"nonce\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"issued\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Account\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"username\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"addresses\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"disabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"favorite_speakers\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"interested_sessions\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"attending_sessions\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"publicSchedule\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notifications\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState_bogota\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}")
187+
defineDmmfProperty(exports.Prisma, config.runtimeDataModel)
188+
config.engineWasm = undefined
189+
190+
config.injectableEdgeEnv = () => ({
191+
parsed: {
192+
DB_CONNECTION_STRING: typeof globalThis !== 'undefined' && globalThis['DB_CONNECTION_STRING'] || typeof process !== 'undefined' && process.env && process.env.DB_CONNECTION_STRING || undefined
193+
}
194+
})
195+
196+
if (typeof globalThis !== 'undefined' && globalThis['DEBUG'] || typeof process !== 'undefined' && process.env && process.env.DEBUG || undefined) {
197+
Debug.enable(typeof globalThis !== 'undefined' && globalThis['DEBUG'] || typeof process !== 'undefined' && process.env && process.env.DEBUG || undefined)
198+
}
199+
200+
const PrismaClient = getPrismaClient(config)
201+
exports.PrismaClient = PrismaClient
202+
Object.assign(exports, Prisma)
203+

0 commit comments

Comments
 (0)