aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/app/services/user.ts
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-11-16 16:30:32 +0800
committercrupest <crupest@outlook.com>2020-11-16 16:30:32 +0800
commite7854c1ed8facc2955ef9ad96f0bb2513041bba9 (patch)
tree81ff02d3efa5704f7263170385caf60753ec210e /FrontEnd/src/app/services/user.ts
parente0785b385138057a23ffd1703a7265c371aef45d (diff)
downloadtimeline-e7854c1ed8facc2955ef9ad96f0bb2513041bba9.tar.gz
timeline-e7854c1ed8facc2955ef9ad96f0bb2513041bba9.tar.bz2
timeline-e7854c1ed8facc2955ef9ad96f0bb2513041bba9.zip
...
Diffstat (limited to 'FrontEnd/src/app/services/user.ts')
-rw-r--r--FrontEnd/src/app/services/user.ts57
1 files changed, 34 insertions, 23 deletions
diff --git a/FrontEnd/src/app/services/user.ts b/FrontEnd/src/app/services/user.ts
index cd6d1c15..0166bce0 100644
--- a/FrontEnd/src/app/services/user.ts
+++ b/FrontEnd/src/app/services/user.ts
@@ -14,6 +14,7 @@ import {
getHttpUserClient,
HttpUserNotExistError,
HttpUser,
+ UserPermission,
} from "@/http/user";
import { dataStorage, throwIfNotNetworkError } from "./common";
@@ -22,13 +23,26 @@ import { pushAlert } from "./alert";
export type User = HttpUser;
-export interface UserAuthInfo {
+export class AuthUser implements User {
+ constructor(user: User, public token: string) {
+ this.uniqueId = user.uniqueId;
+ this.username = user.username;
+ this.permissions = user.permissions;
+ this.nickname = user.nickname;
+ }
+
+ uniqueId: string;
username: string;
- administrator: boolean;
-}
+ permissions: UserPermission[];
+ nickname: string;
-export interface UserWithToken extends User {
- token: string;
+ get hasAdministrationPermission(): boolean {
+ return this.permissions.length !== 0;
+ }
+
+ get hasAllTimelineAdministrationPermission(): boolean {
+ return this.permissions.includes("AllTimelineManagement");
+ }
}
export interface LoginCredentials {
@@ -43,24 +57,24 @@ export class BadCredentialError {
const USER_STORAGE_KEY = "currentuser";
export class UserService {
- private userSubject = new BehaviorSubject<UserWithToken | null | undefined>(
+ private userSubject = new BehaviorSubject<AuthUser | null | undefined>(
undefined
);
- get user$(): Observable<UserWithToken | null | undefined> {
+ get user$(): Observable<AuthUser | null | undefined> {
return this.userSubject;
}
- get currentUser(): UserWithToken | null | undefined {
+ get currentUser(): AuthUser | null | undefined {
return this.userSubject.value;
}
- async checkLoginState(): Promise<UserWithToken | null> {
+ async checkLoginState(): Promise<AuthUser | null> {
if (this.currentUser !== undefined) {
console.warn("Already checked user. Can't check twice.");
}
- const savedUser = await dataStorage.getItem<UserWithToken | null>(
+ const savedUser = await dataStorage.getItem<AuthUser | null>(
USER_STORAGE_KEY
);
@@ -74,8 +88,8 @@ export class UserService {
const savedToken = savedUser.token;
try {
const res = await getHttpTokenClient().verify({ token: savedToken });
- const user: UserWithToken = { ...res.user, token: savedToken };
- await dataStorage.setItem<UserWithToken>(USER_STORAGE_KEY, user);
+ const user = new AuthUser(res.user, savedToken);
+ await dataStorage.setItem<AuthUser>(USER_STORAGE_KEY, user);
this.userSubject.next(user);
pushAlert({
type: "success",
@@ -116,12 +130,9 @@ export class UserService {
...credentials,
expire: 30,
});
- const user: UserWithToken = {
- ...res.user,
- token: res.token,
- };
+ const user = new AuthUser(res.user, res.token);
if (rememberMe) {
- await dataStorage.setItem<UserWithToken>(USER_STORAGE_KEY, user);
+ await dataStorage.setItem<AuthUser>(USER_STORAGE_KEY, user);
}
this.userSubject.next(user);
} catch (e) {
@@ -169,8 +180,8 @@ export class UserService {
export const userService = new UserService();
-export function useRawUser(): UserWithToken | null | undefined {
- const [user, setUser] = useState<UserWithToken | null | undefined>(
+export function useRawUser(): AuthUser | null | undefined {
+ const [user, setUser] = useState<AuthUser | null | undefined>(
userService.currentUser
);
useEffect(() => {
@@ -182,8 +193,8 @@ export function useRawUser(): UserWithToken | null | undefined {
return user;
}
-export function useUser(): UserWithToken | null {
- const [user, setUser] = useState<UserWithToken | null>(() => {
+export function useUser(): AuthUser | null {
+ const [user, setUser] = useState<AuthUser | null>(() => {
const initUser = userService.currentUser;
if (initUser === undefined) {
throw new UiLogicError(
@@ -208,7 +219,7 @@ export function useUser(): UserWithToken | null {
return user;
}
-export function useUserLoggedIn(): UserWithToken {
+export function useUserLoggedIn(): AuthUser {
const user = useUser();
if (user == null) {
throw new UiLogicError("You assert user has logged in but actually not.");
@@ -216,7 +227,7 @@ export function useUserLoggedIn(): UserWithToken {
return user;
}
-export function checkLogin(): UserWithToken {
+export function checkLogin(): AuthUser {
const user = userService.currentUser;
if (user == null) {
throw new UiLogicError("You must login to perform the operation.");