Skip to content

Commit 9828be0

Browse files
authored
Merge pull request #102 from teacoder-team/dev
Dev
2 parents aa8f938 + 5cb01cb commit 9828be0

23 files changed

Lines changed: 90 additions & 50 deletions

.dockerignore

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,2 @@
1-
# Версии и метаданные
2-
.git
3-
.gitignore
4-
.dockerignore
5-
6-
# Зависимости при сборке
71
dist
82
node_modules
9-
coverage
10-
11-
# Окружающая среда (содержит конфиденциальные данные)
12-
.env
13-
14-
# Файлы, не требующиеся в сборке
15-
Dockerfile
16-
README.md
17-
.eslintrc.js

package.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
2424
"test:e2e": "jest --config ./test/jest-e2e.json",
2525
"db:push": "prisma db push",
26-
"db:studio": "prisma studio",
27-
"release": "release-it"
26+
"db:generate": "prisma db generate",
27+
"db:studio": "prisma studio"
2828
},
2929
"dependencies": {
3030
"@aws-sdk/client-s3": "^3.1031.0",
@@ -41,8 +41,8 @@
4141
"@nestjs/schedule": "^6.0.0",
4242
"@nestjs/swagger": "^8.0.7",
4343
"@nestjs/throttler": "^6.4.0",
44-
"@prisma/adapter-pg": "^7.2.0",
45-
"@prisma/client": "^7.2.0",
44+
"@prisma/adapter-pg": "^7.7.0",
45+
"@prisma/client": "^7.7.0",
4646
"@react-email/components": "0.0.33",
4747
"@simplewebauthn/server": "^13.1.2",
4848
"@teacoder/sentinel": "^1.0.4",
@@ -55,6 +55,7 @@
5555
"class-transformer": "^0.5.1",
5656
"class-validator": "^0.15.1",
5757
"date-fns": "^4.1.0",
58+
"dotenv": "^17.4.2",
5859
"ejs": "^5.0.2",
5960
"form-data": "4.0.5",
6061
"geoip-country": "^5.0.202604142355",
@@ -75,7 +76,7 @@
7576
"nodemailer": "^8.0.5",
7677
"otpauth": "^9.5.0",
7778
"preview-email": "^3.1.3",
78-
"prisma": "^7.2.0",
79+
"prisma": "^7.7.0",
7980
"pug": "^3.0.3",
8081
"qrcode": "^1.5.4",
8182
"react": "19.2.5",

prisma.config.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
import 'dotenv/config'
1+
import { config } from 'dotenv'
22
import { defineConfig, env } from 'prisma/config'
33

4+
config()
5+
46
export default defineConfig({
7+
schema: 'prisma/schema.prisma',
8+
migrations: {
9+
path: 'prisma/migrations'
10+
},
511
datasource: {
6-
url: env('DATABASE_URI')
12+
url: env('DATABASE_URL')
713
}
814
})

src/api/auth/passkey/passkey.service.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,20 @@ export class PasskeyService {
146146
throw new BadRequestException('Verification failed')
147147

148148
const {
149-
credential: { id, publicKey }
149+
credential: { id: credentialID, publicKey: credentialPublicKey }
150150
} = verification.registrationInfo
151151

152+
const credentialIdBuf = this.toBuffer(credentialID as any)
153+
const publicKeyBuf = this.toBuffer(credentialPublicKey as any)
154+
155+
const credentialIdB64 = base64url.encode(credentialIdBuf)
156+
const publicKeyB64 = base64url.encode(publicKeyBuf)
157+
152158
await this.prismaService.passkey.create({
153159
data: {
154160
deviceName,
155-
credentialId: id,
156-
publicKey: publicKey.toString(),
161+
credentialId: credentialIdB64,
162+
publicKey: publicKeyB64,
157163
userAgent,
158164
ip,
159165
lastUsedAt: new Date(),
@@ -244,7 +250,9 @@ export class PasskeyService {
244250
expectedRPID: this.WEBAUTHN_RP_ID,
245251
credential: {
246252
id: passkey.credentialId,
247-
publicKey: base64url.toBuffer(passkey.publicKey),
253+
publicKey: this.toUint8Array(
254+
base64url.toBuffer(passkey.publicKey)
255+
),
248256
counter: passkey.counter ?? 0
249257
}
250258
})
@@ -325,4 +333,20 @@ export class PasskeyService {
325333

326334
return recoveryCodes
327335
}
336+
337+
private toBuffer(data: ArrayBuffer | Uint8Array | string): Buffer {
338+
if (typeof data === 'string') return Buffer.from(data)
339+
340+
if (data instanceof ArrayBuffer)
341+
return Buffer.from(new Uint8Array(data))
342+
if (data instanceof Uint8Array) return Buffer.from(data)
343+
344+
return Buffer.from(data as any)
345+
}
346+
347+
private toUint8Array(data: string | Buffer): Uint8Array<ArrayBuffer> {
348+
const buf = typeof data === 'string' ? base64url.toBuffer(data) : data
349+
350+
return new Uint8Array(new ArrayBuffer(buf.length)).map((_, i) => buf[i])
351+
}
328352
}

src/config/env/app.env.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { registerAs } from '@nestjs/config'
22

3+
import { validateEnv } from '@/shared/utils/env'
4+
35
import type { AppConfig } from '../definitions'
4-
import { validateEnv } from '../utils/validate-env'
56
import { AppValidator } from '../validators'
67

78
export const appEnv = registerAs<AppConfig>('app', () => {

src/config/env/fingerprint.env.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { registerAs } from '@nestjs/config'
22

3+
import { validateEnv } from '@/shared/utils/env'
4+
35
import type { FingerprintConfig } from '../definitions'
4-
import { validateEnv } from '../utils/validate-env'
56
import { FingerprintValidator } from '../validators'
67

78
export const fingerprintEnv = registerAs<FingerprintConfig>(

src/config/env/heleket.env.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { registerAs } from '@nestjs/config'
22

3+
import { validateEnv } from '@/shared/utils/env'
4+
35
import type { HeleketConfig } from '../definitions'
4-
import { validateEnv } from '../utils/validate-env'
56
import { HeleketValidator } from '../validators'
67

78
export const heleketEnv = registerAs<HeleketConfig>('heleket', () => {

src/config/env/hosts.env.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { registerAs } from '@nestjs/config'
22

3+
import { validateEnv } from '@/shared/utils/env'
4+
35
import type { HostsConfig } from '../definitions'
4-
import { validateEnv } from '../utils/validate-env'
56
import { HostsValidator } from '../validators'
67

78
export const hostsEnv = registerAs<HostsConfig>('hosts', () => {

src/config/env/kinescope.env.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { registerAs } from '@nestjs/config'
22

3+
import { validateEnv } from '@/shared/utils/env'
4+
35
import type { KinescopeConfig } from '../definitions'
4-
import { validateEnv } from '../utils/validate-env'
56
import { KinescopeValidator } from '../validators'
67

78
export const kinescopeEnv = registerAs<KinescopeConfig>('kinescope', () => {

src/config/env/mailer.env.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { registerAs } from '@nestjs/config'
22

3+
import { validateEnv } from '@/shared/utils/env'
4+
35
import type { MailerConfig } from '../definitions'
4-
import { validateEnv } from '../utils/validate-env'
56
import { MailerValidator } from '../validators'
67

78
export const mailerEnv = registerAs<MailerConfig>('mailer', () => {

0 commit comments

Comments
 (0)