chore: debug
All checks were successful
/ build (map[dockerfile:./services/api/Dockerfile name:api]) (push) Successful in 2m23s
/ build (map[dockerfile:./services/tasks/Dockerfile name:tasks]) (push) Successful in 2m9s
/ build (map[dockerfile:./services/hasura/Dockerfile name:hasura]) (push) Successful in 2m21s
/ build (map[dockerfile:./services/watchers/Dockerfile name:watchers]) (push) Successful in 2m11s
/ build (map[dockerfile:./services/web/Dockerfile name:web]) (push) Successful in 2m8s
/ deploy (push) Successful in 33s
/ build (map[dockerfile:./services/files/Dockerfile name:files]) (push) Successful in 1m18s
/ build (map[dockerfile:./services/app/Dockerfile name:app]) (push) Successful in 1m38s

This commit is contained in:
devthejo 2025-07-02 12:50:23 +02:00
parent e284f59476
commit 6d308bf95d

View file

@ -13,8 +13,15 @@ module.exports = async function ({ services: { signJwt } }) {
} }
async function doAuthLoginConfimLoginRequest(req) { async function doAuthLoginConfimLoginRequest(req) {
const logger = ctx.require("logger")
const { loginRequestId, deviceUuid } = req.body const { loginRequestId, deviceUuid } = req.body
logger.debug(
{ loginRequestId, deviceUuid },
"Starting login confirmation request"
)
const [userLoginRequest] = await sql` const [userLoginRequest] = await sql`
SELECT SELECT
"user_id" as "userId", "user_id" as "userId",
@ -27,22 +34,46 @@ module.exports = async function ({ services: { signJwt } }) {
WHERE WHERE
"id" = ${loginRequestId} "id" = ${loginRequestId}
` `
if (!userLoginRequest) { if (!userLoginRequest) {
logger.warn({ loginRequestId }, "Login request not found")
throw httpError(404) throw httpError(404)
} }
logger.info(
{ loginRequestId, type: userLoginRequest.type },
"Login request found"
)
const { type, updatedAt } = userLoginRequest const { type, updatedAt } = userLoginRequest
const expire = new Date() const expire = new Date()
expire.setTime(expire.getTime() - 2 * 3600000) // 2 hours expire.setTime(expire.getTime() - 2 * 3600000) // 2 hours
logger.debug(
{ loginRequestId, updatedAt, expireThreshold: expire },
"Checking login request expiration"
)
if (updatedAt < expire) { if (updatedAt < expire) {
logger.warn(
{ loginRequestId, updatedAt, expireThreshold: expire },
"Login request expired, cleaning up"
)
deleteLoginRequest(loginRequestId) // cleanup in background deleteLoginRequest(loginRequestId) // cleanup in background
throw httpError(498, "login request expired") throw httpError(498, "login request expired")
} }
logger.info({ loginRequestId }, "Login request is valid and not expired")
let userId let userId
logger.info({ loginRequestId, type }, "Resolving user ID by login type")
switch (type) { switch (type) {
case "phone_number": { case "phone_number": {
logger.debug(
{ loginRequestId, phoneNumberId: userLoginRequest.phoneNumberId },
"Looking up user by phone number"
)
const [phoneNumber] = await sql` const [phoneNumber] = await sql`
SELECT SELECT
"user_id" as "userId" "user_id" as "userId"
@ -51,10 +82,29 @@ module.exports = async function ({ services: { signJwt } }) {
WHERE WHERE
"id" = ${userLoginRequest.phoneNumberId} "id" = ${userLoginRequest.phoneNumberId}
` `
if (!phoneNumber) {
logger.error(
{ loginRequestId, phoneNumberId: userLoginRequest.phoneNumberId },
"Phone number not found"
)
throw httpError(404, "Phone number not found")
}
userId = phoneNumber.userId userId = phoneNumber.userId
logger.debug(
{
loginRequestId,
userId,
phoneNumberId: userLoginRequest.phoneNumberId,
},
"User resolved via phone number"
)
break break
} }
case "email": { case "email": {
logger.debug(
{ loginRequestId, emailId: userLoginRequest.emailId },
"Looking up user by email"
)
const [email] = await sql` const [email] = await sql`
SELECT SELECT
"user_id" as "userId" "user_id" as "userId"
@ -63,18 +113,35 @@ module.exports = async function ({ services: { signJwt } }) {
WHERE WHERE
"id" = ${userLoginRequest.emailId} "id" = ${userLoginRequest.emailId}
` `
if (!email) {
logger.error(
{ loginRequestId, emailId: userLoginRequest.emailId },
"Email not found"
)
throw httpError(404, "Email not found")
}
userId = email.userId userId = email.userId
logger.debug(
{ loginRequestId, userId, emailId: userLoginRequest.emailId },
"User resolved via email"
)
break break
} }
default: { default: {
logger.error({ loginRequestId, type }, "Invalid login request type")
throw httpError(400) throw httpError(400)
} }
} }
logger.info({ loginRequestId }, "Cleaning up login request")
deleteLoginRequest(loginRequestId) // cleanup in background deleteLoginRequest(loginRequestId) // cleanup in background
let deviceId = null let deviceId = null
if (deviceUuid) { if (deviceUuid) {
logger.debug(
{ loginRequestId, userId, deviceUuid },
"Looking up device for user"
)
const [matchDevice] = await sql` const [matchDevice] = await sql`
SELECT SELECT
"id" "id"
@ -87,10 +154,23 @@ module.exports = async function ({ services: { signJwt } }) {
if (matchDevice) { if (matchDevice) {
deviceId = matchDevice.id deviceId = matchDevice.id
logger.debug(
{ loginRequestId, userId, deviceUuid, deviceId },
"Device matched for user"
)
} else {
logger.debug(
{ loginRequestId, userId, deviceUuid },
"No matching device found for user"
)
} }
} else {
logger.debug({ loginRequestId, userId }, "No device UUID provided")
} }
logger.debug({ loginRequestId, userId, deviceId }, "Generating auth token")
const plainAuthToken = nanoid() const plainAuthToken = nanoid()
await sql` await sql`
INSERT INTO "auth_token" ("auth_token", "user_id", "device_id") INSERT INTO "auth_token" ("auth_token", "user_id", "device_id")
VALUES (${plainAuthToken}, ${userId}, ${deviceId}) VALUES (${plainAuthToken}, ${userId}, ${deviceId})
@ -99,8 +179,18 @@ module.exports = async function ({ services: { signJwt } }) {
"auth_token" = ${plainAuthToken}, "user_id" = ${userId} "auth_token" = ${plainAuthToken}, "user_id" = ${userId}
` `
logger.debug(
{ loginRequestId, userId, deviceId },
"Auth token stored in database"
)
const authTokenJwt = await signJwt({ authToken: plainAuthToken }) const authTokenJwt = await signJwt({ authToken: plainAuthToken })
logger.debug(
{ loginRequestId, userId, deviceId },
"Login confirmation completed successfully"
)
return { authTokenJwt } return { authTokenJwt }
} }