feat(admin): manage server updates and local configuration
ci / api / api (push) Successful in 52s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m9s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m35s
release / release (версия и заметки) (push) Successful in 5s
release / android (APK в релиз) (push) Successful in 4m6s
ci / db / db (push) Successful in 1m15s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 1m19s
ci / ts / ts (packages + web) (push) Successful in 2m34s
release / desktop (Linux и Windows в релиз) (push) Successful in 14m27s
release / prune (старые файлы и прогоны) (push) Successful in 6s

This commit is contained in:
mrleo1nid committed 2026-10-22 23:01:36 +03:00
1 parent e33abc948c
commit a29a8b18ad
49 files changed
+3604 -353

No files matched your search

+268
View File
@@ -4,6 +4,70 @@
*/
export interface paths {
"/api/v1/admin/server/updates": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get: operations["getServerUpdates"];
put?: never;
post: operations["startServerUpdate"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/v1/admin/server/update-sources": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put: operations["saveServerUpdateSources"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/v1/admin/server/config": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get: operations["getServerConfig"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch: operations["saveServerConfig"];
trace?: never;
};
"/api/v1/admin/server/config/apply": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["applyServerConfig"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/v1/admin/genius": {
parameters: {
query?: never;
@@ -1499,6 +1563,62 @@ export interface paths {
export type webhooks = Record<string, never>;
export interface components {
schemas: {
ServerSource: {
id: string;
name: string;
url: string;
};
ServerSources: {
sources: components["schemas"]["ServerSource"][];
};
ServerJob: {
id: string;
/** @enum {string} */
kind: "update" | "config";
/** @enum {string} */
state: "running" | "succeeded" | "failed";
started_at: string;
finished_at: string;
target: string;
log: string;
};
ServerUpdates: {
sources: components["schemas"]["ServerSource"][];
versions: string[];
current_version: string;
source_error: string;
job: components["schemas"]["ServerJob"] | null;
};
ServerUpdateRequest: {
source_id: string;
/** @enum {string} */
channel: "latest" | "version" | "main";
version?: string;
};
ServerConfigEntry: {
key: string;
group: string;
type: string;
secret: boolean;
readonly: boolean;
effective: string;
env: string | null;
local: string | null;
default_value: string;
/** @enum {string} */
source: "env" | "local" | "default";
};
ServerConfig: {
revision: string;
restart_required: boolean;
entries: components["schemas"]["ServerConfigEntry"][];
};
ServerConfigPatch: {
revision: string;
values: {
[key: string]: string | null;
};
};
PlaylistShare: {
/** Format: uuid */
share_id: string;
@@ -1859,6 +1979,8 @@ export interface components {
username: string;
display_name: string | null;
role: components["schemas"]["Role"];
/** @description Управление обновлениями сервера. У admin всегда; другим выдаёт только admin */
manages_updates?: boolean;
/** @description Может рассматривать очередь на добавление. Не следует из роли и может быть у нескольких людей сразу */
reviews_uploads: boolean;
locale: string;
@@ -1888,6 +2010,8 @@ export interface components {
username: string;
display_name: string | null;
role: components["schemas"]["Role"];
/** @description Управление обновлениями сервера. У admin всегда; другим выдаёт только admin */
manages_updates?: boolean;
/** @description Может рассматривать очередь на добавление. Не следует из роли и может быть у нескольких людей сразу */
reviews_uploads: boolean;
locale: string;
@@ -1907,6 +2031,8 @@ export interface components {
username: string;
display_name?: string;
role: components["schemas"]["Role"];
/** @description Управление обновлениями сервера. У admin всегда; другим выдаёт только admin */
manages_updates?: boolean;
/** @description Сразу выдать аудит загрузок. Может задать только админ */
reviews_uploads?: boolean;
};
@@ -1922,6 +2048,8 @@ export interface components {
display_name?: string;
role?: components["schemas"]["Role"];
is_blocked?: boolean;
/** @description Управление обновлениями сервера. У admin всегда; другим выдаёт только admin */
manages_updates?: boolean;
/** @description Выдать или забрать аудит загрузок. Может менять только админ, в том числе у себя */
reviews_uploads?: boolean;
};
@@ -2563,6 +2691,146 @@ export interface components {
}
export type $defs = Record<string, never>;
export interface operations {
getServerUpdates: {
parameters: {
query?: {
source_id?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Server management result */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ServerUpdates"];
};
};
default: components["responses"]["Problem"];
};
};
startServerUpdate: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ServerUpdateRequest"];
};
};
responses: {
/** @description Server management result */
202: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ServerJob"];
};
};
default: components["responses"]["Problem"];
};
};
saveServerUpdateSources: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ServerSources"];
};
};
responses: {
/** @description Server management result */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ServerSources"];
};
};
default: components["responses"]["Problem"];
};
};
getServerConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Server management result */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ServerConfig"];
};
};
default: components["responses"]["Problem"];
};
};
saveServerConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ServerConfigPatch"];
};
};
responses: {
/** @description Server management result */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ServerConfig"];
};
};
default: components["responses"]["Problem"];
};
};
applyServerConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Server management result */
202: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ServerJob"];
};
};
default: components["responses"]["Problem"];
};
};
getGeniusStats: {
parameters: {
query?: never;