Breaking API: Consistency with role id/label

pull/5386/head
Chocobozzz 2022-10-28 16:15:04 +02:00
parent 3f9decbd01
commit 9e5cf66be7
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
14 changed files with 55 additions and 38 deletions

View File

@ -49,7 +49,7 @@ export abstract class UserEdit extends FormReactive implements OnInit {
buildRoles () {
const authUser = this.auth.getUser()
if (authUser.role === UserRole.ADMINISTRATOR) {
if (authUser.role.id === UserRole.ADMINISTRATOR) {
this.roles = Object.keys(USER_ROLE_LABELS)
.map(key => ({ value: key.toString(), label: USER_ROLE_LABELS[key] }))
return

View File

@ -144,7 +144,7 @@ export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
this.form.patchValue({
email: userJson.email,
role: userJson.role.toString(),
role: userJson.role.id.toString(),
videoQuota: userJson.videoQuota,
videoQuotaDaily: userJson.videoQuotaDaily,
pluginAuth: userJson.pluginAuth,

View File

@ -106,8 +106,8 @@
</td>
<td *ngIf="isSelected('role')">
<span *ngIf="user.blocked" class="pt-badge badge-banned" i18n-title title="The user was banned">{{ user.roleLabel }}</span>
<span *ngIf="!user.blocked" class="pt-badge" [ngClass]="getRoleClass(user.role)">{{ user.roleLabel }}</span>
<span *ngIf="user.blocked" class="pt-badge badge-banned" i18n-title title="The user was banned">{{ user.role.label }}</span>
<span *ngIf="!user.blocked" class="pt-badge" [ngClass]="getRoleClass(user.role.id)">{{ user.role.label }}</span>
</td>
<td *ngIf="isSelected('email')" [title]="user.email">

View File

@ -247,12 +247,12 @@ export class AppComponent implements OnInit, AfterViewInit {
// Admin modal
userSub.pipe(
filter(user => user.role === UserRole.ADMINISTRATOR)
filter(user => user.role.id === UserRole.ADMINISTRATOR)
).subscribe(user => this.openAdminModalsIfNeeded(user))
// Account modal
userSub.pipe(
filter(user => user.role !== UserRole.ADMINISTRATOR)
filter(user => user.role.id !== UserRole.ADMINISTRATOR)
).subscribe(user => this.openAccountModalsIfNeeded(user))
}

View File

@ -43,16 +43,16 @@ export class AuthUser extends User implements ServerMyUserModel {
}
hasRight (right: UserRight) {
return hasUserRight(this.role, right)
return hasUserRight(this.role.id, right)
}
canManage (user: ServerUserModel) {
const myRole = this.role
const myRole = this.role.id
if (myRole === UserRole.ADMINISTRATOR) return true
// I'm a moderator: I can only manage users
return user.role === UserRole.USER
return user.role.id === UserRole.USER
}
computeCanSeeVideosLink (quotaObservable: Observable<UserVideoQuota>): Observable<boolean> {

View File

@ -59,7 +59,10 @@ export class UserLocalStorageService {
id: parseInt(this.localStorageService.getItem(UserLocalStorageKeys.ID), 10),
username: this.localStorageService.getItem(UserLocalStorageKeys.USERNAME),
email: this.localStorageService.getItem(UserLocalStorageKeys.EMAIL),
role: parseInt(this.localStorageService.getItem(UserLocalStorageKeys.ROLE), 10) as UserRole,
role: {
id: parseInt(this.localStorageService.getItem(UserLocalStorageKeys.ROLE), 10) as UserRole,
label: ''
},
...this.getUserInfo()
}
@ -69,12 +72,14 @@ export class UserLocalStorageService {
id: number
username: string
email: string
role: UserRole
role: {
id: UserRole
}
}) {
this.localStorageService.setItem(UserLocalStorageKeys.ID, user.id.toString())
this.localStorageService.setItem(UserLocalStorageKeys.USERNAME, user.username)
this.localStorageService.setItem(UserLocalStorageKeys.EMAIL, user.email)
this.localStorageService.setItem(UserLocalStorageKeys.ROLE, user.role.toString())
this.localStorageService.setItem(UserLocalStorageKeys.ROLE, user.role.id.toString())
}
flushLoggedInUser () {

View File

@ -34,8 +34,10 @@ export class User implements UserServerModel {
videosHistoryEnabled: boolean
videoLanguages: string[]
role: UserRole
roleLabel: string
role: {
id: UserRole
label: string
}
videoQuota: number
videoQuotaDaily: number
@ -123,7 +125,7 @@ export class User implements UserServerModel {
}
hasRight (right: UserRight) {
return hasUserRight(this.role, right)
return hasUserRight(this.role.id, right)
}
patch (obj: UserServerModel) {
@ -148,6 +150,6 @@ export class User implements UserServerModel {
isAutoBlocked (serverConfig: HTMLServerConfig) {
if (serverConfig.autoBlacklist.videos.ofUsers.enabled !== true) return false
return this.role === UserRole.USER && this.adminFlags !== UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST
return this.role.id === UserRole.USER && this.adminFlags !== UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST
}
}

View File

@ -125,7 +125,10 @@ export class UserAdminService {
}
return Object.assign(user, {
roleLabel: roleLabels[user.role],
role: {
id: user.role.id,
label: roleLabels[user.role.id]
},
videoQuota,
videoQuotaUsed,
rawVideoQuota: user.videoQuota,

View File

@ -891,8 +891,10 @@ export class UserModel extends Model<Partial<AttributesOnly<UserModel>>> {
autoPlayNextVideoPlaylist: this.autoPlayNextVideoPlaylist,
videoLanguages: this.videoLanguages,
role: this.role,
roleLabel: USER_ROLE_LABELS[this.role],
role: {
id: this.role,
label: USER_ROLE_LABELS[this.role]
},
videoQuota: this.videoQuota,
videoQuotaDaily: this.videoQuotaDaily,

View File

@ -219,7 +219,7 @@ describe('Test users', function () {
expect(user.email).to.equal('user_1@example.com')
expect(user.nsfwPolicy).to.equal('display')
expect(user.videoQuota).to.equal(2 * 1024 * 1024)
expect(user.roleLabel).to.equal('User')
expect(user.role.label).to.equal('User')
expect(user.id).to.be.a('number')
expect(user.account.displayName).to.equal('user_1')
expect(user.account.description).to.be.null
@ -277,7 +277,7 @@ describe('Test users', function () {
const user = data[0]
expect(user.username).to.equal('root')
expect(user.email).to.equal('admin' + server.internalServerNumber + '@example.com')
expect(user.roleLabel).to.equal('Administrator')
expect(user.role.label).to.equal('Administrator')
expect(user.nsfwPolicy).to.equal('display')
})
@ -531,7 +531,7 @@ describe('Test users', function () {
expect(user.emailVerified).to.be.true
expect(user.nsfwPolicy).to.equal('do_not_list')
expect(user.videoQuota).to.equal(42)
expect(user.roleLabel).to.equal('Moderator')
expect(user.role.label).to.equal('Moderator')
expect(user.id).to.be.a('number')
expect(user.adminFlags).to.equal(UserAdminFlag.NONE)
expect(user.pluginAuth).to.equal('toto')

View File

@ -155,7 +155,7 @@ describe('Test external auth plugins', function () {
expect(body.username).to.equal('cyan')
expect(body.account.displayName).to.equal('cyan')
expect(body.email).to.equal('cyan@example.com')
expect(body.role).to.equal(UserRole.USER)
expect(body.role.id).to.equal(UserRole.USER)
}
})
@ -177,7 +177,7 @@ describe('Test external auth plugins', function () {
expect(body.username).to.equal('kefka')
expect(body.account.displayName).to.equal('Kefka Palazzo')
expect(body.email).to.equal('kefka@example.com')
expect(body.role).to.equal(UserRole.ADMINISTRATOR)
expect(body.role.id).to.equal(UserRole.ADMINISTRATOR)
}
})
@ -237,7 +237,7 @@ describe('Test external auth plugins', function () {
expect(body.username).to.equal('cyan')
expect(body.account.displayName).to.equal('Cyan Garamonde')
expect(body.account.description).to.equal('Retainer to the king of Doma')
expect(body.role).to.equal(UserRole.USER)
expect(body.role.id).to.equal(UserRole.USER)
})
it('Should not update an external auth email', async function () {

View File

@ -48,7 +48,7 @@ describe('Test id and pass auth plugins', function () {
expect(body.username).to.equal('spyro')
expect(body.account.displayName).to.equal('Spyro the Dragon')
expect(body.role).to.equal(UserRole.USER)
expect(body.role.id).to.equal(UserRole.USER)
})
it('Should login Crash, create the user and use the token', async function () {
@ -63,7 +63,7 @@ describe('Test id and pass auth plugins', function () {
expect(body.username).to.equal('crash')
expect(body.account.displayName).to.equal('Crash Bandicoot')
expect(body.role).to.equal(UserRole.MODERATOR)
expect(body.role.id).to.equal(UserRole.MODERATOR)
}
})
@ -79,7 +79,7 @@ describe('Test id and pass auth plugins', function () {
expect(body.username).to.equal('laguna')
expect(body.account.displayName).to.equal('laguna')
expect(body.role).to.equal(UserRole.USER)
expect(body.role.id).to.equal(UserRole.USER)
}
})
@ -129,7 +129,7 @@ describe('Test id and pass auth plugins', function () {
expect(body.username).to.equal('crash')
expect(body.account.displayName).to.equal('Beautiful Crash')
expect(body.account.description).to.equal('Mutant eastern barred bandicoot')
expect(body.role).to.equal(UserRole.MODERATOR)
expect(body.role.id).to.equal(UserRole.MODERATOR)
})
it('Should reject token of laguna by the plugin hook', async function () {

View File

@ -28,8 +28,10 @@ export interface User {
videosHistoryEnabled: boolean
videoLanguages: string[]
role: UserRole
roleLabel: string
role: {
id: UserRole
label: string
}
videoQuota: number
videoQuotaDaily: number

View File

@ -7522,13 +7522,16 @@ components:
nsfwPolicy:
$ref: '#/components/schemas/NSFWPolicy'
role:
$ref: '#/components/schemas/UserRole'
roleLabel:
type: string
enum:
- User
- Moderator
- Administrator
type: object
properties:
id:
$ref: '#/components/schemas/UserRole'
label:
type: string
enum:
- User
- Moderator
- Administrator
theme:
type: string
description: Theme enabled by this user