1- import { addHours } from 'date-fns' ;
21import {
32 CreateS3DownloadAccessUrlParamsSchema ,
43 S3ProxyDownloadPayloadSchema ,
54 type S3ProxyDownloadPayload
65} from '../type' ;
7- import {
8- assertS3DownloadAliasSignature ,
9- buildS3DownloadAliasKey ,
10- buildS3DownloadUrl ,
11- encodeExpiresAtMinute ,
12- generateS3AliasId ,
13- resolveDownloadExpiresAt ,
14- signS3DownloadAlias
15- } from '../utils' ;
16- import { S3AccessLinkErrCode , S3AccessLinkError } from '../error' ;
17- import { S3_ACCESS_LINK_PURGE_GRACE_HOURS } from '../constants' ;
18- import {
19- createS3DownloadAlias ,
20- disableS3DownloadAliasByAliasId ,
21- findS3DownloadAliasByAliasId ,
22- findS3DownloadAliasByAliasKey ,
23- touchS3DownloadAliasPurgeAt
24- } from './entity' ;
6+ import { s3AccessLinkService } from '../accessLinkService' ;
257
268/**
279 * 创建或复用下载 alias,并返回带过期时间与 HMAC 签名的短 URL。
@@ -31,42 +13,7 @@ import {
3113 */
3214export const createS3DownloadAccessUrl = async ( params : unknown ) => {
3315 const parsed = CreateS3DownloadAccessUrlParamsSchema . parse ( params ) ;
34- const now = new Date ( ) ;
35- const expiresAt = resolveDownloadExpiresAt ( parsed . expiredTime , now ) ;
36- const expMinute36 = encodeExpiresAtMinute ( expiresAt ) ;
37- const purgeAt = addHours ( expiresAt , S3_ACCESS_LINK_PURGE_GRACE_HOURS ) ;
38- const aliasKey = buildS3DownloadAliasKey ( parsed ) ;
39-
40- const existingAlias = await findS3DownloadAliasByAliasKey ( aliasKey ) ;
41- const alias =
42- existingAlias ??
43- ( await createS3DownloadAlias ( {
44- aliasId : generateS3AliasId ( ) ,
45- aliasKey,
46- bucketName : parsed . bucketName ,
47- objectKey : parsed . objectKey ,
48- filename : parsed . filename ,
49- responseContentType : parsed . responseContentType ,
50- lastIssuedAt : now ,
51- purgeAt
52- } ) ) ;
53-
54- if ( ! alias ) {
55- throw new S3AccessLinkError ( S3AccessLinkErrCode . downloadAliasNotFound ) ;
56- }
57-
58- await touchS3DownloadAliasPurgeAt ( {
59- aliasKey,
60- purgeAt,
61- now
62- } ) ;
63-
64- const sig = signS3DownloadAlias ( {
65- aliasId : alias . aliasId ,
66- expMinute36
67- } ) ;
68-
69- return buildS3DownloadUrl ( `${ alias . aliasId } .${ expMinute36 } .${ sig } ` ) ;
16+ return s3AccessLinkService . createDownloadUrl ( parsed ) ;
7017} ;
7118
7219/**
@@ -78,25 +25,11 @@ export const createS3DownloadAccessUrl = async (params: unknown) => {
7825export const verifyS3DownloadAccess = async (
7926 signedAlias : string
8027) : Promise < S3ProxyDownloadPayload > => {
81- const { aliasId } = assertS3DownloadAliasSignature ( signedAlias ) ;
82- const alias = await findS3DownloadAliasByAliasId ( aliasId ) ;
83-
84- if ( ! alias ) {
85- throw new S3AccessLinkError ( S3AccessLinkErrCode . downloadAliasNotFound ) ;
86- }
87-
88- if ( alias . disabledAt ) {
89- throw new S3AccessLinkError ( S3AccessLinkErrCode . downloadAliasRevoked ) ;
90- }
91-
92- return S3ProxyDownloadPayloadSchema . parse ( {
93- bucketName : alias . bucketName ,
94- objectKey : alias . objectKey ,
95- filename : alias . filename ,
96- responseContentType : alias . responseContentType
97- } ) ;
28+ return S3ProxyDownloadPayloadSchema . parse (
29+ await s3AccessLinkService . verifyDownloadAlias ( signedAlias )
30+ ) ;
9831} ;
9932
10033export const revokeS3DownloadAlias = ( aliasId : string ) => {
101- return disableS3DownloadAliasByAliasId ( aliasId ) ;
34+ return s3AccessLinkService . revokeDownloadAlias ( aliasId ) ;
10235} ;
0 commit comments