Mercurial
comparison mrjunejune/main.c @ 204:e5aed6c36672
[Notes] Added icons and updated styling a bit. Probalby usable now.
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sun, 15 Feb 2026 11:02:13 -0800 |
| parents | b9b184b3303c |
| children | 240337164a80 |
comparison
equal
deleted
inserted
replaced
| 203:92a57bd716c1 | 204:e5aed6c36672 |
|---|---|
| 1193 | 1193 |
| 1194 // Generate S3 keys | 1194 // Generate S3 keys |
| 1195 char s3_key_original[512]; | 1195 char s3_key_original[512]; |
| 1196 char s3_key_processed[512]; | 1196 char s3_key_processed[512]; |
| 1197 snprintf(s3_key_original, sizeof(s3_key_original), "uploads/%s/%s", uuid, filename); | 1197 snprintf(s3_key_original, sizeof(s3_key_original), "uploads/%s/%s", uuid, filename); |
| 1198 snprintf(s3_key_processed, sizeof(s3_key_processed), "uploads/%s/processed.webp", uuid); | 1198 |
| 1199 // Only use .webp for images | |
| 1200 int is_image = (strncmp(content_type, "image/", 6) == 0); | |
| 1201 if (is_image) | |
| 1202 { | |
| 1203 snprintf(s3_key_processed, sizeof(s3_key_processed), "uploads/%s/processed.webp", uuid); | |
| 1204 } | |
| 1205 else | |
| 1206 { | |
| 1207 s3_key_processed[0] = '\0'; // No processed version for non-images | |
| 1208 } | |
| 1199 | 1209 |
| 1200 // Insert into database | 1210 // Insert into database |
| 1201 const char *insert_query = | 1211 const char *insert_query = |
| 1202 "INSERT INTO media_uploads (access_token, original_filename, content_type, s3_key_original, s3_key_processed, status) " | 1212 "INSERT INTO media_uploads (access_token, original_filename, content_type, s3_key_original, s3_key_processed, status) " |
| 1203 "VALUES (?, ?, ?, ?, ?, 'pending')"; | 1213 "VALUES (?, ?, ?, ?, ?, 'pending')"; |
| 1236 Dowa_HashMap_Push_Arena(resp, "body", error_body, arena); | 1246 Dowa_HashMap_Push_Arena(resp, "body", error_body, arena); |
| 1237 S3_Presigned_URL_Destroy(&presigned); | 1247 S3_Presigned_URL_Destroy(&presigned); |
| 1238 return resp; | 1248 return resp; |
| 1239 } | 1249 } |
| 1240 | 1250 |
| 1251 // Build public URL using CloudFront or S3 | |
| 1252 char public_url[512]; | |
| 1253 if (g_s3_cloudfront_url[0]) | |
| 1254 { | |
| 1255 snprintf(public_url, sizeof(public_url), "%s/%s", g_s3_cloudfront_url, s3_key_original); | |
| 1256 } | |
| 1257 else | |
| 1258 { | |
| 1259 snprintf(public_url, sizeof(public_url), "https://%s.s3.%s.amazonaws.com/%s", | |
| 1260 g_s3_bucket, g_s3_region, s3_key_original); | |
| 1261 } | |
| 1262 | |
| 1241 // Build response | 1263 // Build response |
| 1242 char *response_body = Dowa_Arena_Allocate(arena, 4096 + strlen(presigned.url)); | 1264 char *response_body = Dowa_Arena_Allocate(arena, 4096 + strlen(presigned.url) + strlen(public_url)); |
| 1243 snprintf(response_body, 4096 + strlen(presigned.url), | 1265 snprintf(response_body, 4096 + strlen(presigned.url) + strlen(public_url), |
| 1244 "{\"media_id\":%lld,\"upload_url\":\"%s\",\"expires\":%d}", | 1266 "{\"media_id\":%lld,\"upload_url\":\"%s\",\"public_url\":\"%s\",\"expires\":%d}", |
| 1245 (long long)media_id, presigned.url, g_s3_url_expires); | 1267 (long long)media_id, presigned.url, public_url, g_s3_url_expires); |
| 1246 | 1268 |
| 1247 S3_Presigned_URL_Destroy(&presigned); | 1269 S3_Presigned_URL_Destroy(&presigned); |
| 1248 | 1270 |
| 1249 Dowa_HashMap_Push_Arena(resp, "status", "200", arena); | 1271 Dowa_HashMap_Push_Arena(resp, "status", "200", arena); |
| 1250 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena); | 1272 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena); |