Skip to content

Commit 89d8278

Browse files
author
Rajat Saxena
committed
Renamed env vars
1 parent 821756a commit 89d8278

13 files changed

Lines changed: 112 additions & 78 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ If you need to use a Cloudfront CDN, you can enable it in the app, by setting up
2424

2525
```sh
2626
USE_CLOUDFRONT=true
27-
CLOUDFRONT_ENDPOINT=CLOUDFRONT_DISTRIBUTION_NAME
27+
CDN_ENDPOINT=CLOUDFRONT_DISTRIBUTION_NAME
2828
CLOUDFRONT_PRIVATE_KEY="PRIVATE_KEY"
2929
CLOUDFRONT_KEY_PAIR_ID=KEY_PAIR_ID
3030
```

apps/api/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
"eslint": "^8.12.0",
6565
"nodemon": "^3.1.10",
6666
"ts-node": "^10.9.2",
67+
"tsconfig-paths": "^4.2.0",
6768
"tsx": "^4.20.6",
6869
"typescript": "^5.9.3"
6970
}

apps/api/src/config/constants.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,25 +45,25 @@ export const mailFrom = process.env.EMAIL_FROM;
4545
export const mailPort = parseInt(process.env.EMAIL_PORT || "") || 587;
4646

4747
// AWS S3 config
48-
export const cloudEndpoint = process.env.CLOUD_ENDPOINT || "";
48+
export const CLOUD_ENDPOINT = process.env.CLOUD_ENDPOINT || "";
4949
export const cloudRegion = process.env.CLOUD_REGION || "";
5050
export const cloudKey = process.env.CLOUD_KEY || "";
5151
export const cloudSecret = process.env.CLOUD_SECRET || "";
5252
export const cloudBucket = process.env.CLOUD_BUCKET_NAME || "";
53-
export const CLOUD_PREFIX = process.env.CLOUD_PREFIX || "";
54-
export const PUBLIC_ENDPOINT = process.env.PUBLIC_ENDPOINT || "";
53+
export const PATH_PREFIX = process.env.PATH_PREFIX || "";
5554
export const HOUR_IN_SECONDS = 1000 * 60 * 60;
5655

5756
// Cloudfront config
5857
export const USE_CLOUDFRONT = process.env.USE_CLOUDFRONT === "true";
59-
export const CLOUDFRONT_ENDPOINT = process.env.CLOUDFRONT_ENDPOINT || "";
6058
export const CLOUDFRONT_KEY_PAIR_ID = process.env.CLOUDFRONT_KEY_PAIR_ID || "";
6159
export const CLOUDFRONT_PRIVATE_KEY = process.env.CLOUDFRONT_PRIVATE_KEY || "";
6260
export const CDN_MAX_AGE = process.env.CDN_MAX_AGE
6361
? +process.env.CDN_MAX_AGE
6462
: HOUR_IN_SECONDS; // one hour
6563

66-
export const ENDPOINT = USE_CLOUDFRONT ? CLOUDFRONT_ENDPOINT : PUBLIC_ENDPOINT;
64+
// CDN config
65+
export const CDN_ENDPOINT = process.env.CDN_ENDPOINT || "";
66+
6767
export const TEMP_MEDIA_EXPIRATION_HOURS = process.env
6868
.TEMP_MEDIA_EXPIRATION_HOURS
6969
? +process.env.TEMP_MEDIA_EXPIRATION_HOURS

apps/api/src/index.ts

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,27 +55,46 @@ if (process.env.EMAIL) {
5555
createAdminUser();
5656
}
5757

