feat: make general creation daemon-atomic
This commit is contained in:
@@ -20,9 +20,13 @@ const readObject = <T extends object>(value: unknown, fallback: T): T => {
|
||||
const readLegacyMemberNo = (value: unknown): number | undefined => {
|
||||
const legacyData = readObject<Record<string, unknown>>(value, {});
|
||||
const memberNo = legacyData.memberNo;
|
||||
return typeof memberNo === 'number' && Number.isSafeInteger(memberNo) && memberNo > 0
|
||||
? memberNo
|
||||
: undefined;
|
||||
return typeof memberNo === 'number' && Number.isSafeInteger(memberNo) && memberNo > 0 ? memberNo : undefined;
|
||||
};
|
||||
|
||||
const readLegacyGrade = (value: unknown): number | undefined => {
|
||||
const legacyData = readObject<Record<string, unknown>>(value, {});
|
||||
const grade = legacyData.grade;
|
||||
return typeof grade === 'number' && Number.isSafeInteger(grade) ? grade : undefined;
|
||||
};
|
||||
|
||||
const mapUser = (row: {
|
||||
@@ -71,6 +75,7 @@ const mapUser = (row: {
|
||||
passwordSalt: row.passwordSalt,
|
||||
createdAt: row.createdAt.toISOString(),
|
||||
legacyMemberNo: readLegacyMemberNo(row.legacyData),
|
||||
legacyGrade: readLegacyGrade(row.legacyData),
|
||||
});
|
||||
|
||||
export const createPostgresUserRepository = (
|
||||
|
||||
@@ -21,6 +21,7 @@ export interface UserRecord {
|
||||
passwordSalt: string;
|
||||
createdAt: string;
|
||||
legacyMemberNo?: number;
|
||||
legacyGrade?: number;
|
||||
}
|
||||
|
||||
export interface PublicUser {
|
||||
@@ -43,6 +44,7 @@ export interface UserSanctions {
|
||||
notes?: string;
|
||||
profileIconResetAt?: string;
|
||||
serverRestrictions?: Record<string, UserServerRestriction>;
|
||||
legacyPenalty?: Record<string, unknown>;
|
||||
}
|
||||
|
||||
export interface UserServerRestriction {
|
||||
|
||||
@@ -13,12 +13,7 @@ import type { UserOAuthInfo } from './auth/userRepository.js';
|
||||
import { adminRouter } from './adminRouter.js';
|
||||
import { accountRouter } from './account/router.js';
|
||||
import { resolveLocalAccountProfilePolicy } from './auth/localAccountPolicy.js';
|
||||
import {
|
||||
openPassword,
|
||||
zDisplayName,
|
||||
zPasswordEnvelope,
|
||||
zRegistrationUsername,
|
||||
} from './auth/registrationInput.js';
|
||||
import { openPassword, zDisplayName, zPasswordEnvelope, zRegistrationUsername } from './auth/registrationInput.js';
|
||||
|
||||
const zUsername = z
|
||||
.string()
|
||||
@@ -667,14 +662,17 @@ export const appRouter = router({
|
||||
expiresAt: addSeconds(now, ctx.gameSessionTtlSeconds).toISOString(),
|
||||
sessionId: gameSession.gameToken,
|
||||
user: {
|
||||
id: gameSession.userId,
|
||||
username: gameSession.username,
|
||||
displayName: gameSession.displayName,
|
||||
roles: gameSession.roles,
|
||||
createdAt: gameSession.createdAt,
|
||||
legacyMemberNo: gameSession.legacyMemberNo,
|
||||
id: user.id,
|
||||
username: user.username,
|
||||
displayName: user.displayName,
|
||||
picture: user.picture,
|
||||
imageServer: user.imageServer,
|
||||
canUseGeneralPicture: user.legacyGrade === undefined || user.legacyGrade >= 1,
|
||||
roles: user.roles,
|
||||
createdAt: user.createdAt,
|
||||
legacyMemberNo: user.legacyMemberNo,
|
||||
},
|
||||
sanctions: gameSession.sanctions,
|
||||
sanctions: user.sanctions,
|
||||
identity: {
|
||||
kakaoVerified: localAccountPolicy.kakaoVerified,
|
||||
canCreateGeneral: localAccountPolicy.canCreateGeneral,
|
||||
|
||||
Reference in New Issue
Block a user