M12e: contract pass (pair invite kind, admin name in invite links, sync failed flag, rejection actor, device version name, template id, update check result, untouched accounts, D-027 re-stamp, PushEvent in :core:model, snackbar hosts)

Server: E-3 invite_kind; E-12 link ?from=<admin name>, E-4 passes it into kvitt://invite;
X-Kvitt-App-Version-Name stored in devices.app_version_name (migration 0003, schema 3);
OpenAPI and examples follow. Phone: :core:model, :core:fakes, :data, features and :app
updated together; goldens re-recorded for S-20 (version name) and new S-1/S-22 states.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
This commit is contained in:
2026-10-18 15:00:50 +02:00
parent 6159e18198
commit 8c607153c0
96 changed files with 1090 additions and 298 deletions
+2 -2
View File
@@ -5,7 +5,7 @@
use std::time::Instant;
use axum::Router;
use axum::extract::{DefaultBodyLimit, MatchedPath, Path, Request, State};
use axum::extract::{DefaultBodyLimit, MatchedPath, Path, RawQuery, Request, State};
use axum::http::{HeaderMap, HeaderValue};
use axum::middleware::{self, Next};
use axum::response::{IntoResponse, Response};
@@ -114,7 +114,7 @@ pub fn router(state: AppState) -> Router {
/// `GET /i/`: E-4 with an empty code, which the landing handler answers with its HTML 404 page.
async fn empty_invite_code(state: State<AppState>, headers: HeaderMap) -> Response {
landing::get_invite_landing(state, headers, Path(String::new())).await
landing::get_invite_landing(state, headers, Path(String::new()), RawQuery(None)).await
}
/// Unknown paths: 404 `not_found` in the error shape.