Skip to content

Commit 7088794

Browse files
author
Rajat
committed
feat: Standardize API error responses to { error: message } and refine sealMedia behavior with specific status codes.
1 parent acb7186 commit 7088794

6 files changed

Lines changed: 30 additions & 27 deletions

File tree

.migrations/0005-migrate-to-dual-bucket-architecture.js renamed to .migrations/00005-migrate-to-dual-bucket-architecture.js

File renamed without changes.

apps/api/src/media/handlers.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export async function uploadMedia(
7575
return res.status(200).json(media);
7676
} catch (err: any) {
7777
logger.error({ err }, err.message);
78-
res.status(500).json({ error: err.message });
78+
return res.status(500).json({ error: err.message });
7979
}
8080
}
8181

@@ -111,7 +111,7 @@ export async function getMedia(
111111
return res.status(200).json(result);
112112
} catch (err: any) {
113113
logger.error({ err }, err.message);
114-
return res.status(500).json(err.message);
114+
return res.status(500).json({ error: err.message });
115115
}
116116
}
117117

@@ -123,7 +123,7 @@ export async function getMediaCount(req: any, res: any) {
123123
const totalMediaFiles = await getCount({ userId, apikey });
124124
return res.status(200).json({ count: totalMediaFiles });
125125
} catch (err: any) {
126-
return res.status(500).json(err.message);
126+
return res.status(500).json({ error: err.message });
127127
}
128128
}
129129

@@ -140,7 +140,7 @@ export async function getTotalSpaceOccupied(req: any, res: any) {
140140
: maxStorageAllowedNotSubscribed,
141141
});
142142
} catch (err: any) {
143-
return res.status(500).json(err.message);
143+
return res.status(500).json({ error: err.message });
144144
}
145145
}
146146

@@ -160,7 +160,7 @@ export async function getMediaDetails(req: any, res: any) {
160160
return res.status(200).json(media);
161161
} catch (err: any) {
162162
logger.error({ err }, err.message);
163-
return res.status(500).json(err.message);
163+
return res.status(500).json({ error: err.message });
164164
}
165165
}
166166

@@ -177,7 +177,7 @@ export async function deleteMedia(req: any, res: any) {
177177
return res.status(200).json({ message: SUCCESS });
178178
} catch (err: any) {
179179
logger.error({ err }, err.message);
180-
return res.status(500).json(err.message);
180+
return res.status(500).json({ error: err.message });
181181
}
182182
}
183183

@@ -199,12 +199,15 @@ export async function sealMedia(req: any, res: any) {
199199

200200
return res.status(200).json(mediaDetails);
201201
} catch (err: any) {
202-
logger.error({ err }, err.message);
203202
const statusCode =
204-
err.message === "Media not found" ||
205-
err.message === "Media is already sealed"
203+
err.message === "Media not found"
206204
? 404
207-
: 500;
205+
: err.message === "Media is already sealed"
206+
? 409
207+
: 500;
208+
if (statusCode === 500) {
209+
logger.error({ err }, err.message);
210+
}
208211
return res.status(statusCode).json({ error: err.message });
209212
}
210213
}

apps/api/src/media/service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ async function sealMedia({
372372
}
373373

374374
if (!media.temp) {
375-
throw new Error("Media is already sealed");
375+
return media;
376376
}
377377

378378
const fileExtension = path.extname(media.fileName).replace(".", "");

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
CLOUD_ENDPOINT,
55
PATH_PREFIX,
66
CLOUD_ENDPOINT_PUBLIC,
7-
} from "@/config/constants";
7+
} from "../../config/constants";
88
import { Constants, Media } from "@medialit/models";
99

1010
const prefix = PATH_PREFIX ? `${PATH_PREFIX}/` : "";

docs/prds/dual-bucket-architecture.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ s3://public-bucket/
105105
- `CLOUD_REGION` - Region (if applicable)
106106
- `CLOUD_KEY` - Access key ID
107107
- `CLOUD_SECRET` - Secret access key
108-
- `CLOUD_PREFIX` - Optional prefix (if needed for multi-tenant)
108+
- `PATH_PREFIX` - Optional prefix (if needed for multi-tenant)
109109

110110
**Note**: Both buckets MUST use the same credentials and endpoint. Different credentials/endpoints per bucket are out of scope for v1.
111111

@@ -130,7 +130,7 @@ s3://public-bucket/
130130
**Implementation:**
131131

132132
- `putObject()` uses `CLOUD_BUCKET_NAME`
133-
- Key generation: `{CLOUD_PREFIX}/{mediaId}/main.{ext}` (if prefix exists)
133+
- Key generation: `{PATH_PREFIX}/{mediaId}/main.{ext}` (if prefix exists)
134134

