Simplify connection flow, mobile transfer UI, and header actions
This commit is contained in:
@@ -5,7 +5,8 @@ import { Storage } from './storage.js';
|
||||
import { ResumableUploads } from './resumable.js';
|
||||
import { NearbyLocations } from './nearby.js';
|
||||
import { Vault } from './vault.js';
|
||||
import { randomInt, randomUUID } from 'node:crypto';
|
||||
import { randomUUID } from 'node:crypto';
|
||||
import { newInviteCode } from './inviteCode.js';
|
||||
import { and, eq, gt, isNull, or, desc, lt, inArray, sql } from 'drizzle-orm';
|
||||
import type { DB } from './db/index.js';
|
||||
import * as s from './db/schema.js';
|
||||
@@ -380,8 +381,18 @@ export class Service {
|
||||
const now = Date.now(),
|
||||
id = randomUUID(),
|
||||
token = randomToken();
|
||||
const alphabet = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
|
||||
const code = Array.from({ length: 8 }, () => alphabet[randomInt(alphabet.length)]).join('');
|
||||
// The unique DB constraint includes historical spaces; never reuse their codes.
|
||||
const code =
|
||||
newInviteCode(this.cfg.spaceInviteCodeLength, (candidate: string) =>
|
||||
Boolean(
|
||||
this.db
|
||||
.select({ id: s.spaces.id })
|
||||
.from(s.spaces)
|
||||
.where(eq(s.spaces.codeHash, hmac(this.cfg.discoverySecret, candidate)))
|
||||
.get(),
|
||||
),
|
||||
) ??
|
||||
fail(503, 'SPACE_CODE_BUSY', '초대 코드를 만들지 못했습니다. 잠시 후 다시 시도해 주세요.');
|
||||
this.db.transaction(() => {
|
||||
this.db
|
||||
.insert(s.spaces)
|
||||
|
||||
Reference in New Issue
Block a user