📦 EqualifyEverything / equalify

📄 createUser.ts · 49 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49import { cognito, db, event } from '#src/utils'
import { randomUUID } from 'crypto'

export const createUser = async () => {
    const { name, email, password } = event.body;
    try {
        const username = randomUUID();
        const { User } = await cognito.adminCreateUser({
            UserPoolId: process.env.USER_POOL_ID,
            Username: username,
            MessageAction: 'SUPPRESS',
            UserAttributes: [
                { Name: 'email', Value: email },
                { Name: 'email_verified', Value: 'true' },
                { Name: 'name', Value: name },
                { Name: 'website', Value: 'api-flow' },
            ],
        });
        await cognito.adminSetUserPassword({
            UserPoolId: process.env.USER_POOL_ID,
            Username: email,
            Permanent: true,
            Password: password,
        });
        const sub = User.Attributes.find(obj => obj.Name === 'sub')?.Value;
        await db.connect();
        await db.query({
            text: `INSERT INTO "users" ("id", "email", "name") VALUES ($1, $2, $3) ON CONFLICT DO NOTHING`,
            values: [sub, email, name ?? 'User'],
        });
        await db.clean();

        const authResponse = await cognito.adminInitiateAuth({
            UserPoolId: process.env.USER_POOL_ID,
            ClientId: process.env.WEB_CLIENT_ID,
            AuthFlow: 'ADMIN_USER_PASSWORD_AUTH',
            AuthParameters: {
                USERNAME: email,
                PASSWORD: password,
            },
        });
        const accessToken = authResponse.AuthenticationResult.IdToken;

        return { accessToken };
    }
    catch (err) {
        return { message: err }
    }
}