feat(frontend): add JOURNEY_ITEM error codes, i18n keys, regen API types
Adds JOURNEY_ITEM_NOT_FOUND and JOURNEY_ITEM_POSITION_CONFLICT to the frontend ErrorCode union and getErrorMessage() switch. Adds de/en/es translations. Regenerates api.ts from the current OpenAPI spec (needs a second run once the backend is restarted with the new endpoints compiled in). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1023,6 +1023,8 @@
|
|||||||
"nav_stammbaum": "Stammbaum",
|
"nav_stammbaum": "Stammbaum",
|
||||||
"nav_geschichten": "Geschichten",
|
"nav_geschichten": "Geschichten",
|
||||||
"error_geschichte_not_found": "Die Geschichte wurde nicht gefunden.",
|
"error_geschichte_not_found": "Die Geschichte wurde nicht gefunden.",
|
||||||
|
"error_journey_item_not_found": "Der Reise-Eintrag wurde nicht gefunden.",
|
||||||
|
"error_journey_item_position_conflict": "Positionskonflikt beim Sortieren der Reise-Einträge.",
|
||||||
"geschichten_index_title": "Geschichten",
|
"geschichten_index_title": "Geschichten",
|
||||||
"geschichten_new_button": "Neue Geschichte",
|
"geschichten_new_button": "Neue Geschichte",
|
||||||
"geschichten_filter_all_pill": "Alle",
|
"geschichten_filter_all_pill": "Alle",
|
||||||
|
|||||||
@@ -1023,6 +1023,8 @@
|
|||||||
"nav_stammbaum": "Family tree",
|
"nav_stammbaum": "Family tree",
|
||||||
"nav_geschichten": "Stories",
|
"nav_geschichten": "Stories",
|
||||||
"error_geschichte_not_found": "The story was not found.",
|
"error_geschichte_not_found": "The story was not found.",
|
||||||
|
"error_journey_item_not_found": "The journey item was not found.",
|
||||||
|
"error_journey_item_position_conflict": "Position conflict while reordering journey items.",
|
||||||
"geschichten_index_title": "Stories",
|
"geschichten_index_title": "Stories",
|
||||||
"geschichten_new_button": "New story",
|
"geschichten_new_button": "New story",
|
||||||
"geschichten_filter_all_pill": "All",
|
"geschichten_filter_all_pill": "All",
|
||||||
|
|||||||
@@ -1023,6 +1023,8 @@
|
|||||||
"nav_stammbaum": "Árbol genealógico",
|
"nav_stammbaum": "Árbol genealógico",
|
||||||
"nav_geschichten": "Historias",
|
"nav_geschichten": "Historias",
|
||||||
"error_geschichte_not_found": "No se encontró la historia.",
|
"error_geschichte_not_found": "No se encontró la historia.",
|
||||||
|
"error_journey_item_not_found": "No se encontró el elemento del viaje.",
|
||||||
|
"error_journey_item_position_conflict": "Conflicto de posición al reordenar los elementos del viaje.",
|
||||||
"geschichten_index_title": "Historias",
|
"geschichten_index_title": "Historias",
|
||||||
"geschichten_new_button": "Nueva historia",
|
"geschichten_new_button": "Nueva historia",
|
||||||
"geschichten_filter_all_pill": "Todas",
|
"geschichten_filter_all_pill": "Todas",
|
||||||
|
|||||||
@@ -692,22 +692,6 @@ export interface paths {
|
|||||||
patch?: never;
|
patch?: never;
|
||||||
trace?: never;
|
trace?: never;
|
||||||
};
|
};
|
||||||
"/api/admin/backfill-titles": {
|
|
||||||
parameters: {
|
|
||||||
query?: never;
|
|
||||||
header?: never;
|
|
||||||
path?: never;
|
|
||||||
cookie?: never;
|
|
||||||
};
|
|
||||||
get?: never;
|
|
||||||
put?: never;
|
|
||||||
post: operations["backfillTitles"];
|
|
||||||
delete?: never;
|
|
||||||
options?: never;
|
|
||||||
head?: never;
|
|
||||||
patch?: never;
|
|
||||||
trace?: never;
|
|
||||||
};
|
|
||||||
"/api/admin/backfill-file-hashes": {
|
"/api/admin/backfill-file-hashes": {
|
||||||
parameters: {
|
parameters: {
|
||||||
query?: never;
|
query?: never;
|
||||||
@@ -875,7 +859,7 @@ export interface paths {
|
|||||||
path?: never;
|
path?: never;
|
||||||
cookie?: never;
|
cookie?: never;
|
||||||
};
|
};
|
||||||
get: operations["search_1"];
|
get: operations["search"];
|
||||||
put?: never;
|
put?: never;
|
||||||
post?: never;
|
post?: never;
|
||||||
delete?: never;
|
delete?: never;
|
||||||
@@ -1339,7 +1323,7 @@ export interface paths {
|
|||||||
path?: never;
|
path?: never;
|
||||||
cookie?: never;
|
cookie?: never;
|
||||||
};
|
};
|
||||||
get: operations["search_2"];
|
get: operations["search_1"];
|
||||||
put?: never;
|
put?: never;
|
||||||
post?: never;
|
post?: never;
|
||||||
delete?: never;
|
delete?: never;
|
||||||
@@ -1428,6 +1412,22 @@ export interface paths {
|
|||||||
patch?: never;
|
patch?: never;
|
||||||
trace?: never;
|
trace?: never;
|
||||||
};
|
};
|
||||||
|
"/api/documents/conversation": {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
|
get: operations["getConversation"];
|
||||||
|
put?: never;
|
||||||
|
post?: never;
|
||||||
|
delete?: never;
|
||||||
|
options?: never;
|
||||||
|
head?: never;
|
||||||
|
patch?: never;
|
||||||
|
trace?: never;
|
||||||
|
};
|
||||||
"/api/dashboard/resume": {
|
"/api/dashboard/resume": {
|
||||||
parameters: {
|
parameters: {
|
||||||
query?: never;
|
query?: never;
|
||||||
@@ -1758,7 +1758,6 @@ export interface components {
|
|||||||
sender?: components["schemas"]["Person"];
|
sender?: components["schemas"]["Person"];
|
||||||
tags?: components["schemas"]["Tag"][];
|
tags?: components["schemas"]["Tag"][];
|
||||||
trainingLabels?: ("KURRENT_RECOGNITION" | "KURRENT_SEGMENTATION")[];
|
trainingLabels?: ("KURRENT_RECOGNITION" | "KURRENT_SEGMENTATION")[];
|
||||||
hasTranscription: boolean;
|
|
||||||
thumbnailUrl?: string;
|
thumbnailUrl?: string;
|
||||||
};
|
};
|
||||||
PersonMention: {
|
PersonMention: {
|
||||||
@@ -1819,75 +1818,6 @@ export interface components {
|
|||||||
/** Format: uuid */
|
/** Format: uuid */
|
||||||
targetId: string;
|
targetId: string;
|
||||||
};
|
};
|
||||||
Pageable: {
|
|
||||||
/** Format: int32 */
|
|
||||||
page?: number;
|
|
||||||
/** Format: int32 */
|
|
||||||
size?: number;
|
|
||||||
sort?: string[];
|
|
||||||
};
|
|
||||||
ActivityActorDTO: {
|
|
||||||
initials: string;
|
|
||||||
color: string;
|
|
||||||
name?: string;
|
|
||||||
};
|
|
||||||
DocumentListItem: {
|
|
||||||
/** Format: uuid */
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
originalFilename: string;
|
|
||||||
thumbnailUrl?: string;
|
|
||||||
/** Format: date */
|
|
||||||
documentDate?: string;
|
|
||||||
/** @enum {string} */
|
|
||||||
metaDatePrecision: "DAY" | "MONTH" | "SEASON" | "YEAR" | "RANGE" | "APPROX" | "UNKNOWN";
|
|
||||||
/** Format: date */
|
|
||||||
metaDateEnd?: string;
|
|
||||||
sender?: components["schemas"]["Person"];
|
|
||||||
receivers: components["schemas"]["Person"][];
|
|
||||||
tags: components["schemas"]["Tag"][];
|
|
||||||
archiveBox?: string;
|
|
||||||
archiveFolder?: string;
|
|
||||||
location?: string;
|
|
||||||
summary?: string;
|
|
||||||
/** Format: int32 */
|
|
||||||
completionPercentage: number;
|
|
||||||
contributors: components["schemas"]["ActivityActorDTO"][];
|
|
||||||
matchData: components["schemas"]["SearchMatchData"];
|
|
||||||
/** Format: date-time */
|
|
||||||
createdAt: string;
|
|
||||||
/** Format: date-time */
|
|
||||||
updatedAt: string;
|
|
||||||
};
|
|
||||||
DocumentSearchResult: {
|
|
||||||
items: components["schemas"]["DocumentListItem"][];
|
|
||||||
/** Format: int64 */
|
|
||||||
totalElements: number;
|
|
||||||
/** Format: int32 */
|
|
||||||
pageNumber: number;
|
|
||||||
/** Format: int32 */
|
|
||||||
pageSize: number;
|
|
||||||
/** Format: int32 */
|
|
||||||
totalPages: number;
|
|
||||||
/** Format: int64 */
|
|
||||||
undatedCount: number;
|
|
||||||
};
|
|
||||||
MatchOffset: {
|
|
||||||
/** Format: int32 */
|
|
||||||
start: number;
|
|
||||||
/** Format: int32 */
|
|
||||||
length: number;
|
|
||||||
};
|
|
||||||
SearchMatchData: {
|
|
||||||
transcriptionSnippet?: string;
|
|
||||||
titleOffsets: components["schemas"]["MatchOffset"][];
|
|
||||||
senderMatched: boolean;
|
|
||||||
matchedReceiverIds: string[];
|
|
||||||
matchedTagIds: string[];
|
|
||||||
snippetOffsets: components["schemas"]["MatchOffset"][];
|
|
||||||
summarySnippet?: string;
|
|
||||||
summaryOffsets: components["schemas"]["MatchOffset"][];
|
|
||||||
};
|
|
||||||
CreateRelationshipRequest: {
|
CreateRelationshipRequest: {
|
||||||
/** Format: uuid */
|
/** Format: uuid */
|
||||||
relatedPersonId: string;
|
relatedPersonId: string;
|
||||||
@@ -2016,6 +1946,7 @@ export interface components {
|
|||||||
/** @enum {string} */
|
/** @enum {string} */
|
||||||
status?: "DRAFT" | "PUBLISHED";
|
status?: "DRAFT" | "PUBLISHED";
|
||||||
personIds?: string[];
|
personIds?: string[];
|
||||||
|
documentIds?: string[];
|
||||||
};
|
};
|
||||||
Geschichte: {
|
Geschichte: {
|
||||||
/** Format: uuid */
|
/** Format: uuid */
|
||||||
@@ -2024,11 +1955,9 @@ export interface components {
|
|||||||
body?: string;
|
body?: string;
|
||||||
/** @enum {string} */
|
/** @enum {string} */
|
||||||
status: "DRAFT" | "PUBLISHED";
|
status: "DRAFT" | "PUBLISHED";
|
||||||
/** @enum {string} */
|
|
||||||
type: "STORY" | "JOURNEY";
|
|
||||||
author?: components["schemas"]["AppUser"];
|
author?: components["schemas"]["AppUser"];
|
||||||
persons?: components["schemas"]["Person"][];
|
persons?: components["schemas"]["Person"][];
|
||||||
items?: components["schemas"]["JourneyItem"][];
|
documents?: components["schemas"]["Document"][];
|
||||||
/** Format: date-time */
|
/** Format: date-time */
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
/** Format: date-time */
|
/** Format: date-time */
|
||||||
@@ -2036,32 +1965,6 @@ export interface components {
|
|||||||
/** Format: date-time */
|
/** Format: date-time */
|
||||||
publishedAt?: string;
|
publishedAt?: string;
|
||||||
};
|
};
|
||||||
JourneyItem: {
|
|
||||||
/** Format: uuid */
|
|
||||||
id: string;
|
|
||||||
/** Format: int32 */
|
|
||||||
position: number;
|
|
||||||
/** Format: uuid */
|
|
||||||
documentId?: string;
|
|
||||||
note?: string;
|
|
||||||
};
|
|
||||||
GeschichteSummary: {
|
|
||||||
/** Format: uuid */
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
/** @enum {string} */
|
|
||||||
status: "DRAFT" | "PUBLISHED";
|
|
||||||
/** @enum {string} */
|
|
||||||
type: "STORY" | "JOURNEY";
|
|
||||||
author?: {
|
|
||||||
firstName?: string;
|
|
||||||
lastName?: string;
|
|
||||||
email: string;
|
|
||||||
};
|
|
||||||
body?: string;
|
|
||||||
/** Format: date-time */
|
|
||||||
publishedAt?: string;
|
|
||||||
};
|
|
||||||
CreateTranscriptionBlockDTO: {
|
CreateTranscriptionBlockDTO: {
|
||||||
/** Format: int32 */
|
/** Format: int32 */
|
||||||
pageNumber?: number;
|
pageNumber?: number;
|
||||||
@@ -2300,6 +2203,11 @@ export interface components {
|
|||||||
/** Format: int64 */
|
/** Format: int64 */
|
||||||
transcriptionCount: number;
|
transcriptionCount: number;
|
||||||
};
|
};
|
||||||
|
ActivityActorDTO: {
|
||||||
|
initials: string;
|
||||||
|
color: string;
|
||||||
|
name?: string;
|
||||||
|
};
|
||||||
TranscriptionQueueItemDTO: {
|
TranscriptionQueueItemDTO: {
|
||||||
/** Format: uuid */
|
/** Format: uuid */
|
||||||
id: string;
|
id: string;
|
||||||
@@ -2322,11 +2230,6 @@ export interface components {
|
|||||||
color?: string;
|
color?: string;
|
||||||
/** Format: int32 */
|
/** Format: int32 */
|
||||||
documentCount: number;
|
documentCount: number;
|
||||||
/**
|
|
||||||
* Format: int32
|
|
||||||
* @description Distinct documents tagged with this tag or any descendant tag (subtree rollup)
|
|
||||||
*/
|
|
||||||
subtreeDocumentCount: number;
|
|
||||||
children?: components["schemas"]["TagTreeNodeDTO"][];
|
children?: components["schemas"]["TagTreeNodeDTO"][];
|
||||||
/**
|
/**
|
||||||
* Format: uuid
|
* Format: uuid
|
||||||
@@ -2467,6 +2370,8 @@ export interface components {
|
|||||||
/** Format: int32 */
|
/** Format: int32 */
|
||||||
totalPages?: number;
|
totalPages?: number;
|
||||||
pageable?: components["schemas"]["PageableObject"];
|
pageable?: components["schemas"]["PageableObject"];
|
||||||
|
first?: boolean;
|
||||||
|
last?: boolean;
|
||||||
/** Format: int32 */
|
/** Format: int32 */
|
||||||
size?: number;
|
size?: number;
|
||||||
content?: components["schemas"]["NotificationDTO"][];
|
content?: components["schemas"]["NotificationDTO"][];
|
||||||
@@ -2475,8 +2380,6 @@ export interface components {
|
|||||||
sort?: components["schemas"]["SortObject"];
|
sort?: components["schemas"]["SortObject"];
|
||||||
/** Format: int32 */
|
/** Format: int32 */
|
||||||
numberOfElements?: number;
|
numberOfElements?: number;
|
||||||
first?: boolean;
|
|
||||||
last?: boolean;
|
|
||||||
empty?: boolean;
|
empty?: boolean;
|
||||||
};
|
};
|
||||||
PageableObject: {
|
PageableObject: {
|
||||||
@@ -2540,6 +2443,63 @@ export interface components {
|
|||||||
/** Format: int32 */
|
/** Format: int32 */
|
||||||
totalPages?: number;
|
totalPages?: number;
|
||||||
};
|
};
|
||||||
|
DocumentListItem: {
|
||||||
|
/** Format: uuid */
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
originalFilename: string;
|
||||||
|
thumbnailUrl?: string;
|
||||||
|
/** Format: date */
|
||||||
|
documentDate?: string;
|
||||||
|
/** @enum {string} */
|
||||||
|
metaDatePrecision: "DAY" | "MONTH" | "SEASON" | "YEAR" | "RANGE" | "APPROX" | "UNKNOWN";
|
||||||
|
/** Format: date */
|
||||||
|
metaDateEnd?: string;
|
||||||
|
sender?: components["schemas"]["Person"];
|
||||||
|
receivers: components["schemas"]["Person"][];
|
||||||
|
tags: components["schemas"]["Tag"][];
|
||||||
|
archiveBox?: string;
|
||||||
|
archiveFolder?: string;
|
||||||
|
location?: string;
|
||||||
|
summary?: string;
|
||||||
|
/** Format: int32 */
|
||||||
|
completionPercentage: number;
|
||||||
|
contributors: components["schemas"]["ActivityActorDTO"][];
|
||||||
|
matchData: components["schemas"]["SearchMatchData"];
|
||||||
|
/** Format: date-time */
|
||||||
|
createdAt: string;
|
||||||
|
/** Format: date-time */
|
||||||
|
updatedAt: string;
|
||||||
|
};
|
||||||
|
DocumentSearchResult: {
|
||||||
|
items: components["schemas"]["DocumentListItem"][];
|
||||||
|
/** Format: int64 */
|
||||||
|
totalElements: number;
|
||||||
|
/** Format: int32 */
|
||||||
|
pageNumber: number;
|
||||||
|
/** Format: int32 */
|
||||||
|
pageSize: number;
|
||||||
|
/** Format: int32 */
|
||||||
|
totalPages: number;
|
||||||
|
/** Format: int64 */
|
||||||
|
undatedCount: number;
|
||||||
|
};
|
||||||
|
MatchOffset: {
|
||||||
|
/** Format: int32 */
|
||||||
|
start: number;
|
||||||
|
/** Format: int32 */
|
||||||
|
length: number;
|
||||||
|
};
|
||||||
|
SearchMatchData: {
|
||||||
|
transcriptionSnippet?: string;
|
||||||
|
titleOffsets: components["schemas"]["MatchOffset"][];
|
||||||
|
senderMatched: boolean;
|
||||||
|
matchedReceiverIds: string[];
|
||||||
|
matchedTagIds: string[];
|
||||||
|
snippetOffsets: components["schemas"]["MatchOffset"][];
|
||||||
|
summarySnippet?: string;
|
||||||
|
summaryOffsets: components["schemas"]["MatchOffset"][];
|
||||||
|
};
|
||||||
IncompleteDocumentDTO: {
|
IncompleteDocumentDTO: {
|
||||||
/** Format: uuid */
|
/** Format: uuid */
|
||||||
id: string;
|
id: string;
|
||||||
@@ -3603,6 +3563,7 @@ export interface operations {
|
|||||||
query?: {
|
query?: {
|
||||||
status?: "DRAFT" | "PUBLISHED";
|
status?: "DRAFT" | "PUBLISHED";
|
||||||
personId?: string[];
|
personId?: string[];
|
||||||
|
documentId?: string;
|
||||||
limit?: number;
|
limit?: number;
|
||||||
};
|
};
|
||||||
header?: never;
|
header?: never;
|
||||||
@@ -3617,7 +3578,7 @@ export interface operations {
|
|||||||
[name: string]: unknown;
|
[name: string]: unknown;
|
||||||
};
|
};
|
||||||
content: {
|
content: {
|
||||||
"*/*": components["schemas"]["GeschichteSummary"][];
|
"*/*": components["schemas"]["Geschichte"][];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -4144,26 +4105,6 @@ export interface operations {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
backfillTitles: {
|
|
||||||
parameters: {
|
|
||||||
query?: never;
|
|
||||||
header?: never;
|
|
||||||
path?: never;
|
|
||||||
cookie?: never;
|
|
||||||
};
|
|
||||||
requestBody?: never;
|
|
||||||
responses: {
|
|
||||||
/** @description OK */
|
|
||||||
200: {
|
|
||||||
headers: {
|
|
||||||
[name: string]: unknown;
|
|
||||||
};
|
|
||||||
content: {
|
|
||||||
"*/*": components["schemas"]["BackfillResult"];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
backfillFileHashes: {
|
backfillFileHashes: {
|
||||||
parameters: {
|
parameters: {
|
||||||
query?: never;
|
query?: never;
|
||||||
@@ -4512,7 +4453,7 @@ export interface operations {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
search_1: {
|
search: {
|
||||||
parameters: {
|
parameters: {
|
||||||
query?: {
|
query?: {
|
||||||
q?: string;
|
q?: string;
|
||||||
@@ -5136,7 +5077,7 @@ export interface operations {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
search_2: {
|
search_1: {
|
||||||
parameters: {
|
parameters: {
|
||||||
query?: {
|
query?: {
|
||||||
q?: string;
|
q?: string;
|
||||||
@@ -5306,6 +5247,32 @@ export interface operations {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
getConversation: {
|
||||||
|
parameters: {
|
||||||
|
query: {
|
||||||
|
senderId: string;
|
||||||
|
receiverId?: string;
|
||||||
|
from?: string;
|
||||||
|
to?: string;
|
||||||
|
dir?: string;
|
||||||
|
};
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
|
requestBody?: never;
|
||||||
|
responses: {
|
||||||
|
/** @description OK */
|
||||||
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
|
content: {
|
||||||
|
"*/*": components["schemas"]["Document"][];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
getResume: {
|
getResume: {
|
||||||
parameters: {
|
parameters: {
|
||||||
query?: never;
|
query?: never;
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ export type ErrorCode =
|
|||||||
| 'CIRCULAR_RELATIONSHIP'
|
| 'CIRCULAR_RELATIONSHIP'
|
||||||
| 'DUPLICATE_RELATIONSHIP'
|
| 'DUPLICATE_RELATIONSHIP'
|
||||||
| 'GESCHICHTE_NOT_FOUND'
|
| 'GESCHICHTE_NOT_FOUND'
|
||||||
|
| 'JOURNEY_ITEM_NOT_FOUND'
|
||||||
|
| 'JOURNEY_ITEM_POSITION_CONFLICT'
|
||||||
| 'INVALID_CREDENTIALS'
|
| 'INVALID_CREDENTIALS'
|
||||||
| 'SESSION_EXPIRED'
|
| 'SESSION_EXPIRED'
|
||||||
| 'MISSING_CREDENTIALS'
|
| 'MISSING_CREDENTIALS'
|
||||||
@@ -164,6 +166,10 @@ export function getErrorMessage(code: ErrorCode | string | undefined): string {
|
|||||||
return m.error_duplicate_relationship();
|
return m.error_duplicate_relationship();
|
||||||
case 'GESCHICHTE_NOT_FOUND':
|
case 'GESCHICHTE_NOT_FOUND':
|
||||||
return m.error_geschichte_not_found();
|
return m.error_geschichte_not_found();
|
||||||
|
case 'JOURNEY_ITEM_NOT_FOUND':
|
||||||
|
return m.error_journey_item_not_found();
|
||||||
|
case 'JOURNEY_ITEM_POSITION_CONFLICT':
|
||||||
|
return m.error_journey_item_position_conflict();
|
||||||
case 'INVALID_CREDENTIALS':
|
case 'INVALID_CREDENTIALS':
|
||||||
return m.error_invalid_credentials();
|
return m.error_invalid_credentials();
|
||||||
case 'SESSION_EXPIRED':
|
case 'SESSION_EXPIRED':
|
||||||
|
|||||||
Reference in New Issue
Block a user