annotate mrjunejune/main.c @ 259:667156fcd3e3

Add dev-only cyberpunk JRPG page
author MrJuneJune <me@mrjunejune.com>
date Wed, 05 Aug 2026 09:19:41 -0700
parents 745fd127b2a1
children 1f9877b637e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
114cad94008f [Seobeo] Updated to support thread and edge server calls.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
1 #include "seobeo/seobeo.h"
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
2 #include "markdown_converter/markdown_to_html.h"
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
3 #include "s3/s3_uploader.h"
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
4 #include "deita/deita.h"
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
5 #include "mrjunejune/latex_renderer.h"
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
6 #include <time.h>
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
7 #include <sys/stat.h>
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
8 #include <stdarg.h>
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
9 #include <stdatomic.h>
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
10 #include <pthread.h>
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
11
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
12 // UUID + /tmp/ + format (max 4)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
13 #define TMP_FILE_LENGTH 47
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
14 #define UUID_LEN 37
7
114cad94008f [Seobeo] Updated to support thread and edge server calls.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
15
36
84672efec192 [Zenbu] WIP fixing issues regarding to using edge only. I think there is a problem where socket closes before sending back the info.
MrJuneJune <me@mrjunejune.com>
parents: 19
diff changeset
16 volatile sig_atomic_t stop_server = 0;
248
b8b6e726964a [style] Use Dowa type aliases in C
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
17 static _Atomic uint32 counter = 0;
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
18 static _Atomic boolean g_latex_rendering = FALSE;
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
19 static Seobeo_Worker_Pool *g_media_worker_pool = NULL;
36
84672efec192 [Zenbu] WIP fixing issues regarding to using edge only. I think there is a problem where socket closes before sending back the info.
MrJuneJune <me@mrjunejune.com>
parents: 19
diff changeset
20
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
21 // Media processing context owned by a background worker.
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
22 typedef struct {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
23 int64 media_id;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
24 char s3_key_original[512];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
25 char s3_key_processed[512];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
26 char content_type[128];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
27 char access_token[256];
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
28 char db_path[256];
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
29 S3_Config s3_config;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
30 } Media_Processing_Context;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
31
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
32 typedef struct {
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
33 char *input_path;
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
34 char *output_path;
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
35 int result;
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
36 } File_Converter_Config;
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
37
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
38 // Server configuration (loaded from .config)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
39 static char g_upload_auth_token[256] = {0};
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
40 static char g_s3_region[64] = "us-west-2";
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
41 static char g_s3_bucket[128] = "mrjunejune";
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
42 static char g_s3_cloudfront_url[256] = {0};
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
43 static char g_db_path[256] = "mrjunejune/data/mrjunejune.db";
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
44 static int g_s3_url_expires = 3600;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
45 static S3_Config g_s3_config = {0};
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
46 static Deita_Connection *g_db_connection = NULL;
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
47
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
48 static void load_config(const char *config_path)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
49 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
50 FILE *f = fopen(config_path, "r");
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
51 if (!f)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
52 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
53 printf("[CONFIG] Warning: Could not open %s, using defaults\n", config_path);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
54 return;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
55 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
56
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
57 char line[512];
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
58 while (fgets(line, sizeof(line), f))
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
59 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
60 // Skip comments and empty lines
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
61 if (line[0] == '#' || line[0] == '\n' || line[0] == '\r') continue;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
62
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
63 char *eq = strchr(line, '=');
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
64 if (!eq) continue;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
65
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
66 *eq = '\0';
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
67 char *key = line;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
68 char *value = eq + 1;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
69
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
70 // Trim newline from value
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
71 size_t vlen = strlen(value);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
72 while (vlen > 0 && (value[vlen-1] == '\n' || value[vlen-1] == '\r'))
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
73 value[--vlen] = '\0';
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
74
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
75 if (strcmp(key, "UPLOAD_AUTH_TOKEN") == 0)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
76 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
77 strncpy(g_upload_auth_token, value, sizeof(g_upload_auth_token) - 1);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
78 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
79 else if (strcmp(key, "S3_REGION") == 0)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
80 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
81 strncpy(g_s3_region, value, sizeof(g_s3_region) - 1);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
82 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
83 else if (strcmp(key, "S3_BUCKET") == 0)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
84 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
85 strncpy(g_s3_bucket, value, sizeof(g_s3_bucket) - 1);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
86 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
87 else if (strcmp(key, "S3_URL_EXPIRES") == 0)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
88 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
89 g_s3_url_expires = atoi(value);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
90 }
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
91 else if (strcmp(key, "S3_CLOUDFRONT_URL") == 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
92 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
93 strncpy(g_s3_cloudfront_url, value, sizeof(g_s3_cloudfront_url) - 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
94 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
95 else if (strcmp(key, "DB_PATH") == 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
96 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
97 strncpy(g_db_path, value, sizeof(g_db_path) - 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
98 }
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
99 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
100 fclose(f);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
101
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
102 printf("[CONFIG] Loaded: token=%s..., region=%s, bucket=%s, expires=%d, cloudfront=%s, db=%s\n",
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
103 g_upload_auth_token[0] ? "***" : "(empty)",
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
104 g_s3_region, g_s3_bucket, g_s3_url_expires,
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
105 g_s3_cloudfront_url[0] ? g_s3_cloudfront_url : "(none)",
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
106 g_db_path);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
107 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
108
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
109 static void init_database(void)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
110 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
111 // Create data directory if needed
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
112 char *last_slash = strrchr(g_db_path, '/');
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
113 if (last_slash)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
114 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
115 char dir_path[256];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
116 size_t dir_len = last_slash - g_db_path;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
117 strncpy(dir_path, g_db_path, dir_len);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
118 dir_path[dir_len] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
119 mkdir(dir_path, 0755);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
120 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
121
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
122 g_db_connection = Deita_Connection_Create(DEITA_DATABASE_TYPE_SQLITE3, g_db_path);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
123 if (!g_db_connection || !Deita_Connection_Is_Open(g_db_connection))
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
124 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
125 printf("[DB] ERROR: Failed to open database at %s\n", g_db_path);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
126 return;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
127 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
128
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
129 // Create editor_content table
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
130 const char *create_table =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
131 "CREATE TABLE IF NOT EXISTS editor_content ("
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
132 " id INTEGER PRIMARY KEY AUTOINCREMENT,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
133 " access_token TEXT NOT NULL,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
134 " doc_id TEXT NOT NULL,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
135 " content TEXT,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
136 " created_at INTEGER DEFAULT (strftime('%s', 'now')),"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
137 " updated_at INTEGER DEFAULT (strftime('%s', 'now')),"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
138 " UNIQUE(access_token, doc_id)"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
139 ")";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
140
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
141 int32 result = Deita_Query_Execute_Update(g_db_connection, create_table);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
142 if (result < 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
143 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
144 printf("[DB] ERROR: Failed to create editor_content table\n");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
145 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
146
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
147 // Create media_uploads table
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
148 const char *create_media_uploads =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
149 "CREATE TABLE IF NOT EXISTS media_uploads ("
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
150 " id INTEGER PRIMARY KEY AUTOINCREMENT,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
151 " access_token TEXT NOT NULL,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
152 " original_filename TEXT NOT NULL,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
153 " content_type TEXT NOT NULL,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
154 " s3_key_original TEXT NOT NULL,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
155 " s3_key_processed TEXT,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
156 " file_size INTEGER,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
157 " status TEXT NOT NULL DEFAULT 'pending',"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
158 " error_message TEXT,"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
159 " created_at INTEGER DEFAULT (strftime('%s', 'now')),"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
160 " updated_at INTEGER DEFAULT (strftime('%s', 'now'))"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
161 ")";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
162
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
163 result = Deita_Query_Execute_Update(g_db_connection, create_media_uploads);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
164 if (result < 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
165 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
166 printf("[DB] ERROR: Failed to create media_uploads table\n");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
167 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
168
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
169 // Create indices for media_uploads
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
170 const char *create_status_idx =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
171 "CREATE INDEX IF NOT EXISTS idx_media_uploads_status ON media_uploads(status)";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
172 result = Deita_Query_Execute_Update(g_db_connection, create_status_idx);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
173 if (result < 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
174 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
175 printf("[DB] ERROR: Failed to create status index\n");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
176 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
177
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
178 const char *create_token_status_idx =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
179 "CREATE INDEX IF NOT EXISTS idx_media_uploads_token_status "
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
180 "ON media_uploads(access_token, status)";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
181 result = Deita_Query_Execute_Update(g_db_connection, create_token_status_idx);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
182 if (result < 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
183 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
184 printf("[DB] ERROR: Failed to create token_status index\n");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
185 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
186 else
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
187 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
188 printf("[DB] Initialized: %s\n", g_db_path);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
189 }
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
190 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
191
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
192 void handle_sigint(int sig)
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
193 {
36
84672efec192 [Zenbu] WIP fixing issues regarding to using edge only. I think there is a problem where socket closes before sending back the info.
MrJuneJune <me@mrjunejune.com>
parents: 19
diff changeset
194 printf("Failed\n");
84672efec192 [Zenbu] WIP fixing issues regarding to using edge only. I think there is a problem where socket closes before sending back the info.
MrJuneJune <me@mrjunejune.com>
parents: 19
diff changeset
195 stop_server = 1;
84672efec192 [Zenbu] WIP fixing issues regarding to using edge only. I think there is a problem where socket closes before sending back the info.
MrJuneJune <me@mrjunejune.com>
parents: 19
diff changeset
196 }
7
114cad94008f [Seobeo] Updated to support thread and edge server calls.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
197
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
198 void Seobeo_Render_Html(
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
199 char *final_body,
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
200 char *template,
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
201 Dowa_Arena *arena
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
202 )
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
203 {
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
204 size_t current_offset = 0;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
205 char *cursor = template;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
206
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
207 int32 token_len = 2;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
208
96
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 92
diff changeset
209 while (1)
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
210 {
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
211 char *start_tag = strstr(cursor, "{{");
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
212 if (!start_tag) break;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
213
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
214 char *end_tag = strstr(start_tag, "}}");
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
215 if (!end_tag) break;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
216
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
217 Seobeo_Log(SEOBEO_INFO, "[Curr] Life\n");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
218
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
219 size_t leading_len = start_tag - cursor;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
220 memcpy(final_body + current_offset, cursor, leading_len);
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
221 current_offset += leading_len;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
222
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
223 size_t name_len = end_tag - (start_tag + token_len);
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
224 char *include_name = Dowa_Arena_Allocate(arena, name_len + 1);
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
225 memcpy(include_name, start_tag + token_len, name_len);
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
226 include_name[name_len] = '\0';
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
227
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
228 size_t sub_file_size = 0;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
229 char *sub_content = Seobeo_Web_LoadFile(include_name, &sub_file_size);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
230 Seobeo_Log(SEOBEO_DEBUG, "[TEMPLATE] Loading include: '%s' -> %s (size=%zu)\n",
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
231 include_name, sub_content ? "OK" : "FAILED", sub_file_size);
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
232 if (sub_content)
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
233 {
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
234 memcpy(final_body + current_offset, sub_content, sub_file_size);
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
235 current_offset += sub_file_size;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
236 free(sub_content);
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
237 }
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
238
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
239 cursor = end_tag + 2;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
240 }
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
241 strcpy(final_body + current_offset, cursor);
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
242 }
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
243
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
244 void Seobeo_Render_Html_FilePath(
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
245 char *final_body,
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
246 char *path,
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
247 Dowa_Arena *arena
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
248 ) {
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
249 Seobeo_Log(SEOBEO_DEBUG, "[TEMPLATE] Loading main template: '%s'\n", path);
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
250 size_t html_size = 0;
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
251 char *template = Seobeo_Web_LoadFile(path, &html_size);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
252 Seobeo_Log(SEOBEO_DEBUG, "[TEMPLATE] Main template loaded: %s (size=%zu)\n", template ? "OK" : "FAILED", html_size);
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
253 if (!template) return;
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
254 Seobeo_Render_Html(final_body, template, arena);
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
255 }
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
256
77
c348ac875294 [Seobeo] Server side rendering.
June Park <parkjune1995@gmail.com>
parents: 72
diff changeset
257 Seobeo_Request_Entry* GetHomePage(Seobeo_Request_Entry *req, Dowa_Arena *arena)
c348ac875294 [Seobeo] Server side rendering.
June Park <parkjune1995@gmail.com>
parents: 72
diff changeset
258 {
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
259 Seobeo_Request_Entry *resp = NULL;
80
d55157451947 [MrJuneJune] Updating my homepage.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
260 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
261 Seobeo_Render_Html_FilePath(final_body, "/index.html", arena);
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
262 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
263 return resp;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
264 }
77
c348ac875294 [Seobeo] Server side rendering.
June Park <parkjune1995@gmail.com>
parents: 72
diff changeset
265
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
266 Seobeo_Request_Entry* GetResume(Seobeo_Request_Entry *req, Dowa_Arena *arena)
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
267 {
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
268 Seobeo_Request_Entry *resp = NULL;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
269 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
270 Seobeo_Render_Html_FilePath(final_body, "/resume/index.html", arena);
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
271 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
272 return resp;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
273 }
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
274
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
275 Seobeo_Request_Entry* GetTools(Seobeo_Request_Entry *req, Dowa_Arena *arena)
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
276 {
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
277 Seobeo_Request_Entry *resp = NULL;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
278 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
279 Seobeo_Render_Html_FilePath(final_body, "/tools/index.html", arena);
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
280 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
77
c348ac875294 [Seobeo] Server side rendering.
June Park <parkjune1995@gmail.com>
parents: 72
diff changeset
281 return resp;
c348ac875294 [Seobeo] Server side rendering.
June Park <parkjune1995@gmail.com>
parents: 72
diff changeset
282 }
c348ac875294 [Seobeo] Server side rendering.
June Park <parkjune1995@gmail.com>
parents: 72
diff changeset
283
c348ac875294 [Seobeo] Server side rendering.
June Park <parkjune1995@gmail.com>
parents: 72
diff changeset
284
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
285 Seobeo_Request_Entry* GetMDToHTML(Seobeo_Request_Entry *req, Dowa_Arena *arena)
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
286 {
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
287 Seobeo_Request_Entry *resp = NULL;
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
288 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
289 Seobeo_Render_Html_FilePath(final_body, "/tools/markdown_to_html/index.html", arena);
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
290 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
291 return resp;
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
292 }
77
c348ac875294 [Seobeo] Server side rendering.
June Park <parkjune1995@gmail.com>
parents: 72
diff changeset
293
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
294 Seobeo_Request_Entry* GetFileConverter(Seobeo_Request_Entry *req, Dowa_Arena *arena)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
295 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
296 Seobeo_Request_Entry *resp = NULL;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
297 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
298 Seobeo_Render_Html_FilePath(final_body, "/tools/file_converter/index.html", arena);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
299 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
300 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
301 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
302
242
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
303 Seobeo_Request_Entry* GetHlsPlayer(Seobeo_Request_Entry *req, Dowa_Arena *arena)
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
304 {
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
305 Seobeo_Request_Entry *resp = NULL;
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
306 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
307 Seobeo_Render_Html_FilePath(final_body, "/tools/hls_player/index.html", arena);
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
308 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
309 return resp;
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
310 }
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
311
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
312 Seobeo_Request_Entry* GetLatexEditor(Seobeo_Request_Entry *req, Dowa_Arena *arena)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
313 {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
314 Seobeo_Request_Entry *resp = NULL;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
315 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
316 Seobeo_Render_Html_FilePath(final_body, "/tools/latex_editor/index.html", arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
317 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
318 return resp;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
319 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
320
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
321 static Seobeo_Request_Entry *LatexErrorResponse(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
322 Dowa_Arena *arena,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
323 int status,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
324 const char *message)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
325 {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
326 Seobeo_Request_Entry *resp = NULL;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
327 char *status_value = Dowa_Arena_Allocate(arena, 16);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
328 snprintf(status_value, 16, "%d", status);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
329 char *body = Dowa_Arena_Allocate(arena, strlen(message) + 1);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
330 strcpy(body, message);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
331 Dowa_HashMap_Push_Arena(resp, "status", status_value, arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
332 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain; charset=utf-8", arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
333 Dowa_HashMap_Push_Arena(resp, "cache-control", "no-store", arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
334 Dowa_HashMap_Push_Arena(resp, "body", body, arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
335 return resp;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
336 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
337
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
338 Seobeo_Request_Entry *RenderLatexPdf(Seobeo_Request_Entry *req, Dowa_Arena *arena)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
339 {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
340 void *body_kv = Dowa_HashMap_Get_Ptr(req, "Body");
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
341 void *length_kv = Dowa_HashMap_Get_Ptr(req, "Content-Length");
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
342 if (!body_kv || !length_kv)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
343 return LatexErrorResponse(arena, 400, "LaTeX source and Content-Length are required.");
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
344
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
345 const char *length_value = ((Seobeo_Request_Entry *)length_kv)->value;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
346 char *length_end = NULL;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
347 errno = 0;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
348 unsigned long long parsed_length = strtoull(length_value, &length_end, 10);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
349 if (errno != 0 ||
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
350 length_end == length_value ||
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
351 *length_end != '\0' ||
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
352 parsed_length == 0)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
353 return LatexErrorResponse(arena, 400, "Content-Length is invalid.");
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
354 if (parsed_length > LATEX_SOURCE_MAX_BYTES)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
355 return LatexErrorResponse(arena, 413, "LaTeX source exceeds the 64 KiB limit.");
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
356
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
357 boolean expected = FALSE;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
358 if (!atomic_compare_exchange_strong(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
359 &g_latex_rendering,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
360 &expected,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
361 TRUE))
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
362 return LatexErrorResponse(arena, 429, "The LaTeX compiler is busy. Try again shortly.");
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
363
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
364 Latex_Render_Result render = Latex_Render(
248
b8b6e726964a [style] Use Dowa type aliases in C
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
365 (const uint8 *)((Seobeo_Request_Entry *)body_kv)->value,
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
366 (size_t)parsed_length);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
367 atomic_store(&g_latex_rendering, FALSE);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
368 if (render.status != LATEX_RENDER_OK)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
369 {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
370 int status = 500;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
371 if (render.status == LATEX_RENDER_INVALID_INPUT)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
372 status = 400;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
373 else if (render.status == LATEX_RENDER_COMPILE_ERROR)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
374 status = 422;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
375 else if (render.status == LATEX_RENDER_TIMEOUT)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
376 status = 504;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
377 else if (render.status == LATEX_RENDER_COMPILER_UNAVAILABLE)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
378 status = 503;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
379
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
380 const char *diagnostics = render.diagnostics
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
381 ? render.diagnostics
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
382 : "LaTeX rendering failed.";
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
383 char *body = Dowa_Arena_Allocate(arena, strlen(diagnostics) + 1);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
384 strcpy(body, diagnostics);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
385 Latex_Render_Result_Destroy(&render);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
386 return LatexErrorResponse(arena, status, body);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
387 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
388
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
389 char *pdf = Dowa_Arena_Allocate(arena, render.pdf_size + 1);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
390 if (!pdf)
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
391 {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
392 Latex_Render_Result_Destroy(&render);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
393 return LatexErrorResponse(arena, 500, "The generated PDF is too large to return.");
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
394 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
395 memcpy(pdf, render.pdf_data, render.pdf_size);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
396 pdf[render.pdf_size] = '\0';
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
397 char *content_length = Dowa_Arena_Allocate(arena, 32);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
398 snprintf(content_length, 32, "%zu", render.pdf_size);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
399 Latex_Render_Result_Destroy(&render);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
400
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
401 Seobeo_Request_Entry *resp = NULL;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
402 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
403 Dowa_HashMap_Push_Arena(resp, "content-type", "application/pdf", arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
404 Dowa_HashMap_Push_Arena(resp, "content-length", content_length, arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
405 Dowa_HashMap_Push_Arena(resp, "content-disposition", "inline; filename=\"document.pdf\"", arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
406 Dowa_HashMap_Push_Arena(resp, "cache-control", "no-store", arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
407 Dowa_HashMap_Push_Arena(resp, "x-content-type-options", "nosniff", arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
408 Dowa_HashMap_Push_Arena(resp, "body", pdf, arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
409 return resp;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
410 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
411
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
412 // Joinable worker function for local image conversion.
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
413 void Simple_WebpConverter_Background(void *arg)
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
414 {
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
415 File_Converter_Config *configuration = (File_Converter_Config *)arg;
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
416
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
417 char cmd[1024];
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
418 snprintf(cmd, sizeof(cmd), "ffmpeg -y -i %s -quality 80 %s 2>/tmp/error_log",
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
419 configuration->input_path, configuration->output_path);
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
420 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Running FFmpeg: %s\n", cmd);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
421 configuration->result = system(cmd);
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
422
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
423 Seobeo_Log(
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
424 SEOBEO_INFO,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
425 "[MEDIA] FFmpeg result: %d\n",
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
426 configuration->result);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
427 if (configuration->result != 0)
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
428 {
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
429 Seobeo_Log(SEOBEO_ERROR, "[MEDIA] ERROR: FFmpeg conversion failed\n");
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
430 return;
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
431 }
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
432 Seobeo_Log(
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
433 SEOBEO_INFO,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
434 "[MEDIA] Successfully converted to webp: %s\n",
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
435 configuration->output_path);
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
436 }
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
437
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
438 Seobeo_Request_Entry *ConvertImageToWebP(Seobeo_Request_Entry *req, Dowa_Arena *arena)
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
439 {
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
440 Seobeo_Request_Entry *resp = NULL;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
441
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
442 if (!req)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
443 {
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
444 Seobeo_Log(SEOBEO_ERROR, "Request is NULL\n");
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
445 char *error_msg = "Internal error: no request data";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
446 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
447 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
448 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
449 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
450 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
451
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
452 size_t req_length = Dowa_Array_Length(req);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
453 printf("Request has %zu entries\n", req_length);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
454
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
455 for (size_t i = 0; i < req_length; i++)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
456 {
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
457 Seobeo_Log(SEOBEO_INFO, " Key[%zu]: '%s'\n", i, req[i].key);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
458 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
459
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
460 void *body_kv = Dowa_HashMap_Get_Ptr(req, "Body");
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
461 if (!body_kv)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
462 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
463 printf("ERROR: No 'Body' key found in request\n");
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
464
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
465 char *error_msg = "No file data provided";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
466 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
467 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
468 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
469 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
470 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
471
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
472 void *cl_kv = Dowa_HashMap_Get_Ptr(req, "Content-Length");
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
473 if (!cl_kv)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
474 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
475 char *error_msg = "No Content-Length header";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
476 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
477 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
478 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
479 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
480 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
481
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
482 const char *file_data = ((Seobeo_Request_Entry*)body_kv)->value;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
483 const char *content_length_str = ((Seobeo_Request_Entry*)cl_kv)->value;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
484 size_t file_size = atoi(content_length_str);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
485
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
486 Seobeo_Log(SEOBEO_DEBUG, "Converting image, file_size=%zu bytes\n", file_size);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
487
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
488 int open_flags = O_RDWR | O_CREAT | O_EXCL;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
489
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
490 char *uuid4 = (char *)Dowa_Arena_Allocate(arena, UUID_LEN);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
491 uint32 seed =
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
492 (uint32)time(NULL) ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
493 (uint32)Seobeo_Thread_Current_Id() ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
494 counter++;
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
495 Dowa_String_UUID(seed, uuid4);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
496 char *input_path = Dowa_Arena_Allocate(arena, TMP_FILE_LENGTH);;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
497 snprintf(input_path, TMP_FILE_LENGTH, "/tmp/%s", uuid4);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
498 int input_fd = open(input_path, open_flags, 0600);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
499 if (input_fd == -1)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
500 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
501 char *error_msg = "Failed to create temporary file";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
502 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
503 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
504 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
505 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
506 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
507 write(input_fd, file_data, file_size);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
508 close(input_fd);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
509
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
510
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
511 uuid4 = (char *)Dowa_Arena_Allocate(arena, UUID_LEN);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
512 seed =
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
513 (uint32)time(NULL) ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
514 (uint32)Seobeo_Thread_Current_Id() ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
515 counter++;
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
516 Dowa_String_UUID(seed, uuid4);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
517 char *output_path = (char *)Dowa_Arena_Allocate(arena, TMP_FILE_LENGTH);;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
518 snprintf(output_path, TMP_FILE_LENGTH, "/tmp/%s.webp", uuid4);
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
519 Seobeo_Log(SEOBEO_DEBUG, "output_path %s\n", output_path);
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
520 Seobeo_Log(SEOBEO_DEBUG, "open_flags: 0x%x\n", open_flags);
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
521 Seobeo_Log(SEOBEO_DEBUG, "input_path: %s\n", input_path);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
522 int output_fd = open(output_path, open_flags, 0600);
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
523 Seobeo_Log(SEOBEO_DEBUG, "output_fd: %d\n", output_fd);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
524 if (output_fd == -1)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
525 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
526 unlink(input_path);
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
527 Seobeo_Log(SEOBEO_DEBUG, "errno: %d (%s)\n", errno, strerror(errno));
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
528 char *error_msg = "Failed to create output file";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
529 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
530 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
531 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
532 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
533 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
534 close(output_fd);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
535
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
536 File_Converter_Config *configuration = Dowa_Arena_Allocate(arena, sizeof(File_Converter_Config));
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
537 configuration->input_path = input_path;
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
538 configuration->output_path = output_path;
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
539 configuration->result = -1;
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
540
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
541 Seobeo_Thread *p_worker = Seobeo_Thread_Start(
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
542 Simple_WebpConverter_Background,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
543 configuration,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
544 NULL);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
545 if (!p_worker ||
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
546 Seobeo_Thread_Join(p_worker) != SEOBEO_WORKER_OK ||
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
547 configuration->result != 0)
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
548 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
549 unlink(input_path);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
550 unlink(output_path);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
551 char *error_msg = "FFmpeg conversion failed";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
552 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
553 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
554 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
555 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
556 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
557
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
558 FILE *out_file = fopen(output_path, "rb");
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
559 if (!out_file)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
560 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
561 unlink(input_path);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
562 unlink(output_path);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
563 char *error_msg = "Failed to read converted file";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
564 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
565 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
566 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
567 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
568 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
569 fclose(out_file);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
570
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
571 unlink(input_path);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
572 char *filename = strrchr(output_path, '/') + 1;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
573 char *response_body = Dowa_Arena_Allocate(arena, 512);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
574 snprintf(response_body, 512,
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
575 "{\"success\":true,\"download_url\":\"/api/download/%s\",\"expires\":\"10 minutes\"}",
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
576 filename);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
577 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
578 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
579 Dowa_HashMap_Push_Arena(resp, "body", response_body, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
580
216
e82b80b24012 [MrJuneJune] Make webp translate background job.
June Park <parkjune1995@gmail.com>
parents: 206
diff changeset
581 Seobeo_Log(SEOBEO_DEBUG, "Image converted, available at /api/download/%s\n", filename);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
582
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
583 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
584 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
585
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
586 Seobeo_Request_Entry *ConvertVideoToMP4(Seobeo_Request_Entry *req, Dowa_Arena *arena)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
587 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
588 Seobeo_Request_Entry *resp = NULL;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
589
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
590 void *body_kv = Dowa_HashMap_Get_Ptr(req, "Body");
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
591 if (!body_kv)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
592 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
593 char *error_msg = "No file data provided";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
594 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
595 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
596 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
597 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
598 }
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
599
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
600 // Get Content-Length to know the actual binary size
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
601 void *cl_kv = Dowa_HashMap_Get_Ptr(req, "Content-Length");
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
602 if (!cl_kv)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
603 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
604 char *error_msg = "No Content-Length header";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
605 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
606 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
607 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
608 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
609 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
610
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
611 const char *file_data = ((Seobeo_Request_Entry*)body_kv)->value;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
612 const char *content_length_str = ((Seobeo_Request_Entry*)cl_kv)->value;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
613 size_t file_size = atoi(content_length_str);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
614
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
615 printf("DEBUG: Converting video, file_size=%zu bytes\n", file_size);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
616
168
f3084bca7317 [Misc] Fixed all errors and all tests should pass now.
MrJuneJune <me@mrjunejune.com>
parents: 158
diff changeset
617 int open_flags = O_RDWR | O_CREAT | O_EXCL;
f3084bca7317 [Misc] Fixed all errors and all tests should pass now.
MrJuneJune <me@mrjunejune.com>
parents: 158
diff changeset
618
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
619 char *uuid4 = (char *)Dowa_Arena_Allocate(arena, UUID_LEN);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
620 uint32 seed =
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
621 (uint32)time(NULL) ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
622 (uint32)Seobeo_Thread_Current_Id() ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
623 counter++;
168
f3084bca7317 [Misc] Fixed all errors and all tests should pass now.
MrJuneJune <me@mrjunejune.com>
parents: 158
diff changeset
624 Dowa_String_UUID(seed, uuid4);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
625 char *input_path = Dowa_Arena_Allocate(arena, TMP_FILE_LENGTH);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
626 snprintf(input_path, TMP_FILE_LENGTH, "/tmp/%s", uuid4);
168
f3084bca7317 [Misc] Fixed all errors and all tests should pass now.
MrJuneJune <me@mrjunejune.com>
parents: 158
diff changeset
627 Seobeo_Log(SEOBEO_DEBUG, "Input path: %s\n", input_path);
f3084bca7317 [Misc] Fixed all errors and all tests should pass now.
MrJuneJune <me@mrjunejune.com>
parents: 158
diff changeset
628
f3084bca7317 [Misc] Fixed all errors and all tests should pass now.
MrJuneJune <me@mrjunejune.com>
parents: 158
diff changeset
629 int input_fd = open(input_path, open_flags, 0600);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
630 if (input_fd == -1)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
631 {
168
f3084bca7317 [Misc] Fixed all errors and all tests should pass now.
MrJuneJune <me@mrjunejune.com>
parents: 158
diff changeset
632 Seobeo_Log(SEOBEO_DEBUG, "errno: %d (%s)\n", errno, strerror(errno));
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
633 char *error_msg = "Failed to create temporary file";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
634 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
635 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
636 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
637 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
638 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
639
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
640 write(input_fd, file_data, file_size);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
641 close(input_fd);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
642
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
643 seed =
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
644 (uint32)time(NULL) ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
645 (uint32)Seobeo_Thread_Current_Id() ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
646 counter++;
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
647 Dowa_String_UUID(seed, uuid4);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
648 char *output_path = (char *)Dowa_Arena_Allocate(arena, TMP_FILE_LENGTH);;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
649 snprintf(output_path, TMP_FILE_LENGTH, "/tmp/%s.mp4", uuid4);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
650 int output_fd = open(output_path, open_flags, 0600);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
651 if (output_fd == -1)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
652 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
653 unlink(input_path);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
654 char *error_msg = "Failed to create output file";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
655 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
656 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
657 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
658 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
659 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
660 close(output_fd);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
661
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
662 char cmd[512];
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
663 snprintf(cmd, sizeof(cmd),
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
664 "ffmpeg -y -i %s -c:v libx264 -preset fast -crf 23 -c:a aac %s 2>/tmp/error_log",
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
665 input_path, output_path);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
666 int result = system(cmd);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
667 if (result != 0)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
668 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
669 unlink(input_path);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
670 unlink(output_path);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
671 char *error_msg = "FFmpeg conversion failed";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
672 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
673 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
674 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
675 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
676 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
677
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
678 unlink(input_path);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
679 char *filename = strrchr(output_path, '/') + 1;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
680 char *response_body = Dowa_Arena_Allocate(arena, 512);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
681 snprintf(response_body, 512,
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
682 "{\"success\":true,\"download_url\":\"/api/download/%s\",\"expires\":\"10 minutes\"}",
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
683 filename);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
684 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
685 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
686 Dowa_HashMap_Push_Arena(resp, "body", response_body, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
687
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
688 printf("DEBUG: Video converted, available at /api/download/%s\n", filename);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
689 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
690 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
691
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
692 Seobeo_Request_Entry *DownloadConvertedFile(Seobeo_Request_Entry *req, Dowa_Arena *arena)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
693 {
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
694 Seobeo_Request_Entry *resp = NULL;
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
695
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
696 void *filename_kv = Dowa_HashMap_Get_Ptr(req, ":filename");
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
697 if (!filename_kv)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
698 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
699 char *error_msg = "No filename specified";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
700 Dowa_HashMap_Push_Arena(resp, "status", "404", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
701 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
702 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
703 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
704 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
705
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
706 const char *filename = ((Seobeo_Request_Entry*)filename_kv)->value;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
707
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
708 // TODO: Maybe check if the uuid is allowed or not?
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
709 // if (strlen(filename) != TMP_FILE_LENGTH)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
710 // {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
711 // char *error_msg = "Not Allowed Filename";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
712 // Dowa_HashMap_Push_Arena(resp, "status", "404", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
713 // Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
714 // Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
715 // return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
716 // }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
717 // boolean allowed = FALSE;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
718 // for (int i = 0; i < Dowa_Array_Length(g_uuid4_array); i++)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
719 // {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
720 // if strcmp(g_uuid4_array, filename)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
721 // {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
722 // allowed = TRUE;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
723 // break;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
724 // }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
725 // g_uuid4_array++;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
726 // }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
727
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
728 char filepath[512];
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
729 snprintf(filepath, sizeof(filepath), "/tmp/%s", filename);
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
730
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
731 FILE *file = fopen(filepath, "rb");
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
732 if (!file)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
733 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
734 char *error_msg = "File not found or expired";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
735 Dowa_HashMap_Push_Arena(resp, "status", "404", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
736 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
737 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
738 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
739 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
740
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
741 fseek(file, 0, SEEK_END);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
742 size_t file_size = ftell(file);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
743 fseek(file, 0, SEEK_SET);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
744
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
745 char *file_data = malloc(file_size + 1);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
746 if (!file_data)
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
747 {
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
748 fclose(file);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
749 char *error_msg = "Memory allocation failed";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
750 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
751 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
752 Dowa_HashMap_Push_Arena(resp, "body", error_msg, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
753 return resp;
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
754 }
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
755
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
756 fread(file_data, 1, file_size, file);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
757 file_data[file_size] = '\0';
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
758 fclose(file);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
759
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
760 const char *content_type = "application/octet-stream";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
761 if (strstr(filename, ".webp"))
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
762 content_type = "image/webp";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
763 else if (strstr(filename, ".mp4"))
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
764 content_type = "video/mp4";
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
765
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
766 char *body = Dowa_Arena_Allocate(arena, file_size + 1);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
767 memcpy(body, file_data, file_size);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
768 body[file_size] = '\0';
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
769 free(file_data);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
770
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
771 unlink(filepath);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
772
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
773 printf("DEBUG: Served and deleted file: %s (%zu bytes)\n", filename, file_size);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
774
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
775 char *content_length = Dowa_Arena_Allocate(arena, 32);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
776 snprintf(content_length, 32, "%zu", file_size);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
777
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
778 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
779 Dowa_HashMap_Push_Arena(resp, "content-type", content_type, arena);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
780 Dowa_HashMap_Push_Arena(resp, "content-length", content_length, arena);
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
781 Dowa_HashMap_Push_Arena(resp, "body", body, arena);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
782
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
783 return resp;
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
784 }
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
785
100
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
786 Seobeo_Request_Entry *RenderBlogList(Seobeo_Request_Entry *req, Dowa_Arena *arena)
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
787 {
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
788 Seobeo_Request_Entry *resp = NULL;
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
789 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
790 Seobeo_Render_Html_FilePath(final_body, "/blog/index.html", arena);
100
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
791 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
792 return resp;
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
793 }
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
794
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
795
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
796 Seobeo_Request_Entry *RenderBlog(Seobeo_Request_Entry *req, Dowa_Arena *arena)
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
797 {
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
798 Seobeo_Request_Entry *resp = NULL;
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
799
169
295ac2e5ec00 [MrJuneJune] Created separate target for generating html from md.
MrJuneJune <me@mrjunejune.com>
parents: 168
diff changeset
800 char *file_path = Dowa_Arena_Allocate(arena, 1024);
100
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
801 void *blog_id_kv = Dowa_HashMap_Get_Ptr(req, ":blog_id");
169
295ac2e5ec00 [MrJuneJune] Created separate target for generating html from md.
MrJuneJune <me@mrjunejune.com>
parents: 168
diff changeset
802 char *blog_id = ((Seobeo_Request_Entry*)blog_id_kv)->value;
295ac2e5ec00 [MrJuneJune] Created separate target for generating html from md.
MrJuneJune <me@mrjunejune.com>
parents: 168
diff changeset
803 snprintf(file_path, 1024, "/blog/%s/index.html", blog_id);
100
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
804
169
295ac2e5ec00 [MrJuneJune] Created separate target for generating html from md.
MrJuneJune <me@mrjunejune.com>
parents: 168
diff changeset
805 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
295ac2e5ec00 [MrJuneJune] Created separate target for generating html from md.
MrJuneJune <me@mrjunejune.com>
parents: 168
diff changeset
806 Seobeo_Render_Html_FilePath(final_body, file_path, arena);
100
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
807 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
808 return resp;
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
809 }
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
810
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
811 void Chat_Handler(Seobeo_WebSocket_Server_Connection *p_conn, Seobeo_WebSocket_Message *p_msg, void *p_user_data)
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
812 {
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
813 (void)p_user_data;
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
814
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
815 if (p_msg->opcode == SEOBEO_WS_OPCODE_TEXT)
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
816 {
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
817 char message[2048];
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
818 snprintf(message, sizeof(message), "[%s]: %.*s", p_conn->client_id, (int)p_msg->length, (char*)p_msg->data);
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
819
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
820 Seobeo_Log(SEOBEO_INFO, "[Chat] Broadcasting: %s\n", message);
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
821 Seobeo_WebSocket_Server_Broadcast_Text(message, p_conn);
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
822 }
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
823 }
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
824
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
825 Seobeo_Request_Entry *GetTalk(Seobeo_Request_Entry *req, Dowa_Arena *arena)
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
826 {
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
827 Seobeo_Request_Entry *resp = NULL;
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
828 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
158
1c0878eb17de [MrJuneJune] Readme file gets compiled in server side.
June Park <parkjune1995@gmail.com>
parents: 132
diff changeset
829 Seobeo_Render_Html_FilePath(final_body, "/talk/index.html", arena);
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
830 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
831 return resp;
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
832 }
100
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
833
259
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
834 #if defined(MRJUNEJUNE_ENABLE_DEV_PAGES)
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
835 Seobeo_Request_Entry *GetJrpg(Seobeo_Request_Entry *req, Dowa_Arena *arena)
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
836 {
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
837 Seobeo_Request_Entry *resp = NULL;
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
838 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
839 Seobeo_Render_Html_FilePath(final_body, "/jrpg/index.html", arena);
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
840 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
841 return resp;
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
842 }
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
843 #endif
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
844
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
845 Seobeo_Request_Entry *GetNotesLogin(Seobeo_Request_Entry *req, Dowa_Arena *arena)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
846 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
847 Seobeo_Request_Entry *resp = NULL;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
848 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
849 Seobeo_Render_Html_FilePath(final_body, "/notes/login.html", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
850 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
851 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
852 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
853
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
854 Seobeo_Request_Entry *GetNotes(Seobeo_Request_Entry *req, Dowa_Arena *arena)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
855 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
856 Seobeo_Request_Entry *resp = NULL;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
857 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
858 Seobeo_Render_Html_FilePath(final_body, "/notes/index.html", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
859 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
860 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
861 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
862
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
863 Seobeo_Request_Entry *GetNoteById(Seobeo_Request_Entry *req, Dowa_Arena *arena)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
864 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
865 Seobeo_Request_Entry *resp = NULL;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
866 char *final_body = Dowa_Arena_Allocate(arena, 50 * 1024);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
867 // Same template - JavaScript handles the note_id from URL
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
868 Seobeo_Render_Html_FilePath(final_body, "/notes/index.html", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
869 Dowa_HashMap_Push_Arena(resp, "body", final_body, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
870 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
871 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
872
88
a3962e681490 Fixed routing issues.
June Park <parkjune1995@gmail.com>
parents: 84
diff changeset
873 CREATE_REDIRECT_HANDLER(HomePage, "/")
a3962e681490 Fixed routing issues.
June Park <parkjune1995@gmail.com>
parents: 84
diff changeset
874 CREATE_REDIRECT_HANDLER(Resume, "/resume")
a3962e681490 Fixed routing issues.
June Park <parkjune1995@gmail.com>
parents: 84
diff changeset
875 CREATE_REDIRECT_HANDLER(Tools, "/tools")
a3962e681490 Fixed routing issues.
June Park <parkjune1995@gmail.com>
parents: 84
diff changeset
876 CREATE_REDIRECT_HANDLER(MarkDownToHtml, "/tools/markdown_to_html")
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
877 CREATE_REDIRECT_HANDLER(FileConverter, "/tools/file_converter")
242
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
878 CREATE_REDIRECT_HANDLER(HlsPlayer, "/tools/hls_player")
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
879 CREATE_REDIRECT_HANDLER(LatexEditor, "/tools/latex_editor")
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
880 CREATE_REDIRECT_HANDLER(Talk, "/talk")
259
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
881 #if defined(MRJUNEJUNE_ENABLE_DEV_PAGES)
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
882 CREATE_REDIRECT_HANDLER(Jrpg, "/jrpg")
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
883 #endif
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
884 CREATE_REDIRECT_HANDLER(Editor, "/editor")
79
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
885
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
886 // S3 Upload URL API
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
887 // POST /api/s3/upload-url
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
888 // Headers: Authorization: Bearer <token>, Content-Type: application/json
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
889 // Body: {"filename": "photo.png", "content_type": "image/png"}
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
890 // Returns: {"upload_url": "https://...", "key": "uploads/..."}
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
891 Seobeo_Request_Entry *GetS3UploadUrl(Seobeo_Request_Entry *req, Dowa_Arena *arena)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
892 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
893 Seobeo_Request_Entry *resp = NULL;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
894
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
895 // Check auth token
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
896 void *auth_kv = Dowa_HashMap_Get_Ptr(req, "Authorization");
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
897 if (!auth_kv)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
898 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
899 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
900 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
901 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing Authorization header\"}", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
902 return resp;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
903 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
904
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
905 const char *auth_header = ((Seobeo_Request_Entry*)auth_kv)->value;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
906
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
907 // Expect "Bearer <token>"
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
908 if (strncmp(auth_header, "Bearer ", 7) != 0)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
909 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
910 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
911 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
912 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid Authorization format, use Bearer token\"}", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
913 return resp;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
914 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
915
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
916 const char *token = auth_header + 7;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
917 if (strlen(g_upload_auth_token) == 0 || strcmp(token, g_upload_auth_token) != 0)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
918 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
919 Dowa_HashMap_Push_Arena(resp, "status", "403", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
920 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
921 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid token\"}", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
922 return resp;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
923 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
924
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
925 // Parse request body for filename and content_type
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
926 void *body_kv = Dowa_HashMap_Get_Ptr(req, "Body");
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
927 if (!body_kv)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
928 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
929 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
930 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
931 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing request body\"}", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
932 return resp;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
933 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
934
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
935 const char *body = ((Seobeo_Request_Entry*)body_kv)->value;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
936
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
937 // Simple JSON parsing for filename and content_type
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
938 char filename[256] = {0};
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
939 char content_type[128] = "application/octet-stream";
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
940
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
941 // Find "filename":"value"
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
942 const char *fn_key = strstr(body, "\"filename\"");
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
943 if (fn_key)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
944 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
945 const char *fn_start = strchr(fn_key + 10, '"');
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
946 if (fn_start)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
947 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
948 fn_start++;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
949 const char *fn_end = strchr(fn_start, '"');
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
950 if (fn_end && (size_t)(fn_end - fn_start) < sizeof(filename))
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
951 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
952 memcpy(filename, fn_start, fn_end - fn_start);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
953 filename[fn_end - fn_start] = '\0';
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
954 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
955 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
956 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
957
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
958 // Find "content_type":"value"
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
959 const char *ct_key = strstr(body, "\"content_type\"");
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
960 if (ct_key)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
961 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
962 const char *ct_start = strchr(ct_key + 14, '"');
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
963 if (ct_start)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
964 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
965 ct_start++;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
966 const char *ct_end = strchr(ct_start, '"');
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
967 if (ct_end && (size_t)(ct_end - ct_start) < sizeof(content_type))
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
968 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
969 memcpy(content_type, ct_start, ct_end - ct_start);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
970 content_type[ct_end - ct_start] = '\0';
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
971 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
972 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
973 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
974
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
975 if (strlen(filename) == 0)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
976 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
977 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
978 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
979 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing filename in request body\"}", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
980 return resp;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
981 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
982
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
983 // Generate unique S3 key with timestamp
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
984 char s3_key[512];
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
985 char *uuid = Dowa_Arena_Allocate(arena, UUID_LEN);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
986 uint32 seed =
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
987 (uint32)time(NULL) ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
988 (uint32)Seobeo_Thread_Current_Id() ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
989 counter++;
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
990 Dowa_String_UUID(seed, uuid);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
991 snprintf(s3_key, sizeof(s3_key), "uploads/%s/%s", uuid, filename);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
992
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
993 // Generate presigned URL
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
994 S3_Presigned_URL presigned = S3_Presign_Put(&g_s3_config, s3_key, content_type, g_s3_url_expires);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
995
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
996 if (!presigned.success)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
997 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
998 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
999 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1000 char *error_body = Dowa_Arena_Allocate(arena, 256);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1001 snprintf(error_body, 256, "{\"error\":\"Failed to generate upload URL: %s\"}",
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1002 presigned.error_message ? presigned.error_message : "unknown");
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1003 Dowa_HashMap_Push_Arena(resp, "body", error_body, arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1004 S3_Presigned_URL_Destroy(&presigned);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1005 return resp;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1006 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1007
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1008 // Build public URL using CloudFront
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1009 char public_url[512];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1010 if (g_s3_cloudfront_url[0])
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1011 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1012 snprintf(public_url, sizeof(public_url), "%s/%s", g_s3_cloudfront_url, s3_key);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1013 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1014 else
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1015 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1016 snprintf(public_url, sizeof(public_url), "https://%s.s3.%s.amazonaws.com/%s",
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1017 g_s3_bucket, g_s3_region, s3_key);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1018 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1019
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1020 // Build response
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1021 char *response_body = Dowa_Arena_Allocate(arena, 4096 + strlen(presigned.url));
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1022 snprintf(response_body, 4096 + strlen(presigned.url),
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1023 "{\"upload_url\":\"%s\",\"public_url\":\"%s\",\"key\":\"%s\",\"expires\":%d}",
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1024 presigned.url, public_url, s3_key, g_s3_url_expires);
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1025
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1026 S3_Presigned_URL_Destroy(&presigned);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1027
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1028 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1029 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1030 Dowa_HashMap_Push_Arena(resp, "body", response_body, arena);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1031
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1032 printf("[S3] Generated upload URL for: %s\n", s3_key);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1033
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1034 return resp;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1035 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1036
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1037 // Editor Content Save API
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1038 // POST /api/editor/save
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1039 // Headers: Authorization: Bearer <token>
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1040 // Body: {"doc_id": "my-doc", "content": "<html content>"}
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1041 Seobeo_Request_Entry *EditorSave(Seobeo_Request_Entry *req, Dowa_Arena *arena)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1042 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1043 Seobeo_Request_Entry *resp = NULL;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1044
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1045 // Check auth token
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1046 void *auth_kv = Dowa_HashMap_Get_Ptr(req, "Authorization");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1047 if (!auth_kv)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1048 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1049 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1050 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1051 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing Authorization header\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1052 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1053 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1054
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1055 const char *auth_header = ((Seobeo_Request_Entry*)auth_kv)->value;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1056 if (strncmp(auth_header, "Bearer ", 7) != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1057 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1058 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1059 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1060 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid Authorization format\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1061 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1062 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1063
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1064 const char *token = auth_header + 7;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1065 if (strlen(g_upload_auth_token) == 0 || strcmp(token, g_upload_auth_token) != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1066 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1067 Dowa_HashMap_Push_Arena(resp, "status", "403", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1068 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1069 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid token\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1070 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1071 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1072
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1073 if (!g_db_connection)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1074 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1075 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1076 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1077 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Database not available\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1078 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1079 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1080
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1081 // Parse request body
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1082 void *body_kv = Dowa_HashMap_Get_Ptr(req, "Body");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1083 if (!body_kv)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1084 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1085 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1086 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1087 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing request body\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1088 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1089 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1090
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1091 const char *body = ((Seobeo_Request_Entry*)body_kv)->value;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1092
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1093 // Parse doc_id and content from JSON
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1094 char doc_id[256] = "default";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1095 char *content = NULL;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1096 size_t content_len = 0;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1097
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1098 // Find "doc_id":"value"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1099 const char *doc_key = strstr(body, "\"doc_id\"");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1100 if (doc_key)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1101 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1102 const char *doc_start = strchr(doc_key + 8, '"');
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1103 if (doc_start)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1104 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1105 doc_start++;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1106 const char *doc_end = strchr(doc_start, '"');
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1107 if (doc_end && (size_t)(doc_end - doc_start) < sizeof(doc_id))
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1108 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1109 memcpy(doc_id, doc_start, doc_end - doc_start);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1110 doc_id[doc_end - doc_start] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1111 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1112 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1113 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1114
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1115 // Find "content":"value" - content can be large and contain escaped characters
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1116 const char *content_key = strstr(body, "\"content\"");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1117 if (content_key)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1118 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1119 const char *content_start = strchr(content_key + 9, '"');
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1120 if (content_start)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1121 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1122 content_start++;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1123 // Find closing quote (accounting for escaped quotes)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1124 const char *p = content_start;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1125 while (*p)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1126 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1127 if (*p == '\\' && *(p+1))
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1128 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1129 p += 2;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1130 continue;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1131 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1132 if (*p == '"') break;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1133 p++;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1134 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1135 content_len = p - content_start;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1136 content = Dowa_Arena_Allocate(arena, content_len + 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1137 memcpy(content, content_start, content_len);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1138 content[content_len] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1139 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1140 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1141
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1142 if (!content)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1143 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1144 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1145 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1146 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing content\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1147 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1148 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1149
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1150 // Upsert content
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1151 const char *upsert_query =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1152 "INSERT INTO editor_content (access_token, doc_id, content, updated_at) "
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1153 "VALUES (?, ?, ?, strftime('%s', 'now')) "
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1154 "ON CONFLICT(access_token, doc_id) DO UPDATE SET "
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1155 "content = excluded.content, updated_at = strftime('%s', 'now')";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1156
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1157 const char *params[] = { token, doc_id, content };
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1158 int32 result = Deita_Query_Execute_Update_Prepared(g_db_connection, upsert_query, 3, params);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1159
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1160 if (result < 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1161 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1162 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1163 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1164 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Failed to save\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1165 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1166 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1167
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1168 printf("[EDITOR] Saved doc_id=%s, content_len=%zu\n", doc_id, content_len);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1169
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1170 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1171 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1172 Dowa_HashMap_Push_Arena(resp, "body", "{\"success\":true}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1173 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1174 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1175
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1176 // Editor Content Load API
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1177 // GET /api/editor/load/:doc_id
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1178 // Headers: Authorization: Bearer <token>
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1179 Seobeo_Request_Entry *EditorLoad(Seobeo_Request_Entry *req, Dowa_Arena *arena)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1180 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1181 Seobeo_Request_Entry *resp = NULL;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1182
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1183 // Check auth token
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1184 void *auth_kv = Dowa_HashMap_Get_Ptr(req, "Authorization");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1185 if (!auth_kv)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1186 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1187 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1188 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1189 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing Authorization header\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1190 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1191 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1192
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1193 const char *auth_header = ((Seobeo_Request_Entry*)auth_kv)->value;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1194 if (strncmp(auth_header, "Bearer ", 7) != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1195 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1196 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1197 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1198 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid Authorization format\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1199 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1200 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1202 const char *token = auth_header + 7;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1203 if (strlen(g_upload_auth_token) == 0 || strcmp(token, g_upload_auth_token) != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1204 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1205 Dowa_HashMap_Push_Arena(resp, "status", "403", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1206 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1207 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid token\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1208 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1209 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1210
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1211 if (!g_db_connection)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1212 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1213 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1214 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1215 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Database not available\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1216 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1217 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1218
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1219 // Get doc_id from URL parameter
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1220 void *doc_id_kv = Dowa_HashMap_Get_Ptr(req, ":doc_id");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1221 const char *doc_id = "default";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1222 if (doc_id_kv)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1223 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1224 doc_id = ((Seobeo_Request_Entry*)doc_id_kv)->value;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1225 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1226
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1227 // Query content
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1228 const char *select_query =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1229 "SELECT content, updated_at FROM editor_content WHERE access_token = ? AND doc_id = ?";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1230 const char *params[] = { token, doc_id };
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1231
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1232 Deita_Result_Set *p_result = Deita_Query_Execute_Prepared(g_db_connection, select_query, 2, params, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1233
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1234 if (p_result && Deita_Result_Set_Next(p_result))
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1235 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1236 const char *content = Deita_Result_Set_Get_Text(p_result, 0);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1237 int64 updated_at = Deita_Result_Set_Get_Integer(p_result, 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1238
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1239 // Build JSON response - escape content
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1240 size_t content_len = content ? strlen(content) : 0;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1241 char *response_body = Dowa_Arena_Allocate(arena, content_len + 256);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1242 snprintf(response_body, content_len + 256,
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1243 "{\"doc_id\":\"%s\",\"content\":\"%s\",\"updated_at\":%lld}",
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1244 doc_id, content ? content : "", (long long)updated_at);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1245
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1246 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1247 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1248 Dowa_HashMap_Push_Arena(resp, "body", response_body, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1249
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1250 printf("[EDITOR] Loaded doc_id=%s\n", doc_id);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1251 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1252 else
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1253 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1254 // No content found, return empty
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1255 char *response_body = Dowa_Arena_Allocate(arena, 128);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1256 snprintf(response_body, 128, "{\"doc_id\":\"%s\",\"content\":\"\",\"updated_at\":0}", doc_id);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1257
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1258 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1259 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1260 Dowa_HashMap_Push_Arena(resp, "body", response_body, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1261 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1262
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1263 if (p_result) Deita_Result_Set_Free(p_result);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1264 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1265 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1266
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1267 // Media Upload API - Create media record
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1268 // POST /api/media/create
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1269 // Headers: Authorization: Bearer <token>, Content-Type: application/json
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1270 // Body: {"filename": "photo.jpg", "content_type": "image/jpeg"}
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1271 // Returns: {"media_id": 123, "upload_url": "https://...", "expires": 3600}
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1272 Seobeo_Request_Entry *MediaCreate(Seobeo_Request_Entry *req, Dowa_Arena *arena)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1273 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1274 Seobeo_Request_Entry *resp = NULL;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1275
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1276 // Check auth token
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1277 void *auth_kv = Dowa_HashMap_Get_Ptr(req, "Authorization");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1278 if (!auth_kv)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1279 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1280 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1281 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1282 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing Authorization header\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1283 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1284 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1285
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1286 const char *auth_header = ((Seobeo_Request_Entry*)auth_kv)->value;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1287 if (strncmp(auth_header, "Bearer ", 7) != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1288 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1289 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1290 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1291 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid Authorization format\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1292 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1293 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1294
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1295 const char *token = auth_header + 7;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1296 if (strlen(g_upload_auth_token) == 0 || strcmp(token, g_upload_auth_token) != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1297 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1298 Dowa_HashMap_Push_Arena(resp, "status", "403", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1299 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1300 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid token\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1301 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1302 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1303
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1304 if (!g_db_connection)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1305 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1306 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1307 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1308 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Database not available\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1309 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1310 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1311
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1312 // Parse request body
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1313 void *body_kv = Dowa_HashMap_Get_Ptr(req, "Body");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1314 if (!body_kv)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1315 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1316 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1317 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1318 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing request body\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1319 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1320 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1321
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1322 const char *body = ((Seobeo_Request_Entry*)body_kv)->value;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1323
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1324 // Parse filename and content_type
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1325 char filename[256] = {0};
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1326 char content_type[128] = "application/octet-stream";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1327
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1328 // Find "filename":"value"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1329 const char *fn_key = strstr(body, "\"filename\"");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1330 if (fn_key)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1331 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1332 const char *fn_start = strchr(fn_key + 10, '"');
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1333 if (fn_start)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1334 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1335 fn_start++;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1336 const char *fn_end = strchr(fn_start, '"');
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1337 if (fn_end && (size_t)(fn_end - fn_start) < sizeof(filename))
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1338 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1339 memcpy(filename, fn_start, fn_end - fn_start);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1340 filename[fn_end - fn_start] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1341 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1342 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1343 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1344
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1345 // Find "content_type":"value"
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1346 const char *ct_key = strstr(body, "\"content_type\"");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1347 if (ct_key)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1348 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1349 const char *ct_start = strchr(ct_key + 14, '"');
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1350 if (ct_start)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1351 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1352 ct_start++;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1353 const char *ct_end = strchr(ct_start, '"');
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1354 if (ct_end && (size_t)(ct_end - ct_start) < sizeof(content_type))
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1355 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1356 memcpy(content_type, ct_start, ct_end - ct_start);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1357 content_type[ct_end - ct_start] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1358 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1359 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1360 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1361
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1362 if (strlen(filename) == 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1363 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1364 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1365 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1366 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing filename\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1367 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1368 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1369
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1370 // Generate UUID for this upload
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1371 char *uuid = Dowa_Arena_Allocate(arena, UUID_LEN);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1372 uint32 seed =
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1373 (uint32)time(NULL) ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1374 (uint32)Seobeo_Thread_Current_Id() ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1375 counter++;
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1376 Dowa_String_UUID(seed, uuid);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1377
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1378 // Generate S3 keys
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1379 char s3_key_original[512];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1380 char s3_key_processed[512];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1381 snprintf(s3_key_original, sizeof(s3_key_original), "uploads/%s/%s", uuid, filename);
204
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1382
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1383 // Only use .webp for images
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1384 int is_image = (strncmp(content_type, "image/", 6) == 0);
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1385 if (is_image)
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1386 {
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1387 snprintf(s3_key_processed, sizeof(s3_key_processed), "uploads/%s/processed.webp", uuid);
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1388 }
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1389 else
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1390 {
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1391 s3_key_processed[0] = '\0'; // No processed version for non-images
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1392 }
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1393
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1394 // Insert into database
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1395 const char *insert_query =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1396 "INSERT INTO media_uploads (access_token, original_filename, content_type, s3_key_original, s3_key_processed, status) "
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1397 "VALUES (?, ?, ?, ?, ?, 'pending') RETURNING id";
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1398
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1399 const char *params[] = { token, filename, content_type, s3_key_original, s3_key_processed };
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1400 Deita_Result_Set *id_result = Deita_Query_Execute_Prepared(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1401 g_db_connection,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1402 insert_query,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1403 5,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1404 params,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1405 arena);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1406 if (!id_result || !Deita_Result_Set_Next(id_result))
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1407 {
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1408 if (id_result) Deita_Result_Set_Free(id_result);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1409 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1410 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1411 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Failed to create media record\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1412 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1413 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1414
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1415 int64 media_id = Deita_Result_Set_Get_Integer(id_result, 0);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
1416 Deita_Result_Set_Free(id_result);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1417
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1418 // Generate presigned PUT URL
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1419 S3_Presigned_URL presigned = S3_Presign_Put(&g_s3_config, s3_key_original, content_type, g_s3_url_expires);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1420
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1421 if (!presigned.success)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1422 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1423 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1424 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1425 char *error_body = Dowa_Arena_Allocate(arena, 256);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1426 snprintf(error_body, 256, "{\"error\":\"Failed to generate upload URL: %s\"}",
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1427 presigned.error_message ? presigned.error_message : "unknown");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1428 Dowa_HashMap_Push_Arena(resp, "body", error_body, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1429 S3_Presigned_URL_Destroy(&presigned);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1430 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1431 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1432
204
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1433 // Build public URL using CloudFront or S3
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1434 char public_url[512];
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1435 if (g_s3_cloudfront_url[0])
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1436 {
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1437 snprintf(public_url, sizeof(public_url), "%s/%s", g_s3_cloudfront_url, s3_key_original);
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1438 }
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1439 else
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1440 {
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1441 snprintf(public_url, sizeof(public_url), "https://%s.s3.%s.amazonaws.com/%s",
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1442 g_s3_bucket, g_s3_region, s3_key_original);
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1443 }
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1444
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1445 // Build response
204
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1446 char *response_body = Dowa_Arena_Allocate(arena, 4096 + strlen(presigned.url) + strlen(public_url));
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1447 snprintf(response_body, 4096 + strlen(presigned.url) + strlen(public_url),
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1448 "{\"media_id\":%lld,\"upload_url\":\"%s\",\"public_url\":\"%s\",\"expires\":%d}",
e5aed6c36672 [Notes] Added icons and updated styling a bit. Probalby usable now.
MrJuneJune <me@mrjunejune.com>
parents: 202
diff changeset
1449 (long long)media_id, presigned.url, public_url, g_s3_url_expires);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1450
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1451 S3_Presigned_URL_Destroy(&presigned);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1452
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1453 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1454 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1455 Dowa_HashMap_Push_Arena(resp, "body", response_body, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1456
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1457 printf("[MEDIA] Created media_id=%lld, file=%s\n", (long long)media_id, filename);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1458
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1459 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1460 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1461
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1462 // Worker-pool task for S3 media processing.
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1463 void Media_Process_Background(void *arg)
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1464 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1465 Media_Processing_Context *ctx = (Media_Processing_Context *)arg;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1466
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1467 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Background worker started for media_id=%lld\n", (long long)ctx->media_id);
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1468 Seobeo_Log(SEOBEO_INFO, "[MEDIA] S3 key original: %s\n", ctx->s3_key_original);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1469 Seobeo_Log(SEOBEO_INFO, "[MEDIA] S3 key processed: %s\n", ctx->s3_key_processed);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1470 Seobeo_Log(SEOBEO_INFO, "[MEDIA] DB path: %s\n", ctx->db_path);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1471
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1472 // Open a worker-local DB connection.
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1473 Deita_Connection *db_conn = Deita_Connection_Create(DEITA_DATABASE_TYPE_SQLITE3, ctx->db_path);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1474 if (!db_conn || !Deita_Connection_Is_Open(db_conn))
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1475 {
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1476 Seobeo_Log(SEOBEO_ERROR, "[MEDIA] Worker ERROR: Failed to open database for media_id=%lld\n", (long long)ctx->media_id);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1477 return;
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1478 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1479
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1480 // Update status to 'processing'
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1481 const char *update_processing =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1482 "UPDATE media_uploads SET status='processing', updated_at=strftime('%s','now') WHERE id=?";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1483 char media_id_str[32];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1484 snprintf(media_id_str, sizeof(media_id_str), "%lld", (long long)ctx->media_id);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1485 const char *params[] = { media_id_str };
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1486 int32 update_result = Deita_Query_Execute_Update_Prepared(db_conn, update_processing, 1, params);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1487 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Updated status to 'processing' for media_id=%lld (result=%d)\n", (long long)ctx->media_id, update_result);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1488
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1489 // Generate presigned GET URL for download (10 min expiry)
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1490 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Generating presigned GET URL for media_id=%lld\n", (long long)ctx->media_id);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1491 S3_Presigned_URL download_url = S3_Presign_Get(&ctx->s3_config, ctx->s3_key_original, 600);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1492 if (!download_url.success)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1493 {
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1494 const char *error_msg = download_url.error_message ? download_url.error_message : "Failed to generate download URL";
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1495 Seobeo_Log(SEOBEO_ERROR, "[MEDIA] ERROR: Failed to generate download URL for media_id=%lld: %s\n",
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1496 (long long)ctx->media_id, error_msg);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1497 const char *update_error =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1498 "UPDATE media_uploads SET status='error', error_message=?, updated_at=strftime('%s','now') WHERE id=?";
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1499 const char *error_params[] = { error_msg, media_id_str };
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1500 Deita_Query_Execute_Update_Prepared(db_conn, update_error, 2, error_params);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1501 S3_Presigned_URL_Destroy(&download_url);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1502 Deita_Connection_Close(db_conn);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1503 return;
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1504 }
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1505 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Generated presigned URL: %.100s...\n", download_url.url);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1506
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1507 // Generate temp file paths
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1508 char tmp_input[256];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1509 char tmp_output[256];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1510 char *uuid_input = malloc(UUID_LEN);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1511 char *uuid_output = malloc(UUID_LEN);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1512 uint32 seed1 =
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1513 (uint32)time(NULL) ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1514 (uint32)Seobeo_Thread_Current_Id() ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1515 counter++;
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1516 uint32 seed2 =
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1517 (uint32)time(NULL) ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1518 (uint32)Seobeo_Thread_Current_Id() ^
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1519 counter++;
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1520 Dowa_String_UUID(seed1, uuid_input);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1521 Dowa_String_UUID(seed2, uuid_output);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1522 snprintf(tmp_input, sizeof(tmp_input), "/tmp/%s", uuid_input);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1523 snprintf(tmp_output, sizeof(tmp_output), "/tmp/%s.webp", uuid_output);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1524 free(uuid_input);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1525 free(uuid_output);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1526
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1527 // Download from S3
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1528 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Downloading from S3 to %s for media_id=%lld\n", tmp_input, (long long)ctx->media_id);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1529 Seobeo_Client_Request *download_req = Seobeo_Client_Request_Create(download_url.url);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1530 Seobeo_Client_Request_Set_Download_Path(download_req, tmp_input);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1531 Seobeo_Client_Response *download_resp = Seobeo_Client_Request_Execute(download_req);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1532
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1533 S3_Presigned_URL_Destroy(&download_url);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1534
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1535 if (!download_resp || download_resp->status_code != 200)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1536 {
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1537 int status = download_resp ? download_resp->status_code : 0;
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1538 Seobeo_Log(SEOBEO_ERROR, "[MEDIA] ERROR: Failed to download from S3 for media_id=%lld (status=%d)\n",
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1539 (long long)ctx->media_id, status);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1540 const char *update_error =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1541 "UPDATE media_uploads SET status='error', error_message=?, updated_at=strftime('%s','now') WHERE id=?";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1542 const char *error_params[] = { "Failed to download from S3", media_id_str };
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1543 Deita_Query_Execute_Update_Prepared(db_conn, update_error, 2, error_params);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1544 if (download_req) Seobeo_Client_Request_Destroy(download_req);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1545 if (download_resp) Seobeo_Client_Response_Destroy(download_resp);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1546 unlink(tmp_input);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1547 Deita_Connection_Close(db_conn);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1548 return;
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1549 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1550
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1551 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Successfully downloaded file to %s\n", tmp_input);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1552 Seobeo_Client_Request_Destroy(download_req);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1553 Seobeo_Client_Response_Destroy(download_resp);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1554
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1555 // Convert to webp using FFmpeg
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1556 char cmd[1024];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1557 char log_file[256];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1558 snprintf(log_file, sizeof(log_file), "/tmp/ffmpeg_%lld.log", (long long)ctx->media_id);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1559 snprintf(cmd, sizeof(cmd), "ffmpeg -y -i %s -quality 80 %s 2>%s",
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1560 tmp_input, tmp_output, log_file);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1561
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1562 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Running FFmpeg: %s\n", cmd);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1563 int ffmpeg_result = system(cmd);
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1564 Seobeo_Log(SEOBEO_INFO, "[MEDIA] FFmpeg result: %d for media_id=%lld\n", ffmpeg_result, (long long)ctx->media_id);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1565
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1566 if (ffmpeg_result != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1567 {
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1568 Seobeo_Log(SEOBEO_ERROR, "[MEDIA] ERROR: FFmpeg conversion failed for media_id=%lld (exit code %d). Check log: %s\n",
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1569 (long long)ctx->media_id, ffmpeg_result, log_file);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1570 const char *update_error =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1571 "UPDATE media_uploads SET status='error', error_message=?, updated_at=strftime('%s','now') WHERE id=?";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1572 const char *error_params[] = { "Image conversion failed", media_id_str };
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1573 Deita_Query_Execute_Update_Prepared(db_conn, update_error, 2, error_params);
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1574 unlink(tmp_input);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1575 unlink(tmp_output);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1576 Deita_Connection_Close(db_conn);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1577 return;
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1578 }
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1579 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Successfully converted to webp: %s\n", tmp_output);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1580
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1581 // Upload processed file to S3
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1582 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Uploading processed file to S3: %s -> %s\n", tmp_output, ctx->s3_key_processed);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1583 S3_Result upload_result = S3_Upload_File_With_Content_Type(
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1584 &ctx->s3_config, tmp_output, ctx->s3_key_processed, "image/webp");
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1585
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1586 if (!upload_result.success)
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1587 {
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1588 const char *error_msg = upload_result.error_message ? upload_result.error_message : "Failed to upload processed file";
206
240337164a80 [Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents: 204
diff changeset
1589 Seobeo_Log(SEOBEO_ERROR, "[MEDIA] ERROR: Failed to upload processed file for media_id=%lld: %s (HTTP status: %d)\n",
240337164a80 [Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents: 204
diff changeset
1590 (long long)ctx->media_id, error_msg, upload_result.status_code);
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1591 const char *update_error =
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1592 "UPDATE media_uploads SET status='error', error_message=?, updated_at=strftime('%s','now') WHERE id=?";
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1593 const char *error_params[] = { error_msg, media_id_str };
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1594 Deita_Query_Execute_Update_Prepared(db_conn, update_error, 2, error_params);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1595 unlink(tmp_input);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1596 unlink(tmp_output);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1597 Deita_Connection_Close(db_conn);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1598 return;
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1599 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1600
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1601 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Successfully uploaded processed file to S3\n");
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1602
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1603 // Update status to 'finished'
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1604 const char *update_finished =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1605 "UPDATE media_uploads SET status='finished', updated_at=strftime('%s','now') WHERE id=?";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1606 Deita_Query_Execute_Update_Prepared(db_conn, update_finished, 1, params);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1607
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1608 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Successfully processed media_id=%lld - COMPLETE\n", (long long)ctx->media_id);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1609
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1610 // Cleanup
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1611 unlink(tmp_input);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1612 unlink(tmp_output);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1613 Deita_Connection_Close(db_conn);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1614 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1615
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1616 // Media Upload API - Mark uploaded
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1617 // POST /api/media/:id/uploaded
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1618 // Headers: Authorization: Bearer <token>
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1619 Seobeo_Request_Entry *MediaUploaded(Seobeo_Request_Entry *req, Dowa_Arena *arena)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1620 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1621 Seobeo_Request_Entry *resp = NULL;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1622
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1623 // Check auth token
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1624 void *auth_kv = Dowa_HashMap_Get_Ptr(req, "Authorization");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1625 if (!auth_kv)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1626 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1627 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1628 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1629 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing Authorization header\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1630 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1631 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1632
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1633 const char *auth_header = ((Seobeo_Request_Entry*)auth_kv)->value;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1634 if (strncmp(auth_header, "Bearer ", 7) != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1635 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1636 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1637 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1638 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid Authorization format\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1639 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1640 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1641
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1642 const char *token = auth_header + 7;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1643 if (strlen(g_upload_auth_token) == 0 || strcmp(token, g_upload_auth_token) != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1644 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1645 Dowa_HashMap_Push_Arena(resp, "status", "403", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1646 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1647 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid token\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1648 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1649 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1650
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1651 if (!g_db_connection)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1652 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1653 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1654 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1655 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Database not available\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1656 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1657 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1658
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1659 // Extract media_id from URL params
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1660 void *id_kv = Dowa_HashMap_Get_Ptr(req, ":id");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1661 if (!id_kv)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1662 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1663 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1664 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1665 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing media ID\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1666 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1667 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1668
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1669 const char *media_id_str = ((Seobeo_Request_Entry*)id_kv)->value;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1670 int64 media_id = atoll(media_id_str);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1671
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1672 // Verify access_token matches and get content_type
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1673 const char *select_query =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1674 "SELECT content_type, s3_key_original, s3_key_processed FROM media_uploads WHERE id = ? AND access_token = ?";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1675 const char *select_params[] = { media_id_str, token };
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1676
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1677 Deita_Result_Set *p_result = Deita_Query_Execute_Prepared(g_db_connection, select_query, 2, select_params, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1678
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1679 if (!p_result || !Deita_Result_Set_Next(p_result))
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1680 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1681 if (p_result) Deita_Result_Set_Free(p_result);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1682 Dowa_HashMap_Push_Arena(resp, "status", "404", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1683 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1684 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Media not found or access denied\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1685 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1686 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1687
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1688 const char *content_type = Deita_Result_Set_Get_Text(p_result, 0);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1689 const char *s3_key_original = Deita_Result_Set_Get_Text(p_result, 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1690 const char *s3_key_processed = Deita_Result_Set_Get_Text(p_result, 2);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1691
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1692 // Copy values before freeing result set
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1693 char content_type_copy[128];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1694 char s3_key_original_copy[512];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1695 char s3_key_processed_copy[512];
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1696 strncpy(content_type_copy, content_type, sizeof(content_type_copy) - 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1697 strncpy(s3_key_original_copy, s3_key_original, sizeof(s3_key_original_copy) - 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1698 strncpy(s3_key_processed_copy, s3_key_processed, sizeof(s3_key_processed_copy) - 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1699 content_type_copy[sizeof(content_type_copy) - 1] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1700 s3_key_original_copy[sizeof(s3_key_original_copy) - 1] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1701 s3_key_processed_copy[sizeof(s3_key_processed_copy) - 1] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1702
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1703 Deita_Result_Set_Free(p_result);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1704
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1705 // Update status to 'uploaded'
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1706 const char *update_query =
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1707 "UPDATE media_uploads SET status='uploaded', updated_at=strftime('%s','now') WHERE id=?";
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1708 const char *update_params[] = { media_id_str };
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1709 int32 result = Deita_Query_Execute_Update_Prepared(g_db_connection, update_query, 1, update_params);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1710
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1711 if (result < 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1712 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1713 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1714 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1715 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Failed to update status\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1716 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1717 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1718
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1719 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Content type for media_id=%lld: '%s'\n", (long long)media_id, content_type_copy);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1720
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1721 // Images are processed asynchronously by the bounded media pool.
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1722 if (strncmp(content_type_copy, "image/", 6) == 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1723 {
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1724 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Queueing image processing for media_id=%lld\n", (long long)media_id);
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1725
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1726 // The pool owns this context after a successful submission.
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1727 Media_Processing_Context *ctx = malloc(sizeof(Media_Processing_Context));
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1728 if (!ctx)
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1729 {
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1730 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1731 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1732 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Unable to allocate media work\"}", arena);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1733 return resp;
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1734 }
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1735 ctx->media_id = media_id;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1736 strncpy(ctx->s3_key_original, s3_key_original_copy, sizeof(ctx->s3_key_original) - 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1737 strncpy(ctx->s3_key_processed, s3_key_processed_copy, sizeof(ctx->s3_key_processed) - 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1738 strncpy(ctx->content_type, content_type_copy, sizeof(ctx->content_type) - 1);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1739 strncpy(ctx->access_token, token, sizeof(ctx->access_token) - 1);
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1740 strncpy(ctx->db_path, g_db_path, sizeof(ctx->db_path) - 1);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1741 ctx->s3_key_original[sizeof(ctx->s3_key_original) - 1] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1742 ctx->s3_key_processed[sizeof(ctx->s3_key_processed) - 1] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1743 ctx->content_type[sizeof(ctx->content_type) - 1] = '\0';
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1744 ctx->access_token[sizeof(ctx->access_token) - 1] = '\0';
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1745 ctx->db_path[sizeof(ctx->db_path) - 1] = '\0';
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1746 ctx->s3_config = g_s3_config;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1747
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1748 Seobeo_Worker_Result worker_result =
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1749 g_media_worker_pool
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1750 ? Seobeo_Worker_Pool_Submit(
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1751 g_media_worker_pool,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1752 Media_Process_Background,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1753 ctx,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1754 free)
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1755 : SEOBEO_WORKER_STOPPED;
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1756 if (worker_result != SEOBEO_WORKER_OK)
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1757 {
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1758 Seobeo_Log(
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1759 SEOBEO_ERROR,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1760 "[MEDIA] Worker submission failed with result=%d for media_id=%lld\n",
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1761 worker_result,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1762 (long long)media_id);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1763 free(ctx);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1764 const char *update_error =
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1765 "UPDATE media_uploads SET status='error', error_message=?, updated_at=strftime('%s','now') WHERE id=?";
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1766 const char *error_params[] = {
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1767 "Media worker queue is unavailable",
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1768 media_id_str,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1769 };
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1770 Deita_Query_Execute_Update_Prepared(
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1771 g_db_connection,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1772 update_error,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1773 2,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1774 error_params);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1775 Dowa_HashMap_Push_Arena(resp, "status", "503", arena);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1776 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1777 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Media worker queue is unavailable\"}", arena);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1778 return resp;
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1779 }
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1780 Seobeo_Log(
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1781 SEOBEO_INFO,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1782 "[MEDIA] Submitted media_id=%lld to the worker pool\n",
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
1783 (long long)media_id);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1784 }
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1785 else
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1786 {
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1787 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Non-image file, skipping background processing for media_id=%lld\n", (long long)media_id);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1788 }
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1789
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1790 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1791 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1792 Dowa_HashMap_Push_Arena(resp, "body", "{\"success\":true,\"status\":\"uploaded\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1793
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1794 Seobeo_Log(SEOBEO_INFO, "[MEDIA] Marked uploaded media_id=%lld\n", (long long)media_id);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1795
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1796 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1797 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1798
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1799 // Media Upload API - Get status
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1800 // GET /api/media/:id/status
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1801 // Headers: Authorization: Bearer <token>
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1802 // Returns: {"id": 123, "status": "finished", "processed_url": "https://...", "error_message": null}
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1803 Seobeo_Request_Entry *MediaStatus(Seobeo_Request_Entry *req, Dowa_Arena *arena)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1804 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1805 Seobeo_Request_Entry *resp = NULL;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1806
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1807 // Check auth token
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1808 void *auth_kv = Dowa_HashMap_Get_Ptr(req, "Authorization");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1809 if (!auth_kv)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1810 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1811 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1812 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1813 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing Authorization header\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1814 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1815 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1816
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1817 const char *auth_header = ((Seobeo_Request_Entry*)auth_kv)->value;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1818 if (strncmp(auth_header, "Bearer ", 7) != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1819 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1820 Dowa_HashMap_Push_Arena(resp, "status", "401", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1821 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1822 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid Authorization format\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1823 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1824 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1825
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1826 const char *token = auth_header + 7;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1827 if (strlen(g_upload_auth_token) == 0 || strcmp(token, g_upload_auth_token) != 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1828 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1829 Dowa_HashMap_Push_Arena(resp, "status", "403", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1830 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1831 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Invalid token\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1832 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1833 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1834
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1835 if (!g_db_connection)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1836 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1837 Dowa_HashMap_Push_Arena(resp, "status", "500", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1838 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1839 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Database not available\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1840 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1841 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1842
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1843 // Extract media_id from URL params
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1844 void *id_kv = Dowa_HashMap_Get_Ptr(req, ":id");
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1845 if (!id_kv)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1846 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1847 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1848 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1849 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Missing media ID\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1850 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1851 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1852
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1853 const char *media_id_str = ((Seobeo_Request_Entry*)id_kv)->value;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1854
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1855 // Query media status
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1856 const char *select_query =
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1857 "SELECT id, status, s3_key_original, s3_key_processed, error_message FROM media_uploads WHERE id = ? AND access_token = ?";
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1858 const char *select_params[] = { media_id_str, token };
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1859
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1860 Deita_Result_Set *p_result = Deita_Query_Execute_Prepared(g_db_connection, select_query, 2, select_params, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1861
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1862 if (!p_result || !Deita_Result_Set_Next(p_result))
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1863 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1864 if (p_result) Deita_Result_Set_Free(p_result);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1865 Dowa_HashMap_Push_Arena(resp, "status", "404", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1866 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1867 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Media not found\"}", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1868 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1869 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1870
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1871 int64 id = Deita_Result_Set_Get_Integer(p_result, 0);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1872 const char *status = Deita_Result_Set_Get_Text(p_result, 1);
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1873 const char *s3_key_original = Deita_Result_Set_Get_Text(p_result, 2);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1874 const char *s3_key_processed = Deita_Result_Set_Get_Text(p_result, 3);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1875 const char *error_message = Deita_Result_Set_Get_Text(p_result, 4);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1876
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1877 // Build CloudFront URL for processed file if status is 'finished'
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1878 char processed_url[1024] = {0};
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1879 if (strcmp(status, "finished") == 0 && s3_key_processed && strlen(s3_key_processed) > 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1880 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1881 if (g_s3_cloudfront_url[0])
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1882 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1883 snprintf(processed_url, sizeof(processed_url), "%s/%s", g_s3_cloudfront_url, s3_key_processed);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1884 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1885 else
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1886 {
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1887 snprintf(processed_url, sizeof(processed_url), "https://%s.s3.%s.amazonaws.com/%s",
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1888 g_s3_bucket, g_s3_region, s3_key_processed);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1889 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1890 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1891
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1892 // Build CloudFront URL for original file (for non-images or before processing completes)
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1893 char original_url[1024] = {0};
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1894 if (s3_key_original && strlen(s3_key_original) > 0)
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1895 {
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1896 if (g_s3_cloudfront_url[0])
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1897 {
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1898 snprintf(original_url, sizeof(original_url), "%s/%s", g_s3_cloudfront_url, s3_key_original);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1899 }
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1900 else
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1901 {
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1902 snprintf(original_url, sizeof(original_url), "https://%s.s3.%s.amazonaws.com/%s",
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1903 g_s3_bucket, g_s3_region, s3_key_original);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1904 }
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1905 }
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1906
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1907 // Build JSON response with both processed_url and original_url
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1908 char *response_body = Dowa_Arena_Allocate(arena, 3072);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1909
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1910 // Build the base response
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1911 int offset = snprintf(response_body, 3072,
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1912 "{\"id\":%lld,\"status\":\"%s\",",
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1913 (long long)id, status);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1914
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1915 // Add processed_url
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1916 if (strlen(processed_url) > 0)
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1917 {
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1918 offset += snprintf(response_body + offset, 3072 - offset,
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1919 "\"processed_url\":\"%s\",", processed_url);
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1920 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1921 else
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1922 {
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1923 offset += snprintf(response_body + offset, 3072 - offset,
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1924 "\"processed_url\":null,");
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1925 }
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1926
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1927 // Add original_url
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1928 if (strlen(original_url) > 0)
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1929 {
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1930 offset += snprintf(response_body + offset, 3072 - offset,
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1931 "\"original_url\":\"%s\",", original_url);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1932 }
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1933 else
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1934 {
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1935 offset += snprintf(response_body + offset, 3072 - offset,
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1936 "\"original_url\":null,");
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1937 }
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1938
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1939 // Add error_message
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1940 if (error_message && strlen(error_message) > 0)
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1941 {
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1942 snprintf(response_body + offset, 3072 - offset,
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1943 "\"error_message\":\"%s\"}", error_message);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1944 }
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1945 else
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1946 {
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1947 snprintf(response_body + offset, 3072 - offset,
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
1948 "\"error_message\":null}");
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1949 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1950
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1951 Deita_Result_Set_Free(p_result);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1952
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1953 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1954 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1955 Dowa_HashMap_Push_Arena(resp, "body", response_body, arena);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1956
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1957 return resp;
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1958 }
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
1959
7
114cad94008f [Seobeo] Updated to support thread and edge server calls.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
1960 int main(void)
114cad94008f [Seobeo] Updated to support thread and edge server calls.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
1961 {
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1962 // Load server config
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1963 load_config("mrjunejune/.config");
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1964
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1965 // Load S3 credentials from .env
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1966 FILE *env_file = fopen(".env", "r");
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1967 static char s3_access_key[128] = {0};
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1968 static char s3_secret_key[128] = {0};
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1969
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1970 if (env_file)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1971 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1972 char line[512];
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1973 while (fgets(line, sizeof(line), env_file))
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1974 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1975 if (strncmp(line, "AWS_MRJUNEJUNE_ACCESS_KEY=", 26) == 0)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1976 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1977 char *val = line + 26;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1978 size_t len = strlen(val);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1979 while (len > 0 && (val[len-1] == '\n' || val[len-1] == '\r')) val[--len] = '\0';
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1980 strncpy(s3_access_key, val, sizeof(s3_access_key) - 1);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1981 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1982 else if (strncmp(line, "AWS_MRJUNEJUNE_SECRET_ACCESS_KEY=", 33) == 0)
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1983 {
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1984 char *val = line + 33;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1985 size_t len = strlen(val);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1986 while (len > 0 && (val[len-1] == '\n' || val[len-1] == '\r')) val[--len] = '\0';
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1987 strncpy(s3_secret_key, val, sizeof(s3_secret_key) - 1);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1988 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1989 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1990 fclose(env_file);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1991 }
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1992
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1993 // Initialize S3 config
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1994 g_s3_config.access_key_id = s3_access_key;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1995 g_s3_config.secret_access_key = s3_secret_key;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1996 g_s3_config.region = g_s3_region;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1997 g_s3_config.bucket = g_s3_bucket;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1998 g_s3_config.endpoint = NULL;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
1999 g_s3_config.use_path_style = FALSE;
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
2000
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
2001 printf("[S3] Configured: region=%s, bucket=%s, key=%s...\n",
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
2002 g_s3_region, g_s3_bucket, s3_access_key[0] ? "***" : "(missing)");
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
2003
202
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
2004 // Show current working directory
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
2005 char cwd[1024];
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
2006 if (getcwd(cwd, sizeof(cwd)) != NULL)
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
2007 {
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
2008 printf("[STARTUP] Current working directory: %s\n", cwd);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
2009 printf("[STARTUP] Database path (relative): %s\n", g_db_path);
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
2010 }
b9b184b3303c [Notes] Images get processed and it is properly fetched. Thank you.
MrJuneJune <me@mrjunejune.com>
parents: 201
diff changeset
2011
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2012 // Initialize database
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2013 init_database();
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2014
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
2015 g_media_worker_pool = Seobeo_Worker_Pool_Create(2, 16);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
2016 if (!g_media_worker_pool)
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
2017 {
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
2018 Seobeo_Log(
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
2019 SEOBEO_ERROR,
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
2020 "[MEDIA] Unable to initialize the media worker pool\n");
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
2021 }
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
2022
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
2023 Seobeo_Router_Init();
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
2024
77
c348ac875294 [Seobeo] Server side rendering.
June Park <parkjune1995@gmail.com>
parents: 72
diff changeset
2025 Seobeo_Router_Register("GET", "/", GetHomePage);
79
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
2026 Seobeo_Router_Register("GET", "/index.html", GetRedirectHomePage);
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
2027
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
2028 Seobeo_Router_Register("GET", "/resume", GetResume);
79
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
2029 Seobeo_Router_Register("GET", "/resume/index.html", GetRedirectResume);
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
2030
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
2031 Seobeo_Router_Register("GET", "/tools", GetTools);
79
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
2032 Seobeo_Router_Register("GET", "/tools/index.html", GetRedirectTools);
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
2033
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
2034 Seobeo_Router_Register("GET", "/tools/markdown_to_html", GetMDToHTML);
79
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
2035 Seobeo_Router_Register("GET", "/tools/markdown_to_html/index.html", GetRedirectMarkDownToHtml);
78
June Park <parkjune1995@gmail.com>
parents: 77
diff changeset
2036
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
2037 Seobeo_Router_Register("GET", "/tools/file_converter", GetFileConverter);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
2038 Seobeo_Router_Register("GET", "/tools/file_converter/index.html", GetRedirectFileConverter);
242
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
2039 Seobeo_Router_Register("GET", "/tools/hls_player", GetHlsPlayer);
543df0fe7168 [tools] Add full HLS player support
MrJuneJune <me@mrjunejune.com>
parents: 241
diff changeset
2040 Seobeo_Router_Register("GET", "/tools/hls_player/index.html", GetRedirectHlsPlayer);
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
2041 Seobeo_Router_Register("GET", "/tools/latex_editor", GetLatexEditor);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
2042 Seobeo_Router_Register("GET", "/tools/latex_editor/index.html", GetRedirectLatexEditor);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
2043
100
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
2044 // -- File converter --/
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
2045 Seobeo_Router_Register("POST", "/api/convert/image-to-webp", ConvertImageToWebP);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
2046 Seobeo_Router_Register("POST", "/api/convert/video-to-mp4", ConvertVideoToMP4);
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
2047 Seobeo_Router_Register("GET", "/api/download/:filename", DownloadConvertedFile);
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
2048 Seobeo_Router_Register("POST", "/api/latex/render", RenderLatexPdf);
92
655ea0b661fd [Seobeo] Added few endpoints for handling files. [Dowa] Added few functions for random number and generating uuids
June Park <parkjune1995@gmail.com>
parents: 89
diff changeset
2049
200
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
2050 // -- S3 Upload --/
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
2051 Seobeo_Router_Register("POST", "/api/s3/upload-url", GetS3UploadUrl);
90dfcef375fb Added my own s3 bucket uploader url to mrjunejune.
MrJuneJune <me@mrjunejune.com>
parents: 169
diff changeset
2052
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2053 // -- Media Upload --/
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2054 Seobeo_Router_Register("POST", "/api/media/create", MediaCreate);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2055 Seobeo_Router_Register("POST", "/api/media/:id/uploaded", MediaUploaded);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2056 Seobeo_Router_Register("GET", "/api/media/:id/status", MediaStatus);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2057
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2058 // -- Editor --/
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2059 Seobeo_Router_Register("POST", "/api/editor/save", EditorSave);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2060 Seobeo_Router_Register("GET", "/api/editor/load/:doc_id", EditorLoad);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2061
100
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
2062 // -- Blog --/
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
2063 Seobeo_Router_Register("GET", "/blog", RenderBlogList);
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
2064 Seobeo_Router_Register("GET", "/blog/:blog_id", RenderBlog);
65e5a5b89a4e [Seobeo] Migrated everything to this page.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
2065
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
2066 // -- Talk --/
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
2067 Seobeo_Router_Register("GET", "/talk", GetTalk);
128
7eb79fd91c7e [Misc] Fixed all bazel targets. I should creat a separate scripts for these lol.
June Park <parkjune1995@gmail.com>
parents: 125
diff changeset
2068 Seobeo_Router_Register("GET", "/talk/index.html", GetRedirectTalk);
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
2069
259
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
2070 #if defined(MRJUNEJUNE_ENABLE_DEV_PAGES)
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
2071 // -- Development pages --/
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
2072 Seobeo_Router_Register("GET", "/jrpg", GetJrpg);
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
2073 Seobeo_Router_Register("GET", "/jrpg/index.html", GetRedirectJrpg);
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
2074 #endif
667156fcd3e3 Add dev-only cyberpunk JRPG page
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
2075
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2076 // -- Notes --/
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2077 Seobeo_Router_Register("GET", "/notes", GetNotes);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2078 Seobeo_Router_Register("GET", "/notes/", GetNotes);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2079 Seobeo_Router_Register("GET", "/notes/index.html", GetNotes);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2080 Seobeo_Router_Register("GET", "/notes/login", GetNotesLogin);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2081 Seobeo_Router_Register("GET", "/notes/login/", GetNotesLogin);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2082 Seobeo_Router_Register("GET", "/notes/:note_id", GetNoteById);
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2083
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
2084 Seobeo_WebSocket_Server_Init();
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
2085 Seobeo_WebSocket_Server_Register("/chat", Chat_Handler, NULL);
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 124
diff changeset
2086
201
6cdee35a7ba9 [MrJuneJune] notes
MrJuneJune <me@mrjunejune.com>
parents: 200
diff changeset
2087 Seobeo_Log(SEOBEO_INFO, "WTF is going on\n");
241
9c2eec61a152 [assets] Generate site images as WebP with Bazel
MrJuneJune <me@mrjunejune.com>
parents: 216
diff changeset
2088 const char *server_port = getenv("MRJUNEJUNE_PORT");
9c2eec61a152 [assets] Generate site images as WebP with Bazel
MrJuneJune <me@mrjunejune.com>
parents: 216
diff changeset
2089 if (!server_port || server_port[0] == '\0')
9c2eec61a152 [assets] Generate site images as WebP with Bazel
MrJuneJune <me@mrjunejune.com>
parents: 216
diff changeset
2090 server_port = "6969";
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 242
diff changeset
2091 Seobeo_Web_Server_Start("mrjunejune/src", server_port, SEOBEO_MODE_EDGE, 4);
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
2092 Seobeo_Worker_Pool_Destroy(g_media_worker_pool);
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 248
diff changeset
2093 g_media_worker_pool = NULL;
7
114cad94008f [Seobeo] Updated to support thread and edge server calls.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
2094 }