Skip to content

Commit a7ffe58

Browse files
committed
Improve authentication state handling
1 parent 390cc61 commit a7ffe58

7 files changed

Lines changed: 230 additions & 34 deletions

File tree

src/hooks.client.ts

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,23 @@ import { initializeSerialPortsStore } from '$lib/stores/SerialPortsStore';
55
import { UserStore } from '$lib/stores/UserStore';
66

77
export async function init() {
8-
// fire both requests in parallel
9-
const [backendInfoRes, userRes] = await Promise.allSettled([
10-
metaApi.versionGetBackendVersion(),
11-
UserStore.refreshSelf(),
12-
]);
8+
const {
9+
data: { version, commit, shortLinkUrl, turnstileSiteKey, isUserAuthenticated },
10+
} = await metaApi.versionGetBackendInfo();
1311

14-
// handle backend info
15-
if (backendInfoRes.status === 'fulfilled' && backendInfoRes.value?.data) {
16-
const { version, commit, shortLinkUrl, turnstileSiteKey } = backendInfoRes.value.data;
17-
18-
if (version != null) sessionStorage.setItem('backendVersion', String(version));
19-
if (commit != null) sessionStorage.setItem('backendCommit', String(commit));
20-
if (shortLinkUrl != null) sessionStorage.setItem('shortLinkUrl', String(shortLinkUrl));
21-
if (turnstileSiteKey != null)
22-
sessionStorage.setItem('turnstileSiteKey', String(turnstileSiteKey));
23-
} else {
24-
throw new Error('Failed to fetch backend info');
25-
}
12+
if (version != null) sessionStorage.setItem('backendVersion', String(version));
13+
if (commit != null) sessionStorage.setItem('backendCommit', String(commit));
14+
if (shortLinkUrl != null) sessionStorage.setItem('shortLinkUrl', String(shortLinkUrl));
15+
if (turnstileSiteKey != null)
16+
sessionStorage.setItem('turnstileSiteKey', String(turnstileSiteKey));
2617

2718
// init client-side stores
2819
initializeDarkModeStore();
2920
initializeSerialPortsStore(); // TODO: move this elsewhere if needed
3021

31-
// start SignalR only if we have a user
32-
const isLoggedIn = userRes.status === 'fulfilled' && !!userRes.value;
33-
if (isLoggedIn) {
34-
await initializeSignalR();
22+
// Attempt to authenticate the user if backend says they are authenticated
23+
if (isUserAuthenticated) {
24+
// fire both requests in parallel
25+
await Promise.all([UserStore.refreshSelf(), initializeSignalR()]);
3526
}
3627
}

src/lib/api/internal/v1/.openapi-generator/FILES

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ models/AdminOnlineDeviceResponse.ts
1818
models/AdminOnlineDeviceResponseIEnumerableLegacyDataResponse.ts
1919
models/AdminUsersView.ts
2020
models/AdminUsersViewPaginated.ts
21-
models/ApiVersionResponse.ts
22-
models/ApiVersionResponseLegacyDataResponse.ts
21+
models/BackendInfoResponse.ts
22+
models/BackendInfoResponseLegacyDataResponse.ts
2323
models/BasicUserInfo.ts
2424
models/BooleanLegacyDataResponse.ts
2525
models/ChangeEmailRequest.ts

src/lib/api/internal/v1/apis/MetaApi.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515

1616
import * as runtime from '../runtime';
1717
import type {
18-
ApiVersionResponseLegacyDataResponse,
18+
BackendInfoResponseLegacyDataResponse,
1919
StatsResponseLegacyDataResponse,
2020
} from '../models/index';
2121
import {
22-
ApiVersionResponseLegacyDataResponseFromJSON,
23-
ApiVersionResponseLegacyDataResponseToJSON,
22+
BackendInfoResponseLegacyDataResponseFromJSON,
23+
BackendInfoResponseLegacyDataResponseToJSON,
2424
StatsResponseLegacyDataResponseFromJSON,
2525
StatsResponseLegacyDataResponseToJSON,
2626
} from '../models/index';
@@ -53,12 +53,12 @@ export interface MetaApiInterface {
5353
* @throws {RequiredError}
5454
* @memberof MetaApiInterface
5555
*/
56-
versionGetBackendVersionRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ApiVersionResponseLegacyDataResponse>>;
56+
versionGetBackendInfoRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<BackendInfoResponseLegacyDataResponse>>;
5757

5858
/**
5959
* Gets the version of the OpenShock backend.
6060
*/
61-
versionGetBackendVersion(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ApiVersionResponseLegacyDataResponse>;
61+
versionGetBackendInfo(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<BackendInfoResponseLegacyDataResponse>;
6262

6363
}
6464

@@ -99,7 +99,7 @@ export class MetaApi extends runtime.BaseAPI implements MetaApiInterface {
9999
/**
100100
* Gets the version of the OpenShock backend.
101101
*/
102-
async versionGetBackendVersionRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ApiVersionResponseLegacyDataResponse>> {
102+
async versionGetBackendInfoRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<BackendInfoResponseLegacyDataResponse>> {
103103
const queryParameters: any = {};
104104

105105
const headerParameters: runtime.HTTPHeaders = {};
@@ -114,14 +114,14 @@ export class MetaApi extends runtime.BaseAPI implements MetaApiInterface {
114114
query: queryParameters,
115115
}, initOverrides);
116116

117-
return new runtime.JSONApiResponse(response, (jsonValue) => ApiVersionResponseLegacyDataResponseFromJSON(jsonValue));
117+
return new runtime.JSONApiResponse(response, (jsonValue) => BackendInfoResponseLegacyDataResponseFromJSON(jsonValue));
118118
}
119119

120120
/**
121121
* Gets the version of the OpenShock backend.
122122
*/
123-
async versionGetBackendVersion(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ApiVersionResponseLegacyDataResponse> {
124-
const response = await this.versionGetBackendVersionRaw(initOverrides);
123+
async versionGetBackendInfo(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<BackendInfoResponseLegacyDataResponse> {
124+
const response = await this.versionGetBackendInfoRaw(initOverrides);
125125
return await response.value();
126126
}
127127

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/* tslint:disable */
2+
/* eslint-disable */
3+
/**
4+
* OpenShock.API
5+
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
6+
*
7+
* The version of the OpenAPI document: 1.0
8+
*
9+
*
10+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11+
* https://openapi-generator.tech
12+
* Do not edit the class manually.
13+
*/
14+
15+
import { mapValues } from '../runtime';
16+
/**
17+
*
18+
* @export
19+
* @interface BackendInfoResponse
20+
*/
21+
export interface BackendInfoResponse {
22+
/**
23+
*
24+
* @type {string}
25+
* @memberof BackendInfoResponse
26+
*/
27+
version: string;
28+
/**
29+
*
30+
* @type {string}
31+
* @memberof BackendInfoResponse
32+
*/
33+
commit: string;
34+
/**
35+
*
36+
* @type {Date}
37+
* @memberof BackendInfoResponse
38+
*/
39+
currentTime: Date;
40+
/**
41+
*
42+
* @type {string}
43+
* @memberof BackendInfoResponse
44+
*/
45+
frontendUrl: string;
46+
/**
47+
*
48+
* @type {string}
49+
* @memberof BackendInfoResponse
50+
*/
51+
shortLinkUrl: string;
52+
/**
53+
*
54+
* @type {string}
55+
* @memberof BackendInfoResponse
56+
*/
57+
turnstileSiteKey: string | null;
58+
/**
59+
*
60+
* @type {boolean}
61+
* @memberof BackendInfoResponse
62+
*/
63+
isUserAuthenticated: boolean;
64+
}
65+
66+
/**
67+
* Check if a given object implements the BackendInfoResponse interface.
68+
*/
69+
export function instanceOfBackendInfoResponse(value: object): value is BackendInfoResponse {
70+
if (!('version' in value) || value['version'] === undefined) return false;
71+
if (!('commit' in value) || value['commit'] === undefined) return false;
72+
if (!('currentTime' in value) || value['currentTime'] === undefined) return false;
73+
if (!('frontendUrl' in value) || value['frontendUrl'] === undefined) return false;
74+
if (!('shortLinkUrl' in value) || value['shortLinkUrl'] === undefined) return false;
75+
if (!('turnstileSiteKey' in value) || value['turnstileSiteKey'] === undefined) return false;
76+
if (!('isUserAuthenticated' in value) || value['isUserAuthenticated'] === undefined) return false;
77+
return true;
78+
}
79+
80+
export function BackendInfoResponseFromJSON(json: any): BackendInfoResponse {
81+
return BackendInfoResponseFromJSONTyped(json, false);
82+
}
83+
84+
export function BackendInfoResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): BackendInfoResponse {
85+
if (json == null) {
86+
return json;
87+
}
88+
return {
89+
90+
'version': json['version'],
91+
'commit': json['commit'],
92+
'currentTime': (new Date(json['currentTime'])),
93+
'frontendUrl': json['frontendUrl'],
94+
'shortLinkUrl': json['shortLinkUrl'],
95+
'turnstileSiteKey': json['turnstileSiteKey'],
96+
'isUserAuthenticated': json['isUserAuthenticated'],
97+
};
98+
}
99+
100+
export function BackendInfoResponseToJSON(json: any): BackendInfoResponse {
101+
return BackendInfoResponseToJSONTyped(json, false);
102+
}
103+
104+
export function BackendInfoResponseToJSONTyped(value?: BackendInfoResponse | null, ignoreDiscriminator: boolean = false): any {
105+
if (value == null) {
106+
return value;
107+
}
108+
109+
return {
110+
111+
'version': value['version'],
112+
'commit': value['commit'],
113+
'currentTime': ((value['currentTime']).toISOString()),
114+
'frontendUrl': value['frontendUrl'],
115+
'shortLinkUrl': value['shortLinkUrl'],
116+
'turnstileSiteKey': value['turnstileSiteKey'],
117+
'isUserAuthenticated': value['isUserAuthenticated'],
118+
};
119+
}
120+
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/* tslint:disable */
2+
/* eslint-disable */
3+
/**
4+
* OpenShock.API
5+
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
6+
*
7+
* The version of the OpenAPI document: 1.0
8+
*
9+
*
10+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11+
* https://openapi-generator.tech
12+
* Do not edit the class manually.
13+
*/
14+
15+
import { mapValues } from '../runtime';
16+
import type { BackendInfoResponse } from './BackendInfoResponse';
17+
import {
18+
BackendInfoResponseFromJSON,
19+
BackendInfoResponseFromJSONTyped,
20+
BackendInfoResponseToJSON,
21+
BackendInfoResponseToJSONTyped,
22+
} from './BackendInfoResponse';
23+
24+
/**
25+
*
26+
* @export
27+
* @interface BackendInfoResponseLegacyDataResponse
28+
*/
29+
export interface BackendInfoResponseLegacyDataResponse {
30+
/**
31+
*
32+
* @type {string}
33+
* @memberof BackendInfoResponseLegacyDataResponse
34+
*/
35+
message: string;
36+
/**
37+
*
38+
* @type {BackendInfoResponse}
39+
* @memberof BackendInfoResponseLegacyDataResponse
40+
*/
41+
data: BackendInfoResponse;
42+
}
43+
44+
/**
45+
* Check if a given object implements the BackendInfoResponseLegacyDataResponse interface.
46+
*/
47+
export function instanceOfBackendInfoResponseLegacyDataResponse(value: object): value is BackendInfoResponseLegacyDataResponse {
48+
if (!('message' in value) || value['message'] === undefined) return false;
49+
if (!('data' in value) || value['data'] === undefined) return false;
50+
return true;
51+
}
52+
53+
export function BackendInfoResponseLegacyDataResponseFromJSON(json: any): BackendInfoResponseLegacyDataResponse {
54+
return BackendInfoResponseLegacyDataResponseFromJSONTyped(json, false);
55+
}
56+
57+
export function BackendInfoResponseLegacyDataResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): BackendInfoResponseLegacyDataResponse {
58+
if (json == null) {
59+
return json;
60+
}
61+
return {
62+
63+
'message': json['message'],
64+
'data': BackendInfoResponseFromJSON(json['data']),
65+
};
66+
}
67+
68+
export function BackendInfoResponseLegacyDataResponseToJSON(json: any): BackendInfoResponseLegacyDataResponse {
69+
return BackendInfoResponseLegacyDataResponseToJSONTyped(json, false);
70+
}
71+
72+
export function BackendInfoResponseLegacyDataResponseToJSONTyped(value?: BackendInfoResponseLegacyDataResponse | null, ignoreDiscriminator: boolean = false): any {
73+
if (value == null) {
74+
return value;
75+
}
76+
77+
return {
78+
79+
'message': value['message'],
80+
'data': BackendInfoResponseToJSON(value['data']),
81+
};
82+
}
83+

src/lib/api/internal/v1/models/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ export * from './AdminOnlineDeviceResponse';
77
export * from './AdminOnlineDeviceResponseIEnumerableLegacyDataResponse';
88
export * from './AdminUsersView';
99
export * from './AdminUsersViewPaginated';
10-
export * from './ApiVersionResponse';
11-
export * from './ApiVersionResponseLegacyDataResponse';
10+
export * from './BackendInfoResponse';
11+
export * from './BackendInfoResponseLegacyDataResponse';
1212
export * from './BasicUserInfo';
1313
export * from './BooleanLegacyDataResponse';
1414
export * from './ChangeEmailRequest';

src/routes/(anonymous)/login/+page.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import { Button } from '$lib/components/ui/button';
1010
import { isValidationError, mapToValRes } from '$lib/errorhandling/ValidationProblemDetails';
1111
import { handleApiError } from '$lib/errorhandling/apiErrorHandling';
12+
import { initializeSignalR } from '$lib/signalr';
1213
import { UserStore } from '$lib/stores/UserStore';
1314
import type { ValidationResult } from '$lib/types/ValidationResult';
1415
@@ -39,6 +40,7 @@
3940
email: account.accountEmail,
4041
roles: account.accountRoles,
4142
});
43+
await initializeSignalR();
4244
goto(page.url.searchParams.get('redirect') ?? '/home');
4345
} catch (error) {
4446
await handleApiError(error, (problem) => {

0 commit comments

Comments
 (0)