diff --git a/modules/frontend/src/api/sdk.gen.ts b/modules/frontend/src/api/sdk.gen.ts index 7d46120..24153db 100644 --- a/modules/frontend/src/api/sdk.gen.ts +++ b/modules/frontend/src/api/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { AddUserTitleData, AddUserTitleErrors, AddUserTitleResponses, DeleteUserTitleData, DeleteUserTitleErrors, DeleteUserTitleResponses, GetTitleData, GetTitleErrors, GetTitleResponses, GetTitlesData, GetTitlesErrors, GetTitlesResponses, GetUsersData, GetUsersErrors, GetUsersIdData, GetUsersIdErrors, GetUsersIdResponses, GetUsersResponses, GetUserTitleData, GetUserTitleErrors, GetUserTitleResponses, GetUserTitlesData, GetUserTitlesErrors, GetUserTitlesResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UpdateUserTitleData, UpdateUserTitleErrors, UpdateUserTitleResponses } from './types.gen'; +import type { AddUserTitleData, AddUserTitleErrors, AddUserTitleResponses, DeleteUserTitleData, DeleteUserTitleErrors, DeleteUserTitleResponses, GetTitleData, GetTitleErrors, GetTitleResponses, GetTitlesData, GetTitlesErrors, GetTitlesResponses, GetUsersData, GetUsersErrors, GetUsersIdData, GetUsersIdErrors, GetUsersIdResponses, GetUsersResponses, GetUserTitleData, GetUserTitleErrors, GetUserTitleResponses, GetUserTitlesData, GetUserTitlesErrors, GetUserTitlesResponses, PostMediaUploadData, PostMediaUploadErrors, PostMediaUploadResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UpdateUserTitleData, UpdateUserTitleErrors, UpdateUserTitleResponses } from './types.gen'; export type Options = Options2 & { /** @@ -113,3 +113,18 @@ export const updateUserTitle = (options: O ...options.headers } }); + +/** + * Upload an image (PNG, JPEG, or WebP) + * + * Uploads a single image file. Supported formats: **PNG**, **JPEG/JPG**, **WebP**. + * + */ +export const postMediaUpload = (options: Options) => (options.client ?? client).post({ + url: '/media/upload', + ...options, + headers: { + 'Content-Type': 'encoding', + ...options.headers + } +}); diff --git a/modules/frontend/src/api/types.gen.ts b/modules/frontend/src/api/types.gen.ts index d4526a7..d0ca425 100644 --- a/modules/frontend/src/api/types.gen.ts +++ b/modules/frontend/src/api/types.gen.ts @@ -453,6 +453,7 @@ export type AddUserTitleData = { title_id: number; status: UserTitleStatus; rate?: number; + ftime?: string; }; path: { /** @@ -578,6 +579,7 @@ export type UpdateUserTitleData = { body: { status?: UserTitleStatus; rate?: number; + ftime?: string; }; path: { user_id: number; @@ -618,3 +620,38 @@ export type UpdateUserTitleResponses = { }; export type UpdateUserTitleResponse = UpdateUserTitleResponses[keyof UpdateUserTitleResponses]; + +export type PostMediaUploadData = { + body: unknown; + path?: never; + query?: never; + url: '/media/upload'; +}; + +export type PostMediaUploadErrors = { + /** + * Bad request — e.g., invalid/malformed image, empty file + */ + 400: string; + /** + * Unsupported Media Type — e.g., request `Content-Type` is not `multipart/form-data`, + * or the `image` part has an unsupported `Content-Type` (not image/png, image/jpeg, or image/webp) + * + */ + 415: unknown; + /** + * Internal server error + */ + 500: unknown; +}; + +export type PostMediaUploadError = PostMediaUploadErrors[keyof PostMediaUploadErrors]; + +export type PostMediaUploadResponses = { + /** + * Image uploaded successfully + */ + 200: Image; +}; + +export type PostMediaUploadResponse = PostMediaUploadResponses[keyof PostMediaUploadResponses]; diff --git a/sql/migrations/000001_init.up.sql b/sql/migrations/000001_init.up.sql index 369e455..415b9af 100644 --- a/sql/migrations/000001_init.up.sql +++ b/sql/migrations/000001_init.up.sql @@ -86,7 +86,8 @@ CREATE TABLE usertitles ( status usertitle_status_t NOT NULL, rate int CHECK (rate > 0 AND rate <= 10), review_id bigint REFERENCES reviews (id) ON DELETE SET NULL, - ctime timestamptz NOT NULL DEFAULT now() + ctime timestamptz NOT NULL DEFAULT now(), + ftime timestamptz NOT NULL DEFAULT now() -- // TODO: series status );