feat: first-run claim wizard (no default admin, claim code from the backend log); owner list shows account and passkey; container install first [CI]
ci/woodpecker/push/main-amd64-build Pipeline was successful

This commit is contained in:
justme committed 2026-10-08 06:47:10 +08:00
1 parent 2ae63653c4
commit f22fdf8b68
31 files changed
+799 -49

No files matched your search

+108
View File
@@ -327,6 +327,24 @@ export interface paths {
patch?: never;
trace?: never;
};
"/api/admin/auth/setup": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Whether the panel has no users yet and still has to be claimed */
get: operations["setup_status"];
put?: never;
/** Create the first administrator (needs the claim code from the backend's log); the same response as the password sign-in. Closed once the panel is claimed (a user exists) */
post: operations["setup_complete"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/admin/auth/passkey/options": {
parameters: {
query?: never;
@@ -2073,6 +2091,15 @@ export interface components {
default: string;
description: string;
};
SetupRequest: {
claim_code: null | string;
username: null | string;
password: null | string;
return_session: null | boolean;
};
SetupStatusDto: {
needs_setup: boolean;
};
SignedStatementDto: {
statement?: string;
credential_id?: string;
@@ -2194,6 +2221,7 @@ export interface components {
server_key: string;
/** @default false */
server_key_listed: boolean;
operator_details?: null | components["schemas"]["NodeOwnerDto"][];
};
UserDto: {
id: string;
@@ -3076,6 +3104,86 @@ export interface operations {
};
};
};
setup_status: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SetupStatusDto"];
};
};
};
};
setup_complete: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["SetupRequest"];
};
};
responses: {
/** @description Created */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["LoginResponse"];
};
};
/** @description Bad Request */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
/** @description Conflict */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
/** @description Too Many Requests */
429: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
};
};
auth_passkey_options: {
parameters: {
query?: never;
+1
View File
@@ -56,6 +56,7 @@ export type GapDto = Narrow<S['GapDto']>
export type RecomputeDto = Narrow<S['RecomputeDto']>
export type RawChunkMetaDto = Narrow<S['RawChunkMetaDto']>
export type LoginResponse = Narrow<S['LoginResponse']>
export type SetupStatusDto = Narrow<S['SetupStatusDto']>
export interface Page<T> {
items: T[]