@@ -2,10 +2,11 @@ import { config } from '@/lib/config';
22import { createToken , hashPassword } from '@/lib/crypto' ;
33import { prisma } from '@/lib/db' ;
44import { User , userSelect } from '@/lib/db/models/user' ;
5+ import { log } from '@/lib/logger' ;
6+ import { secondlyRatelimit } from '@/lib/ratelimits' ;
57import { getSession , saveSession } from '@/server/session' ;
68import fastifyPlugin from 'fastify-plugin' ;
79import { ApiLoginResponse } from './login' ;
8- import { log } from '@/lib/logger' ;
910
1011export type ApiAuthRegisterResponse = ApiLoginResponse ;
1112
@@ -20,85 +21,78 @@ const logger = log('api').c('auth').c('register');
2021export const PATH = '/api/auth/register' ;
2122export default fastifyPlugin (
2223 ( server , _ , done ) => {
23- server . route < {
24- Body : Body ;
25- } > ( {
26- url : PATH ,
27- method : [ 'POST' ] ,
28- handler : async ( req , res ) => {
29- const session = await getSession ( req , res ) ;
24+ server . post < { Body : Body } > ( PATH , { ...secondlyRatelimit ( 5 ) } , async ( req , res ) => {
25+ const session = await getSession ( req , res ) ;
3026
31- const { username, password, code } = req . body ;
27+ const { username, password, code } = req . body ;
3228
33- if ( code && ! config . invites . enabled ) return res . badRequest ( "Invites aren't enabled" ) ;
34- if ( ! code && ! config . features . userRegistration )
35- return res . badRequest ( 'User registration is disabled' ) ;
29+ if ( code && ! config . invites . enabled ) return res . badRequest ( "Invites aren't enabled" ) ;
30+ if ( ! code && ! config . features . userRegistration ) return res . badRequest ( 'User registration is disabled' ) ;
3631
37- if ( ! username ) return res . badRequest ( 'Username is required' ) ;
38- if ( ! password ) return res . badRequest ( 'Password is required' ) ;
32+ if ( ! username ) return res . badRequest ( 'Username is required' ) ;
33+ if ( ! password ) return res . badRequest ( 'Password is required' ) ;
34+
35+ const oUser = await prisma . user . findUnique ( {
36+ where : {
37+ username,
38+ } ,
39+ } ) ;
40+ if ( oUser ) return res . badRequest ( 'Username is taken' ) ;
3941
40- const oUser = await prisma . user . findUnique ( {
42+ if ( code ) {
43+ const invite = await prisma . invite . findFirst ( {
4144 where : {
42- username ,
45+ OR : [ { id : code } , { code } ] ,
4346 } ,
4447 } ) ;
45- if ( oUser ) return res . badRequest ( 'Username is taken' ) ;
46-
47- if ( code ) {
48- const invite = await prisma . invite . findFirst ( {
49- where : {
50- OR : [ { id : code } , { code } ] ,
51- } ,
52- } ) ;
53-
54- if ( ! invite ) return res . badRequest ( 'Invalid invite code' ) ;
55- if ( invite . expiresAt && new Date ( invite . expiresAt ) < new Date ( ) )
56- return res . badRequest ( 'Invalid invite code' ) ;
57- if ( invite . maxUses && invite . uses >= invite . maxUses ) return res . badRequest ( 'Invalid invite code' ) ;
58-
59- await prisma . invite . update ( {
60- where : {
61- id : invite . id ,
62- } ,
63- data : {
64- uses : invite . uses + 1 ,
65- } ,
66- } ) ;
67-
68- logger . info ( 'invite used' , {
69- user : username ,
70- invite : invite . id ,
71- } ) ;
72- }
73-
74- const user = await prisma . user . create ( {
75- data : {
76- username,
77- password : await hashPassword ( password ) ,
78- role : 'USER' ,
79- token : createToken ( ) ,
48+
49+ if ( ! invite ) return res . badRequest ( 'Invalid invite code' ) ;
50+ if ( invite . expiresAt && new Date ( invite . expiresAt ) < new Date ( ) )
51+ return res . badRequest ( 'Invalid invite code' ) ;
52+ if ( invite . maxUses && invite . uses >= invite . maxUses ) return res . badRequest ( 'Invalid invite code' ) ;
53+
54+ await prisma . invite . update ( {
55+ where : {
56+ id : invite . id ,
8057 } ,
81- select : {
82- ...userSelect ,
83- password : true ,
84- token : true ,
58+ data : {
59+ uses : invite . uses + 1 ,
8560 } ,
8661 } ) ;
8762
88- await saveSession ( session , < User > user ) ;
89-
90- delete ( user as any ) . password ;
91-
92- logger . info ( 'user registered successfully' , {
93- username,
94- ip : req . ip ?? 'unknown' ,
95- ua : req . headers [ 'user-agent' ] ,
63+ logger . info ( 'invite used' , {
64+ user : username ,
65+ invite : invite . id ,
9666 } ) ;
67+ }
9768
98- return res . send ( {
99- user,
100- } ) ;
101- } ,
69+ const user = await prisma . user . create ( {
70+ data : {
71+ username,
72+ password : await hashPassword ( password ) ,
73+ role : 'USER' ,
74+ token : createToken ( ) ,
75+ } ,
76+ select : {
77+ ...userSelect ,
78+ password : true ,
79+ token : true ,
80+ } ,
81+ } ) ;
82+
83+ await saveSession ( session , < User > user ) ;
84+
85+ delete ( user as any ) . password ;
86+
87+ logger . info ( 'user registered successfully' , {
88+ username,
89+ ip : req . ip ?? 'unknown' ,
90+ ua : req . headers [ 'user-agent' ] ,
91+ } ) ;
92+
93+ return res . send ( {
94+ user,
95+ } ) ;
10296 } ) ;
10397
10498 done ( ) ;
0 commit comments