Skip to content

Commit 640ccfe

Browse files
committed
Make storage a function
Otherwise it fails at build time as the environment variables aren't available
1 parent ec830f3 commit 640ccfe

10 files changed

Lines changed: 36 additions & 30 deletions

File tree

app/api/(utils)/storage.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -249,16 +249,22 @@ export class S3Storage implements AppStorage {
249249
}
250250
}
251251

252-
export function createStorageFromEnv(localStorageEnvVar: string | undefined): AppStorage {
253-
try {
254-
return FileStorage.fromEnv("STORAGE_LOCAL_DIR");
255-
} catch {}
252+
let _storage: AppStorage | undefined;
256253

257-
try {
258-
return S3Storage.fromEnv();
259-
} catch {}
254+
export function storage(localStorageEnvVar: string = "STORAGE_LOCAL_DIR"): AppStorage {
255+
if (!_storage) {
256+
_storage = (() => {
257+
try {
258+
return FileStorage.fromEnv(localStorageEnvVar);
259+
} catch {}
260260

261-
throw new Error(`Must specify ${localStorageEnvVar} or AWS environment variables`);
262-
}
261+
try {
262+
return S3Storage.fromEnv();
263+
} catch {}
264+
265+
throw new Error(`Must specify ${localStorageEnvVar} or AWS environment variables`);
266+
})();
267+
}
263268

264-
export const storage: AppStorage = createStorageFromEnv("STORAGE_LOCAL_DIR");
269+
return _storage;
270+
}

app/api/account/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ export const verify = async (username: string, password: string): Promise<User |
1616

1717
// TODO: Get rid of this function?
1818
export const saveImage = async (username: string, file: string | Blob): Promise<void> => {
19-
storage.setImage("user", username, await saveImageFile(file));
19+
storage().setImage("user", username, await saveImageFile(file));
2020
};

app/api/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ const makePrismaClient = () => {
131131
compute(module) {
132132
return async (): Promise<string | undefined> => {
133133
if (!module.hasImage) return undefined;
134-
return storage.getImageUrl("module", module.name);
134+
return storage().getImageUrl("module", module.name);
135135
};
136136
},
137137
},

