diff options
| author | crupest <crupest@outlook.com> | 2020-11-22 09:53:31 +0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-22 09:53:31 +0800 | 
| commit | ef9489a8c1084d33796da366c685bc24550eafbd (patch) | |
| tree | 59227246f0964dcdc9b735d64a0397a9dd3a58bf /FrontEnd/src/app/services | |
| parent | ffa5d76316ccec4edc307d0432ef10fb18436c63 (diff) | |
| parent | f451000f281a4c9c44caf4dc835d3b2fdb55fa81 (diff) | |
| download | timeline-ef9489a8c1084d33796da366c685bc24550eafbd.tar.gz timeline-ef9489a8c1084d33796da366c685bc24550eafbd.tar.bz2 timeline-ef9489a8c1084d33796da366c685bc24550eafbd.zip | |
Merge pull request #189 from crupest/admin
Refactor front end to use the new permission system. Enhance admin page.
Diffstat (limited to 'FrontEnd/src/app/services')
| -rw-r--r-- | FrontEnd/src/app/services/timeline.ts | 22 | ||||
| -rw-r--r-- | FrontEnd/src/app/services/user.ts | 57 | 
2 files changed, 47 insertions, 32 deletions
| diff --git a/FrontEnd/src/app/services/timeline.ts b/FrontEnd/src/app/services/timeline.ts index 2cbbffab..c58516fc 100644 --- a/FrontEnd/src/app/services/timeline.ts +++ b/FrontEnd/src/app/services/timeline.ts @@ -29,11 +29,11 @@ export type { TimelineVisibility } from "@/http/timeline";  import { dataStorage, throwIfNotNetworkError, BlobOrStatus } from "./common";  import { DataHub, WithSyncStatus } from "./DataHub";  import { -  UserAuthInfo,    checkLogin,    userService,    userInfoService,    User, +  AuthUser,  } from "./user";  export type TimelineInfo = HttpTimelineInfo; @@ -608,10 +608,11 @@ export class TimelineService {    }    hasReadPermission( -    user: UserAuthInfo | null | undefined, +    user: AuthUser | null | undefined,      timeline: TimelineInfo    ): boolean { -    if (user != null && user.administrator) return true; +    if (user != null && user.hasAllTimelineAdministrationPermission) +      return true;      const { visibility } = timeline;      if (visibility === "Public") { @@ -631,10 +632,11 @@ export class TimelineService {    }    hasPostPermission( -    user: UserAuthInfo | null | undefined, +    user: AuthUser | null | undefined,      timeline: TimelineInfo    ): boolean { -    if (user != null && user.administrator) return true; +    if (user != null && user.hasAllTimelineAdministrationPermission) +      return true;      return (        user != null && @@ -644,20 +646,22 @@ export class TimelineService {    }    hasManagePermission( -    user: UserAuthInfo | null | undefined, +    user: AuthUser | null | undefined,      timeline: TimelineInfo    ): boolean { -    if (user != null && user.administrator) return true; +    if (user != null && user.hasAllTimelineAdministrationPermission) +      return true;      return user != null && user.username == timeline.owner.username;    }    hasModifyPostPermission( -    user: UserAuthInfo | null | undefined, +    user: AuthUser | null | undefined,      timeline: TimelineInfo,      post: TimelinePostInfo    ): boolean { -    if (user != null && user.administrator) return true; +    if (user != null && user.hasAllTimelineAdministrationPermission) +      return true;      return (        user != null && 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."); | 
