66 lines
2.4 KiB
HolyC
66 lines
2.4 KiB
HolyC
U0 @slon_api_v2_media_post(SlonHttpSession* session)
|
|
{
|
|
// NOTE: We only support images at the moment
|
|
|
|
SLON_SCRATCH_BUFFER_AND_REQUEST_JSON
|
|
|
|
if (@slon_api_authorized(session)) {
|
|
|
|
if (!request_json->@("file")) {
|
|
session->status(400);
|
|
return;
|
|
}
|
|
|
|
SlonMultipartFile* file = request_json->@("file");
|
|
if (!file->buffer || !file->size || !file->content_type) {
|
|
session->status(400);
|
|
return;
|
|
}
|
|
|
|
U8* media_id = @slon_api_generate_unique_id(session);
|
|
U8* media_file_ext = StrFind("/", file->content_type) + 1;
|
|
|
|
I32 width = 0;
|
|
I32 height = 0;
|
|
I32 comp = 0;
|
|
I32 code = @stbi_info_from_memory(file->buffer, file->size, &width, &height, &comp);
|
|
|
|
// Buffer contains a valid image file
|
|
if (code != 1) {
|
|
session->status(400);
|
|
return;
|
|
}
|
|
|
|
// Write image file to RAM disk
|
|
StrPrint(scratch_buffer, "%s/%s.%s", SLON_MEDIA_PATH, media_id, media_file_ext);
|
|
FileWrite(scratch_buffer, file->buffer, file->size);
|
|
|
|
// Create media object
|
|
JsonObject* media_object = Json.CreateObject();
|
|
media_object->set("id", media_id, JSON_STRING);
|
|
media_object->set("type", "image", JSON_STRING);
|
|
media_object->set("url", NULL, JSON_NULL);
|
|
media_object->set("preview_url", NULL, JSON_NULL);
|
|
media_object->set("remote_url", NULL, JSON_NULL);
|
|
media_object->set("meta", Json.CreateObject(), JSON_OBJECT);
|
|
media_object->o("meta")->set("original", Json.CreateObject(), JSON_OBJECT);
|
|
media_object->o("meta")->o("original")->set("width", width, JSON_NUMBER);
|
|
media_object->o("meta")->o("original")->set("height", height, JSON_NUMBER);
|
|
media_object->set("description", NULL, JSON_NULL);
|
|
media_object->set("blurhash", NULL, JSON_NULL);
|
|
db->o("media")->set(media_id, media_object, JSON_OBJECT);
|
|
|
|
// Then, async upload the image file to Catbox
|
|
SlonCatboxUpload* cb = CAlloc(sizeof(SlonCatboxUpload), slon_mem_task);
|
|
cb->key = media_object->@("url", TRUE);
|
|
cb->filepath = StrNew(scratch_buffer, slon_mem_task);
|
|
Spawn(&@slon_api_async_upload_to_catbox, cb, "SlonAsyncCatboxUpload");
|
|
|
|
session->send(media_object);
|
|
session->status(202);
|
|
|
|
@slon_free(session, media_id);
|
|
} else {
|
|
session->status(401);
|
|
}
|
|
}
|