43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
import { runtimeConfig } from '../../config/runtime.js'
|
|
import { createClaimToken } from '../../repositories/claim-token-repo.js'
|
|
import { createHttpError } from '../../utils/http.js'
|
|
import { addHours, nowIso } from '../../utils/time.js'
|
|
import { randomToken } from '../../utils/random.js'
|
|
|
|
type TaskClaimToken = NonNullable<Awaited<ReturnType<typeof createClaimToken>>> & {
|
|
claimUrl: string
|
|
}
|
|
|
|
export async function createTaskClaimToken(taskId: number | string): Promise<TaskClaimToken> {
|
|
const createdAt = nowIso()
|
|
const expiredAt = addHours(createdAt, Number(runtimeConfig.orders.tokenTtlHours || 24))
|
|
const token = await createClaimToken({
|
|
taskId: Number(taskId),
|
|
token: randomToken(24),
|
|
status: 'active',
|
|
expiredAt,
|
|
usedAt: null,
|
|
maxUseCount: 1,
|
|
usedCount: 0,
|
|
createdAt,
|
|
updatedAt: createdAt,
|
|
})
|
|
|
|
if (!token) {
|
|
throw createHttpError('领取 token 创建失败', {
|
|
statusCode: 500,
|
|
errorCode: 'claim_token_create_failed',
|
|
})
|
|
}
|
|
|
|
return {
|
|
...token,
|
|
claimUrl: buildClaimUrl(token.token),
|
|
}
|
|
}
|
|
|
|
export function buildClaimUrl(token: string): string {
|
|
const baseUrl = String(runtimeConfig.orders.claimBaseUrl || '').trim()
|
|
return baseUrl ? `${baseUrl.replace(/\/+$/, '')}/${token}` : token
|
|
}
|