58-
checkDependencies().then(() => {
59-
app.listen(port, () => {
60-
logger.info(`Medialit server running at ${port}`);
58+
checkConfig()
59+
.then(checkDependencies)
60+
.then(() => {
61+
app.listen(port, () => {
62+
logger.info(`Medialit server running at ${port}`);
63+
});
64+
65+
// Setup background cleanup job for expired tus uploads
66+
setInterval(
67+
async () => {
68+
await cleanupTUSUploads();
69+
},
70+
HOUR_IN_SECONDS, // 1 hour
71+
);
72+
73+
// Setup background cleanup job for expired temp uploads
74+
setInterval(
75+
async () => {
76+
await cleanupExpiredTempUploads();
77+
},
78+
HOUR_IN_SECONDS, // 1 hour
79+
);
6180
});
6281

63-
// Setup background cleanup job for expired tus uploads
64-
setInterval(
65-
async () => {
66-
await cleanupTUSUploads();
67-
},
68-
HOUR_IN_SECONDS, // 1 hour
69-
);
70-
71-
// Setup background cleanup job for expired temp uploads
72-
setInterval(
73-
async () => {
74-
await cleanupExpiredTempUploads();
75-
},
76-
HOUR_IN_SECONDS, // 1 hour
77-
);
78-
});
82+
async function checkConfig() {
83+
if (!process.env.DB_CONNECTION_STRING) {
84+
throw new Error("DB_CONNECTION_STRING is not set");
85+
}
86+
if (!process.env.CLOUD_KEY || !process.env.CLOUD_SECRET) {
87+
throw new Error(
88+
"Cloud credentials (CLOUD_KEY and CLOUD_SECRET) are not set",
89+
);
90+
}
91+
if (!process.env.CLOUD_BUCKET_NAME) {
92+
throw new Error("Cloud bucket name (CLOUD_BUCKET_NAME) is not set");
93+
}
94+
if (!process.env.CLOUD_ENDPOINT && !process.env.CDN_ENDPOINT) {
95+
throw new Error("Either CLOUD_ENDPOINT or CDN_ENDPOINT must be set");
96+
}
97+
}
7998

8099
async function checkDependencies() {
81100
try {

apps/api/src/media/cleanup.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logger from "../services/log";
22
import MediaModel from "./model";
33
import { deleteFolder } from "../services/s3";
4-
import { CLOUD_PREFIX, TEMP_MEDIA_EXPIRATION_HOURS } from "../config/constants";
4+
import { PATH_PREFIX, TEMP_MEDIA_EXPIRATION_HOURS } from "../config/constants";
55

66
export async function cleanupExpiredTempUploads(): Promise<void> {
77
const cutoff = new Date(
@@ -28,7 +28,7 @@ export async function cleanupExpiredTempUploads(): Promise<void> {
2828
for (const media of expired) {
2929
try {
3030
// Delete S3 objects in tmp folder
31-
const tmpPrefix = `${CLOUD_PREFIX ? `${CLOUD_PREFIX}/` : ""}tmp/${media.mediaId}/`;
31+
const tmpPrefix = `${PATH_PREFIX ? `${PATH_PREFIX}/` : ""}tmp/${media.mediaId}/`;
3232
await deleteFolder(tmpPrefix);
3333

3434
// Delete media record

apps/api/src/media/service.ts

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import {
77
videoPattern,
88
imagePatternForThumbnailGeneration,
99
USE_CLOUDFRONT,
10-
CLOUD_PREFIX,
10+
PATH_PREFIX,
11+
DISABLE_TAGGING,
1112
} from "../config/constants";
1213
import imageUtils from "@medialit/images";
1314
import {
@@ -17,7 +18,7 @@ import {
1718
} from "./utils/manage-files-on-disk";
1819
import {
1920
generateSignedUrl,
20-
generateCDNSignedUrl,
21+
generateCloudfrontSignedUrl,
2122
putObject,
2223
deleteObject,
2324
copyObject,
@@ -298,7 +299,7 @@ async function getPrivateFileUrl(media: MediaWithUserId, thumb?: boolean) {
298299
});
299300

300301
return USE_CLOUDFRONT
301-
? generateCDNSignedUrl(key)
302+
? generateCloudfrontSignedUrl(key)
302303
: await generateSignedUrl(key);
303304
}
304305

@@ -369,15 +370,17 @@ async function sealMedia({
369370
filename: `main.${fileExtension}`,
370371
});
371372
let tags: string | undefined;
372-
try {
373-
const taggingResponse = await getObjectTagging({ Key: tmpMainKey });
374-
if (taggingResponse.TagSet && taggingResponse.TagSet.length > 0) {
375-
tags = taggingResponse.TagSet.map(
376-
(tag: any) => `${tag.Key}=${tag.Value}`,
377-
).join("&");
373+
if (!DISABLE_TAGGING) {
374+
try {
375+
const taggingResponse = await getObjectTagging({ Key: tmpMainKey });
376+
if (taggingResponse.TagSet && taggingResponse.TagSet.length > 0) {
377+
tags = taggingResponse.TagSet.map(
378+
(tag: any) => `${tag.Key}=${tag.Value}`,
379+
).join("&");
380+
}
381+
} catch (err: any) {
382+
logger.warn({ err }, "Failed to get tags from source object");
378383
}
379-
} catch (err: any) {
380-
logger.warn({ err }, "Failed to get tags from source object");
381384
}
382385

383386
// Copy main file from tmp to final location
@@ -416,7 +419,7 @@ async function sealMedia({
416419
}
417420

418421
// Delete tmp folder
419-
const tmpPrefix = `${CLOUD_PREFIX ? `${CLOUD_PREFIX}/` : ""}tmp/${mediaId}/`;
422+
const tmpPrefix = `${PATH_PREFIX ? `${PATH_PREFIX}/` : ""}tmp/${mediaId}/`;
420423
await deleteFolder(tmpPrefix);
421424

422425
// Update media record to remove temp flag

apps/api/src/media/utils/generate-key.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { CLOUD_PREFIX } from "../../config/constants";
1+
import { PATH_PREFIX } from "../../config/constants";
22

33
export default function generateKey({
44
mediaId,
@@ -10,6 +10,6 @@ export default function generateKey({
1010
filename: string;
1111
}): string {
1212
return `${
13-
CLOUD_PREFIX ? `${CLOUD_PREFIX}/` : ""
13+
PATH_PREFIX ? `${PATH_PREFIX}/` : ""
1414
}${path}/${mediaId}/${filename}`;
1515
}

apps/api/src/media/utils/get-public-urls.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import path from "path";
2-
import { ENDPOINT, CLOUD_PREFIX } from "../../config/constants";
2+
import { CDN_ENDPOINT, CLOUD_ENDPOINT, PATH_PREFIX } from "@/config/constants";
33
import { Media } from "@medialit/models";
44

5-
const prefix = CLOUD_PREFIX ? `${CLOUD_PREFIX}/` : "";
5+
export const ENDPOINT = CDN_ENDPOINT || CLOUD_ENDPOINT;
6+
const prefix = PATH_PREFIX ? `${PATH_PREFIX}/` : "";
67

78
export function getMainFileUrl(media: Media) {
89
return `${ENDPOINT}/${prefix}public/${media.mediaId}/main${path.extname(

apps/api/src/services/s3.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ import {
1010
ListObjectsV2Command,
1111
} from "@aws-sdk/client-s3";
1212
import {
13-
cloudEndpoint,
13+
CLOUD_ENDPOINT,
1414
cloudKey,
1515
cloudSecret,
1616
cloudBucket,
1717
cloudRegion,
1818
CLOUDFRONT_KEY_PAIR_ID,
1919
CLOUDFRONT_PRIVATE_KEY,
2020
CDN_MAX_AGE,
21-
CLOUDFRONT_ENDPOINT,
21+
CDN_ENDPOINT,
2222
DISABLE_TAGGING,
2323
} from "../config/constants";
2424
import { getSignedUrl as getCfSignedUrl } from "@aws-sdk/cloudfront-signer";
@@ -55,8 +55,8 @@ export const s3ClientConfig: any = {
5555
},
5656
};
5757

58-
if (cloudEndpoint) {
59-
s3ClientConfig.endpoint = cloudEndpoint;
58+
if (CLOUD_ENDPOINT) {
59+
s3ClientConfig.endpoint = CLOUD_ENDPOINT;
6060
s3ClientConfig.forcePathStyle = true;
6161
}
6262

@@ -103,17 +103,13 @@ export const generateSignedUrl = async (key: string): Promise<string> => {
103103
return url;
104104
};
105105

106-
export const generateCDNSignedUrl = (key: string): string => {
107-
if (
108-
!CLOUDFRONT_ENDPOINT ||
109-
!CLOUDFRONT_KEY_PAIR_ID ||
110-
!CLOUDFRONT_PRIVATE_KEY
111-
) {
106+
export const generateCloudfrontSignedUrl = (key: string): string => {
107+
if (!CDN_ENDPOINT || !CLOUDFRONT_KEY_PAIR_ID || !CLOUDFRONT_PRIVATE_KEY) {
112108
throw new Error("CDN configuration is missing");
113109
}
114110

115111
const url = getCfSignedUrl({
116-
url: `${CLOUDFRONT_ENDPOINT}/${key}`,
112+
url: `${CDN_ENDPOINT}/${key}`,
117113
keyPairId: CLOUDFRONT_KEY_PAIR_ID,
118114
privateKey: CLOUDFRONT_PRIVATE_KEY,
119115
dateLessThan: new Date(Date.now() + CDN_MAX_AGE).toISOString(),

apps/api/src/tus/finalize.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
imagePattern,
1313
imagePatternForThumbnailGeneration,
1414
videoPattern,
15-
USE_CLOUDFRONT,
1615
} from "../config/constants";
1716
import imageUtils from "@medialit/images";
1817
import {

0 commit comments

Comments
 (0)