135135
---
136136

@@ -164,8 +164,8 @@ s3://public-bucket/
164164

165165
**Key Generation:**
166166

167-
- Source: `{CLOUD_PREFIX}/{mediaId}/main.{ext}` in private bucket
168-
- Destination: `{CLOUD_PREFIX}/{mediaId}/main.{ext}` in public bucket (for public) or same private bucket (for private)
167+
- Source: `{PATH_PREFIX}/{mediaId}/main.{ext}` in private bucket
168+
- Destination: `{PATH_PREFIX}/{mediaId}/main.{ext}` in public bucket (for public) or same private bucket (for private)
169169

170170
---
171171

@@ -184,7 +184,7 @@ s3://public-bucket/
184184
**Implementation:**
185185

186186
- `deleteFolder()` operates on private bucket only
187-
- Prefix: `{CLOUD_PREFIX}/{mediaId}/` (if prefix exists)
187+
- Prefix: `{PATH_PREFIX}/{mediaId}/` (if prefix exists)
188188

189189
---
190190

@@ -196,7 +196,7 @@ s3://public-bucket/
196196

197197
- Source: Private bucket
198198
- Method: Generate signed URL using S3 presigner or CDN signer
199-
- Key: `{CLOUD_PREFIX}/{mediaId}/main.{ext}` or `{CLOUD_PREFIX}/{mediaId}/thumb.webp`
199+
- Key: `{PATH_PREFIX}/{mediaId}/main.{ext}` or `{PATH_PREFIX}/{mediaId}/thumb.webp`
200200

201201
**Implementation:**
202202

@@ -215,13 +215,13 @@ const url = await getS3SignedUrl(s3Client, command);
215215

216216
- Source: Public bucket
217217
- Method: Direct HTTP URL or CDN URL
218-
- Key: `{CLOUD_PREFIX}/{mediaId}/main.{ext}` or `{CLOUD_PREFIX}/{mediaId}/thumb.webp`
218+
- Key: `{PATH_PREFIX}/{mediaId}/main.{ext}` or `{PATH_PREFIX}/{mediaId}/thumb.webp`
219219

220220
**Implementation:**
221221

222222
```typescript
223223
// For public bucket
224-
const url = `${PUBLIC_ENDPOINT}/${key}`; // or `${CLOUDFRONT_ENDPOINT}/${key}`
224+
const url = `${PUBLIC_ENDPOINT}/${key}`; // or `${CDN_ENDPOINT}/${key}`
225225
```
226226

227227
---

packages/medialit/src/index.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export class MediaLit {
9595

9696
if (!response.ok) {
9797
const error = await response.json();
98-
throw new Error(error.message || "Upload failed");
98+
throw new Error(error.error || "Upload failed");
9999
}
100100

101101
return response.json();
@@ -115,7 +115,7 @@ export class MediaLit {
115115

116116
if (!response.ok) {
117117
const error = await response.json();
118-
throw new Error(error.message || "Deletion failed");
118+
throw new Error(error.error || "Deletion failed");
119119
}
120120
}
121121

@@ -130,7 +130,7 @@ export class MediaLit {
130130

131131
if (!response.ok) {
132132
const error = await response.json();
133-
throw new Error(error.message || "Failed to seal media");
133+
throw new Error(error.error || "Failed to seal media");
134134
}
135135

136136
return response.json();
@@ -147,7 +147,7 @@ export class MediaLit {
147147

148148
if (!response.ok) {
149149
const error = await response.json();
150-
throw new Error(error.message || "Failed to get media");
150+
throw new Error(error.error || "Failed to get media");
151151
}
152152

153153
return response.json();
@@ -179,7 +179,7 @@ export class MediaLit {
179179

180180
if (!response.ok) {
181181
const error = await response.json();
182-
throw new Error(error.message || "Failed to list media");
182+
throw new Error(error.error || "Failed to list media");
183183
}
184184

185185
return response.json();
@@ -220,7 +220,7 @@ export class MediaLit {
220220

221221
if (!response.ok) {
222222
const error = await response.json();
223-
throw new Error(error.message || "Failed to get count");
223+
throw new Error(error.error || "Failed to get count");
224224
}
225225

226226
const result = await response.json();
@@ -238,7 +238,7 @@ export class MediaLit {
238238

239239
if (!response.ok) {
240240
const error = await response.json();
241-
throw new Error(error.message || "Failed to get stats");
241+
throw new Error(error.error || "Failed to get stats");
242242
}
243243

244244
return response.json();

0 commit comments

Comments
 (0)