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);