app/api/modules/[nameOrId]/image/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const GET = route(async (_req: NextRequest, { params }: SlugProps<"nameOr
88
if (!module) throw new NotFoundError("Module not found");
99

1010
if (module.hasImage) {
11-
return Response.redirect(storage.getImageUrl("module", module.name));
11+
return Response.redirect(storage().getImageUrl("module", module.name));
1212
}
1313

1414
return new Response(null, { status: 204 });

app/api/modules/[nameOrId]/releases/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export async function getScripts(
3232

3333
for (const release of releases) {
3434
if (release.id === releaseId) {
35-
const result = await storage.getReleaseFile("scripts", moduleName, release.id);
35+
const result = await storage().getReleaseFile("scripts", moduleName, release.id);
3636

3737
// Increment download counters
3838
await db.module.update({
@@ -78,6 +78,6 @@ export async function getMetadata(
7878

7979
for (const release of releases) {
8080
if (release.id === releaseId)
81-
return await storage.getReleaseFile("metadata", moduleName, release.id);
81+
return await storage().getReleaseFile("metadata", moduleName, release.id);
8282
}
8383
}

app/api/modules/[nameOrId]/releases/route.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ async function saveZipFile(
131131
metadata.version = release.release_version;
132132
metadata.tags = module.tags ? module.tags.split(",") : undefined;
133133
metadata.pictureLink = module.hasImage
134-
? await storage.getImageUrl("module", module.name)
134+
? await storage().getImageUrl("module", module.name)
135135
: undefined;
136136
metadata.creator = module.user.name;
137137
metadata.author = undefined;
@@ -145,17 +145,17 @@ async function saveZipFile(
145145

146146
try {
147147
// Save to storage folder
148-
await storage.setReleaseFile(
148+
await storage().setReleaseFile(
149149
"scripts",
150150
module.name,
151151
release.id,
152152
Buffer.from(await zip.generateAsync({ type: "arraybuffer" })),
153153
);
154154

155155
// Also save the metadata file separately for quick access
156-
await storage.setReleaseFile("metadata", module.name, release.id, Buffer.from(metadataStr));
156+
await storage().setReleaseFile("metadata", module.name, release.id, Buffer.from(metadataStr));
157157
} catch (e) {
158-
await storage.deleteRelease(module.name, release.id);
158+
await storage().deleteRelease(module.name, release.id);
159159
throw e;
160160
}
161161
}

app/api/modules/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ export const getTagsFromForm = (data: FormData): string[] => {
290290

291291
// TODO: Get rid of this function?
292292
export const saveImage = async (module: Module, file: string | Blob): Promise<void> => {
293-
await storage.setImage("module", module.name, await saveImageFile(file));
293+
await storage().setImage("module", module.name, await saveImageFile(file));
294294
};
295295

296296
export const findMatchingRelease = async (

app/api/users/[nameOrId]/image/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const GET = route(async (_req: NextRequest, { params }: SlugProps<"nameOr
1212
if (!user) return new Response("User not found", { status: 404 });
1313

1414
if (user.hasImage) {
15-
return Response.redirect(storage.getImageUrl("user", user.name));
15+
return Response.redirect(storage().getImageUrl("user", user.name));
1616
}
1717

1818
return new Response(null, { status: 204 });

prisma/scripts/migrate.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ for (const legacyUser of await legacyClient.users.findMany({})) {
4949
// Migrate image
5050
const image = await legacyStorage.getImage("user", legacyUser.name);
5151
if (image) {
52-
storage.setImage("user", legacyUser.name, sharp(image));
52+
storage().setImage("user", legacyUser.name, sharp(image));
5353
}
5454
}
5555

@@ -76,7 +76,7 @@ for (const legacyModule of legacyModules) {
7676

7777
const image = await legacyStorage.getImage("module", legacyModule.name);
7878
if (image) {
79-
storage.setImage("module", legacyModule.name, sharp(image));
79+
storage().setImage("module", legacyModule.name, sharp(image));
8080
}
8181

8282
const module = await client.module.create({
@@ -115,8 +115,8 @@ for (const legacyModule of legacyModules) {
115115
const scripts = await legacyStorage.getReleaseFile("scripts", legacyModule.name, uuid);
116116
const metadata = await legacyStorage.getReleaseFile("metadata", legacyModule.name, uuid);
117117

118-
await storage.setReleaseFile("scripts", module.name, release.id, scripts);
119-
await storage.setReleaseFile("metadata", module.name, release.id, metadata);
118+
await storage().setReleaseFile("scripts", module.name, release.id, scripts);
119+
await storage().setReleaseFile("metadata", module.name, release.id, metadata);
120120

121121
if (legacyRelease.verification_token !== null)
122122
bar.log(

prisma/scripts/seed.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ await db.module.deleteMany({});
3434
await db.user.deleteMany({});
3535

3636
console.log("Removing all storage");
37-
await storage.deleteEverything();
37+
await storage().deleteEverything();
3838

3939
function randomModuleName() {
4040
let name = "";
@@ -150,7 +150,7 @@ for (let i = 0; i < numUsers; i++) {
150150
console.log(`Creating user ${username}`);
151151
const image = await randomImage();
152152
if (image) {
153-
await storage.setImage("user", username, sharp(image));
153+
await storage().setImage("user", username, sharp(image));
154154
}
155155

156156
const user = await db.user.create({
@@ -183,7 +183,7 @@ for (let i = 0; i < numModules; i++) {
183183
console.log(`Creating module ${moduleName}`);
184184
const image = await randomImage();
185185
if (image) {
186-
await storage.setImage("module", moduleName, sharp(image));
186+
await storage().setImage("module", moduleName, sharp(image));
187187
}
188188

189189
const module = await db.module.create({
@@ -241,8 +241,8 @@ for (let i = 0; i < numReleases; i++) {
241241
});
242242

243243
const { scripts, metadata } = await randomScripts(module, release, module.user);
244-
await storage.setReleaseFile("scripts", module.name, release.id, scripts);
245-
await storage.setReleaseFile("metadata", module.name, release.id, metadata);
244+
await storage().setReleaseFile("scripts", module.name, release.id, scripts);
245+
await storage().setReleaseFile("metadata", module.name, release.id, metadata);
246246

247247
await db.module.update({
248248
where: {

0 commit comments

Comments
 (0)