1+ import {
2+ ERROR_WHILE_CREATING_REQUEST ,
3+ LOG_ACTION ,
4+ REQUEST_ALREADY_PENDING ,
5+ REQUEST_LOG_TYPE ,
6+ REQUEST_STATE ,
7+ REQUEST_TYPE ,
8+ } from "../constants/requests" ;
9+ import { userState } from "../constants/userStatus" ;
10+ import { addLog } from "../models/logs" ;
11+ import { createRequest , getRequestByKeyValues } from "../models/requests" ;
12+ import { fetchUser } from "../models/users" ;
13+ import { getUserStatus } from "../models/userStatus" ;
14+ import { User } from "../typeDefinitions/users" ;
15+ import { OnboardingExtension , OnboardingExtensionCreateRequest , OnboardingExtensionResponse } from "../types/onboardingExtension" ;
16+
17+ export const createOnboardingExtensionRequestController = async ( req : OnboardingExtensionCreateRequest , res : OnboardingExtensionResponse ) => {
18+ try {
19+
20+ const data = req . body ;
21+ const { user, userExists} = await fetchUser ( { discordId : data . userId } ) ;
22+
23+ if ( ! userExists ) {
24+ return res . boom . notFound ( "User not found" ) ;
25+ }
26+
27+ const { id : userId , discordId : userDiscordId , discordJoinedAt, username} = user as User ;
28+ const { data : userStatus } = await getUserStatus ( userId ) ;
29+
30+ if ( ! userStatus || userStatus . currentStatus . state != userState . ONBOARDING ) {
31+ return res . boom . badRequest ( "User does not have onboarding status" ) ;
32+ }
33+
34+ const requestedUserResponse = await fetchUser ( { discordId : data . requestedBy } ) ;
35+
36+ if ( ! requestedUserResponse . userExists ) {
37+ return res . boom . notFound ( "User not found" ) ;
38+ }
39+
40+ const { roles, discordId : requestedUserDiscordId } = requestedUserResponse . user as User ;
41+
42+ if ( ! ( roles ?. super_user || ( requestedUserDiscordId === userDiscordId ) ) ) {
43+ return res . boom . unauthorized ( "Only super user and onboarding user are authorized to create an onboarding extension request" ) ;
44+ }
45+
46+ const latestExtensionRequest : OnboardingExtension = await getRequestByKeyValues ( {
47+ userId : userId ,
48+ type : REQUEST_TYPE . ONBOARDING
49+ } ) ;
50+
51+ if ( latestExtensionRequest && latestExtensionRequest . state === REQUEST_STATE . PENDING ) {
52+ return res . boom . badRequest ( REQUEST_ALREADY_PENDING ) ;
53+ }
54+
55+ const thirtyOneDaysInMillisecond = 31 * 24 * 60 * 60 * 1000 ;
56+ const discordJoinedDateInMillisecond = new Date ( discordJoinedAt ) . getTime ( ) ;
57+ const numberOfDaysInMillisecond = Math . floor ( data . numberOfDays ) * 24 * 60 * 60 * 1000 ;
58+
59+ let requestNumber : number ;
60+ let oldEndsOn : number ;
61+ let newEndsOn : number ;
62+
63+ if ( ! latestExtensionRequest ) {
64+ requestNumber = 1 ;
65+ oldEndsOn = discordJoinedDateInMillisecond + thirtyOneDaysInMillisecond ;
66+ } else if ( latestExtensionRequest . state === REQUEST_STATE . REJECTED ) {
67+ requestNumber = latestExtensionRequest . requestNumber + 1 ;
68+ oldEndsOn = latestExtensionRequest . oldEndsOn ;
69+ } else {
70+ requestNumber = latestExtensionRequest . requestNumber + 1 ;
71+ oldEndsOn = latestExtensionRequest . newEndsOn ;
72+ }
73+
74+ newEndsOn = oldEndsOn + numberOfDaysInMillisecond ;
75+
76+ const onboardingExtension = await createRequest ( {
77+ type : REQUEST_TYPE . ONBOARDING ,
78+ state : REQUEST_STATE . PENDING ,
79+ userId : userId ,
80+ requestedBy : username ,
81+ oldEndsOn : oldEndsOn ,
82+ newEndsOn : newEndsOn ,
83+ reason : data . reason ,
84+ requestNumber : requestNumber ,
85+ } ) ;
86+
87+ const onboardingExtensionLog = {
88+ type : REQUEST_LOG_TYPE . REQUEST_CREATED ,
89+ meta : {
90+ requestId : onboardingExtension . id ,
91+ action : LOG_ACTION . CREATE ,
92+ userId : userId ,
93+ createdAt : Date . now ( ) ,
94+ } ,
95+ body : onboardingExtension ,
96+ } ;
97+
98+ await addLog ( onboardingExtensionLog . type , onboardingExtensionLog . meta , onboardingExtensionLog . body ) ;
99+
100+ return res . status ( 201 ) . json ( {
101+ message : "Onboarding extension request created successfully!" ,
102+ data : {
103+ id : onboardingExtension . id ,
104+ ...onboardingExtension ,
105+ }
106+ } ) ;
107+ } catch ( err ) {
108+ logger . error ( ERROR_WHILE_CREATING_REQUEST , err ) ;
109+ return res . boom . badImplementation ( ERROR_WHILE_CREATING_REQUEST ) ;
110+ }
111+ } ;
0 commit comments