aboutsummaryrefslogtreecommitdiffhomepage
path: root/server
diff options
context:
space:
mode:
authorRigel Kent <sendmemail@rigelk.eu>2020-01-02 13:07:18 +0100
committerRigel Kent <sendmemail@rigelk.eu>2020-01-02 14:50:14 +0100
commit29128b2f5ce00093ad81b4b72daae0e3444fd5a8 (patch)
treef1a90ead86c16892255e2c661da3eed5f302a260 /server
parentcca1e13b96799377f19bcc95110fbf76ff741e20 (diff)
downloadPeerTube-29128b2f5ce00093ad81b4b72daae0e3444fd5a8.tar.gz
PeerTube-29128b2f5ce00093ad81b4b72daae0e3444fd5a8.tar.zst
PeerTube-29128b2f5ce00093ad81b4b72daae0e3444fd5a8.zip
Add miniature quick actions to add video to Watch later playlist
Diffstat (limited to 'server')
-rw-r--r--server/controllers/api/users/me.ts2
-rw-r--r--server/models/account/user.ts31
-rw-r--r--server/tests/api/users/users.ts6
3 files changed, 31 insertions, 8 deletions
diff --git a/server/controllers/api/users/me.ts b/server/controllers/api/users/me.ts
index b1f29f252..2f3efe6aa 100644
--- a/server/controllers/api/users/me.ts
+++ b/server/controllers/api/users/me.ts
@@ -128,7 +128,7 @@ async function getUserInformation (req: express.Request, res: express.Response)
128 // We did not load channels in res.locals.user 128 // We did not load channels in res.locals.user
129 const user = await UserModel.loadByUsernameAndPopulateChannels(res.locals.oauth.token.user.username) 129 const user = await UserModel.loadByUsernameAndPopulateChannels(res.locals.oauth.token.user.username)
130 130
131 return res.json(user.toFormattedJSON()) 131 return res.json(user.toFormattedJSON({ me: true }))
132} 132}
133 133
134async function getUserVideoQuotaUsed (req: express.Request, res: express.Response) { 134async function getUserVideoQuotaUsed (req: express.Request, res: express.Response) {
diff --git a/server/models/account/user.ts b/server/models/account/user.ts
index 3a339b5c3..8bd41de22 100644
--- a/server/models/account/user.ts
+++ b/server/models/account/user.ts
@@ -19,7 +19,7 @@ import {
19 Table, 19 Table,
20 UpdatedAt 20 UpdatedAt
21} from 'sequelize-typescript' 21} from 'sequelize-typescript'
22import { hasUserRight, USER_ROLE_LABELS, UserRight, VideoPrivacy } from '../../../shared' 22import { hasUserRight, USER_ROLE_LABELS, UserRight, VideoPrivacy, MyUser } from '../../../shared'
23import { User, UserRole } from '../../../shared/models/users' 23import { User, UserRole } from '../../../shared/models/users'
24import { 24import {
25 isNoInstanceConfigWarningModal, 25 isNoInstanceConfigWarningModal,
@@ -45,6 +45,7 @@ import { comparePassword, cryptPassword } from '../../helpers/peertube-crypto'
45import { OAuthTokenModel } from '../oauth/oauth-token' 45import { OAuthTokenModel } from '../oauth/oauth-token'
46import { getSort, throwIfNotValid } from '../utils' 46import { getSort, throwIfNotValid } from '../utils'
47import { VideoChannelModel } from '../video/video-channel' 47import { VideoChannelModel } from '../video/video-channel'
48import { VideoPlaylistModel } from '../video/video-playlist'
48import { AccountModel } from './account' 49import { AccountModel } from './account'
49import { NSFWPolicyType } from '../../../shared/models/videos/nsfw-policy.type' 50import { NSFWPolicyType } from '../../../shared/models/videos/nsfw-policy.type'
50import { values } from 'lodash' 51import { values } from 'lodash'
@@ -68,7 +69,8 @@ import {
68} from '@server/typings/models' 69} from '@server/typings/models'
69 70
70enum ScopeNames { 71enum ScopeNames {
71 WITH_VIDEO_CHANNEL = 'WITH_VIDEO_CHANNEL' 72 WITH_VIDEO_CHANNEL = 'WITH_VIDEO_CHANNEL',
73 WITH_SPECIAL_PLAYLISTS = 'WITH_SPECIAL_PLAYLISTS'
72} 74}
73 75
74@DefaultScope(() => ({ 76@DefaultScope(() => ({
@@ -96,6 +98,16 @@ enum ScopeNames {
96 required: true 98 required: true
97 } 99 }
98 ] 100 ]
101 },
102 [ScopeNames.WITH_SPECIAL_PLAYLISTS]: {
103 attributes: {
104 include: [
105 [
106 literal('(select array(select "id" from "videoPlaylist" where "ownerAccountId" in (select id from public.account where "userId" = "UserModel"."id") and name LIKE \'Watch later\'))'),
107 'specialPlaylists'
108 ]
109 ]
110 }
99 } 111 }
100})) 112}))
101@Table({ 113@Table({
@@ -431,7 +443,10 @@ export class UserModel extends Model<UserModel> {
431 } 443 }
432 } 444 }
433 445
434 return UserModel.scope(ScopeNames.WITH_VIDEO_CHANNEL).findOne(query) 446 return UserModel.scope([
447 ScopeNames.WITH_VIDEO_CHANNEL,
448 ScopeNames.WITH_SPECIAL_PLAYLISTS
449 ]).findOne(query)
435 } 450 }
436 451
437 static loadByEmail (email: string): Bluebird<MUserDefault> { 452 static loadByEmail (email: string): Bluebird<MUserDefault> {
@@ -610,11 +625,11 @@ export class UserModel extends Model<UserModel> {
610 return comparePassword(password, this.password) 625 return comparePassword(password, this.password)
611 } 626 }
612 627
613 toFormattedJSON (this: MUserFormattable, parameters: { withAdminFlags?: boolean } = {}): User { 628 toFormattedJSON (this: MUserFormattable, parameters: { withAdminFlags?: boolean, me?: boolean } = {}): User | MyUser {
614 const videoQuotaUsed = this.get('videoQuotaUsed') 629 const videoQuotaUsed = this.get('videoQuotaUsed')
615 const videoQuotaUsedDaily = this.get('videoQuotaUsedDaily') 630 const videoQuotaUsedDaily = this.get('videoQuotaUsedDaily')
616 631
617 const json: User = { 632 const json: User | MyUser = {
618 id: this.id, 633 id: this.id,
619 username: this.username, 634 username: this.username,
620 email: this.email, 635 email: this.email,
@@ -675,6 +690,12 @@ export class UserModel extends Model<UserModel> {
675 }) 690 })
676 } 691 }
677 692
693 if (parameters.me) {
694 Object.assign(json, {
695 specialPlaylists: (this.get('specialPlaylists') as Array<number>).map(p => ({ id: p }))
696 })
697 }
698
678 return json 699 return json
679 } 700 }
680 701
diff --git a/server/tests/api/users/users.ts b/server/tests/api/users/users.ts
index 07b7fc747..3c3ee3ed7 100644
--- a/server/tests/api/users/users.ts
+++ b/server/tests/api/users/users.ts
@@ -2,7 +2,7 @@
2 2
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { User, UserRole, Video } from '../../../../shared/index' 5import { User, UserRole, Video, MyUser } from '../../../../shared/index'
6import { 6import {
7 blockUser, 7 blockUser,
8 cleanupTests, 8 cleanupTests,
@@ -251,7 +251,7 @@ describe('Test users', function () {
251 251
252 it('Should be able to get user information', async function () { 252 it('Should be able to get user information', async function () {
253 const res1 = await getMyUserInformation(server.url, accessTokenUser) 253 const res1 = await getMyUserInformation(server.url, accessTokenUser)
254 const userMe: User = res1.body 254 const userMe: User & MyUser = res1.body
255 255
256 const res2 = await getUserInformation(server.url, server.accessToken, userMe.id) 256 const res2 = await getUserInformation(server.url, server.accessToken, userMe.id)
257 const userGet: User = res2.body 257 const userGet: User = res2.body
@@ -269,6 +269,8 @@ describe('Test users', function () {
269 269
270 expect(userMe.adminFlags).to.be.undefined 270 expect(userMe.adminFlags).to.be.undefined
271 expect(userGet.adminFlags).to.equal(UserAdminFlag.BY_PASS_VIDEO_AUTO_BLACKLIST) 271 expect(userGet.adminFlags).to.equal(UserAdminFlag.BY_PASS_VIDEO_AUTO_BLACKLIST)
272
273 expect(userMe.specialPlaylists).to.have.lengthOf(1)
272 }) 274 })
273 }) 275 })
274 276