annotate mrjunejune/main.c @ 263:ee04e4e69fed

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