From 213e30ef90806369529684ac9c247d73b8dc7928 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 7 Apr 2021 10:36:13 +0200 Subject: [PATCH] Add banner tests --- server/controllers/api/users/me.ts | 2 +- server/controllers/api/video-channel.ts | 2 +- .../helpers/custom-validators/actor-images.ts | 17 ++++ server/helpers/custom-validators/users.ts | 13 +-- server/lib/activitypub/actor.ts | 72 +++++++------- .../lib/activitypub/process/process-update.ts | 9 +- server/lib/actor-image.ts | 3 +- .../validators/{avatar.ts => actor-image.ts} | 10 +- server/middlewares/validators/index.ts | 1 + server/models/video/video-channel.ts | 9 +- .../tests/api/check-params/video-channels.ts | 70 ++++++++------ server/tests/api/videos/video-channels.ts | 88 ++++++++++++++---- server/tests/fixtures/banner-resized.jpg | Bin 0 -> 88780 bytes server/tests/fixtures/banner.jpg | Bin 0 -> 31648 bytes server/typings/express/index.d.ts | 1 - shared/extra-utils/requests/requests.ts | 7 +- shared/extra-utils/users/users.ts | 4 +- shared/extra-utils/videos/video-channels.ts | 29 ++++-- 18 files changed, 211 insertions(+), 126 deletions(-) create mode 100644 server/helpers/custom-validators/actor-images.ts rename server/middlewares/validators/{avatar.ts => actor-image.ts} (84%) create mode 100644 server/tests/fixtures/banner-resized.jpg create mode 100644 server/tests/fixtures/banner.jpg diff --git a/server/controllers/api/users/me.ts b/server/controllers/api/users/me.ts index 25a18caa5..9f9d2d77f 100644 --- a/server/controllers/api/users/me.ts +++ b/server/controllers/api/users/me.ts @@ -25,7 +25,7 @@ import { usersVideoRatingValidator } from '../../../middlewares' import { deleteMeValidator, videoImportsSortValidator, videosSortValidator } from '../../../middlewares/validators' -import { updateAvatarValidator } from '../../../middlewares/validators/avatar' +import { updateAvatarValidator } from '../../../middlewares/validators/actor-image' import { AccountModel } from '../../../models/account/account' import { AccountVideoRateModel } from '../../../models/account/account-video-rate' import { UserModel } from '../../../models/account/user' diff --git a/server/controllers/api/video-channel.ts b/server/controllers/api/video-channel.ts index 1c926722d..149d6cfb4 100644 --- a/server/controllers/api/video-channel.ts +++ b/server/controllers/api/video-channel.ts @@ -33,7 +33,7 @@ import { videoPlaylistsSortValidator } from '../../middlewares' import { videoChannelsNameWithHostValidator, videoChannelsOwnSearchValidator, videosSortValidator } from '../../middlewares/validators' -import { updateAvatarValidator, updateBannerValidator } from '../../middlewares/validators/avatar' +import { updateAvatarValidator, updateBannerValidator } from '../../middlewares/validators/actor-image' import { commonVideoPlaylistFiltersValidator } from '../../middlewares/validators/videos/video-playlists' import { AccountModel } from '../../models/account/account' import { VideoModel } from '../../models/video/video' diff --git a/server/helpers/custom-validators/actor-images.ts b/server/helpers/custom-validators/actor-images.ts new file mode 100644 index 000000000..4fb0b7c70 --- /dev/null +++ b/server/helpers/custom-validators/actor-images.ts @@ -0,0 +1,17 @@ + +import { CONSTRAINTS_FIELDS } from '../../initializers/constants' +import { isFileValid } from './misc' + +const imageMimeTypes = CONSTRAINTS_FIELDS.ACTORS.IMAGE.EXTNAME + .map(v => v.replace('.', '')) + .join('|') +const imageMimeTypesRegex = `image/(${imageMimeTypes})` +function isActorImageFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], fieldname: string) { + return isFileValid(files, imageMimeTypesRegex, fieldname, CONSTRAINTS_FIELDS.ACTORS.IMAGE.FILE_SIZE.max) +} + +// --------------------------------------------------------------------------- + +export { + isActorImageFile +} diff --git a/server/helpers/custom-validators/users.ts b/server/helpers/custom-validators/users.ts index 85f3634c8..5b21c3529 100644 --- a/server/helpers/custom-validators/users.ts +++ b/server/helpers/custom-validators/users.ts @@ -3,7 +3,7 @@ import validator from 'validator' import { UserRole } from '../../../shared' import { isEmailEnabled } from '../../initializers/config' import { CONSTRAINTS_FIELDS, NSFW_POLICY_TYPES } from '../../initializers/constants' -import { exists, isArray, isBooleanValid, isFileValid } from './misc' +import { exists, isArray, isBooleanValid } from './misc' const USERS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.USERS @@ -97,14 +97,6 @@ function isUserRoleValid (value: any) { return exists(value) && validator.isInt('' + value) && UserRole[value] !== undefined } -const avatarMimeTypes = CONSTRAINTS_FIELDS.ACTORS.IMAGE.EXTNAME - .map(v => v.replace('.', '')) - .join('|') -const avatarMimeTypesRegex = `image/(${avatarMimeTypes})` -function isAvatarFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) { - return isFileValid(files, avatarMimeTypesRegex, 'avatarfile', CONSTRAINTS_FIELDS.ACTORS.IMAGE.FILE_SIZE.max) -} - // --------------------------------------------------------------------------- export { @@ -128,6 +120,5 @@ export { isUserDisplayNameValid, isUserDescriptionValid, isNoInstanceConfigWarningModal, - isNoWelcomeModal, - isAvatarFile + isNoWelcomeModal } diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts index fe4796a3d..917fed6ec 100644 --- a/server/lib/activitypub/actor.ts +++ b/server/lib/activitypub/actor.ts @@ -34,6 +34,7 @@ import { MActorFull, MActorFullActor, MActorId, + MActorImage, MActorImages, MChannel } from '../../types/models' @@ -169,38 +170,34 @@ async function updateActorInstance (actorInstance: ActorModel, attributes: Activ } } -type AvatarInfo = { name: string, onDisk: boolean, fileUrl: string, type: ActorImageType } -async function updateActorImageInstance (actor: MActorImages, info: AvatarInfo, t: Transaction) { - if (!info.name) return actor - - const oldImageModel = info.type === ActorImageType.AVATAR +type ImageInfo = { name: string, onDisk?: boolean, fileUrl: string } +async function updateActorImageInstance (actor: MActorImages, type: ActorImageType, imageInfo: ImageInfo | null, t: Transaction) { + const oldImageModel = type === ActorImageType.AVATAR ? actor.Avatar : actor.Banner if (oldImageModel) { // Don't update the avatar if the file URL did not change - if (info.fileUrl && oldImageModel.fileUrl === info.fileUrl) return actor + if (imageInfo?.fileUrl && oldImageModel.fileUrl === imageInfo.fileUrl) return actor try { await oldImageModel.destroy({ transaction: t }) + + setActorImage(actor, type, null) } catch (err) { logger.error('Cannot remove old actor image of actor %s.', actor.url, { err }) } } - const imageModel = await ActorImageModel.create({ - filename: info.name, - onDisk: info.onDisk, - fileUrl: info.fileUrl, - type: info.type - }, { transaction: t }) + if (imageInfo) { + const imageModel = await ActorImageModel.create({ + filename: imageInfo.name, + onDisk: imageInfo.onDisk ?? false, + fileUrl: imageInfo.fileUrl, + type: type + }, { transaction: t }) - if (info.type === ActorImageType.AVATAR) { - actor.avatarId = imageModel.id - actor.Avatar = imageModel - } else { - actor.bannerId = imageModel.id - actor.Banner = imageModel + setActorImage(actor, type, imageModel) } return actor @@ -310,27 +307,8 @@ async function refreshActorIfNeeded { updateInstanceWithAnother(actor, result.actor) - if (result.avatar !== undefined) { - const avatarInfo = { - name: result.avatar.name, - fileUrl: result.avatar.fileUrl, - onDisk: false, - type: ActorImageType.AVATAR - } - - await updateActorImageInstance(actor, avatarInfo, t) - } - - if (result.banner !== undefined) { - const bannerInfo = { - name: result.banner.name, - fileUrl: result.banner.fileUrl, - onDisk: false, - type: ActorImageType.BANNER - } - - await updateActorImageInstance(actor, bannerInfo, t) - } + await updateActorImageInstance(actor, ActorImageType.AVATAR, result.avatar, t) + await updateActorImageInstance(actor, ActorImageType.BANNER, result.banner, t) // Force update actor.setDataValue('updatedAt', new Date()) @@ -381,6 +359,22 @@ export { // --------------------------------------------------------------------------- +function setActorImage (actorModel: MActorImages, type: ActorImageType, imageModel: MActorImage) { + const id = imageModel + ? imageModel.id + : null + + if (type === ActorImageType.AVATAR) { + actorModel.avatarId = id + actorModel.Avatar = imageModel + } else { + actorModel.bannerId = id + actorModel.Banner = imageModel + } + + return actorModel +} + function saveActorAndServerAndModelIfNotExist ( result: FetchRemoteActorResult, ownerActor?: MActorFullActor, diff --git a/server/lib/activitypub/process/process-update.ts b/server/lib/activitypub/process/process-update.ts index ad3bb392d..6df9b93b2 100644 --- a/server/lib/activitypub/process/process-update.ts +++ b/server/lib/activitypub/process/process-update.ts @@ -134,13 +134,8 @@ async function processUpdateActor (actor: ActorModel, activity: ActivityUpdate) await updateActorInstance(actor, actorAttributesToUpdate) - for (const imageInfo of [ avatarInfo, bannerInfo ]) { - if (!imageInfo) continue - - const imageOptions = Object.assign({}, imageInfo, { onDisk: false }) - - await updateActorImageInstance(actor, imageOptions, t) - } + await updateActorImageInstance(actor, ActorImageType.AVATAR, avatarInfo, t) + await updateActorImageInstance(actor, ActorImageType.BANNER, bannerInfo, t) await actor.save({ transaction: t }) diff --git a/server/lib/actor-image.ts b/server/lib/actor-image.ts index 59afa93bd..fa1a2a18a 100644 --- a/server/lib/actor-image.ts +++ b/server/lib/actor-image.ts @@ -34,11 +34,10 @@ async function updateLocalActorImageFile ( const actorImageInfo = { name: imageName, fileUrl: null, - type, onDisk: true } - const updatedActor = await updateActorImageInstance(accountOrChannel.Actor, actorImageInfo, t) + const updatedActor = await updateActorImageInstance(accountOrChannel.Actor, type, actorImageInfo, t) await updatedActor.save({ transaction: t }) await sendUpdateActor(accountOrChannel, t) diff --git a/server/middlewares/validators/avatar.ts b/server/middlewares/validators/actor-image.ts similarity index 84% rename from server/middlewares/validators/avatar.ts rename to server/middlewares/validators/actor-image.ts index f7eb367bd..961d7a7e5 100644 --- a/server/middlewares/validators/avatar.ts +++ b/server/middlewares/validators/actor-image.ts @@ -1,13 +1,13 @@ import * as express from 'express' import { body } from 'express-validator' -import { isAvatarFile } from '../../helpers/custom-validators/users' -import { areValidationErrors } from './utils' -import { CONSTRAINTS_FIELDS } from '../../initializers/constants' -import { logger } from '../../helpers/logger' +import { isActorImageFile } from '@server/helpers/custom-validators/actor-images' import { cleanUpReqFiles } from '../../helpers/express-utils' +import { logger } from '../../helpers/logger' +import { CONSTRAINTS_FIELDS } from '../../initializers/constants' +import { areValidationErrors } from './utils' const updateActorImageValidatorFactory = (fieldname: string) => ([ - body(fieldname).custom((value, { req }) => isAvatarFile(req.files)).withMessage( + body(fieldname).custom((value, { req }) => isActorImageFile(req.files, fieldname)).withMessage( 'This file is not supported or too large. Please, make sure it is of the following type : ' + CONSTRAINTS_FIELDS.ACTORS.IMAGE.EXTNAME.join(', ') ), diff --git a/server/middlewares/validators/index.ts b/server/middlewares/validators/index.ts index 4086d77aa..24faeea3e 100644 --- a/server/middlewares/validators/index.ts +++ b/server/middlewares/validators/index.ts @@ -1,5 +1,6 @@ export * from './abuse' export * from './account' +export * from './actor-image' export * from './blocklist' export * from './oembed' export * from './activitypub' diff --git a/server/models/video/video-channel.ts b/server/models/video/video-channel.ts index 74885edfb..d2a055f5b 100644 --- a/server/models/video/video-channel.ts +++ b/server/models/video/video-channel.ts @@ -99,7 +99,14 @@ export type SummaryOptions = { } } ] - } + }, + include: [ + { + model: ActorImageModel, + as: 'Banner', + required: false + } + ] }, { model: AccountModel, diff --git a/server/tests/api/check-params/video-channels.ts b/server/tests/api/check-params/video-channels.ts index 0dd436426..bc2e6192e 100644 --- a/server/tests/api/check-params/video-channels.ts +++ b/server/tests/api/check-params/video-channels.ts @@ -234,7 +234,8 @@ describe('Test video channels API validator', function () { }) }) - describe('When updating video channel avatar', function () { + describe('When updating video channel avatar/banner', function () { + const types = [ 'avatar', 'banner' ] let path: string before(async function () { @@ -242,48 +243,57 @@ describe('Test video channels API validator', function () { }) it('Should fail with an incorrect input file', async function () { - const fields = {} - const attaches = { - avatarfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4') + for (const type of types) { + const fields = {} + const attaches = { + [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4') + } + + await makeUploadRequest({ url: server.url, path: `${path}/${type}/pick`, token: server.accessToken, fields, attaches }) } - await makeUploadRequest({ url: server.url, path: path + '/avatar/pick', token: server.accessToken, fields, attaches }) }) it('Should fail with a big file', async function () { - const fields = {} - const attaches = { - avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar-big.png') + for (const type of types) { + const fields = {} + const attaches = { + [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'avatar-big.png') + } + await makeUploadRequest({ url: server.url, path: `${path}/${type}/pick`, token: server.accessToken, fields, attaches }) } - await makeUploadRequest({ url: server.url, path: path + '/avatar/pick', token: server.accessToken, fields, attaches }) }) it('Should fail with an unauthenticated user', async function () { - const fields = {} - const attaches = { - avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar.png') + for (const type of types) { + const fields = {} + const attaches = { + [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'avatar.png') + } + await makeUploadRequest({ + url: server.url, + path: `${path}/${type}/pick`, + fields, + attaches, + statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401 + }) } - await makeUploadRequest({ - url: server.url, - path: path + '/avatar/pick', - fields, - attaches, - statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401 - }) }) it('Should succeed with the correct params', async function () { - const fields = {} - const attaches = { - avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar.png') + for (const type of types) { + const fields = {} + const attaches = { + [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'avatar.png') + } + await makeUploadRequest({ + url: server.url, + path: `${path}/${type}/pick`, + token: server.accessToken, + fields, + attaches, + statusCodeExpected: HttpStatusCode.OK_200 + }) } - await makeUploadRequest({ - url: server.url, - path: path + '/avatar/pick', - token: server.accessToken, - fields, - attaches, - statusCodeExpected: HttpStatusCode.OK_200 - }) }) }) diff --git a/server/tests/api/videos/video-channels.ts b/server/tests/api/videos/video-channels.ts index 367f99fdd..8033b9ba5 100644 --- a/server/tests/api/videos/video-channels.ts +++ b/server/tests/api/videos/video-channels.ts @@ -5,13 +5,14 @@ import * as chai from 'chai' import { cleanupTests, createUser, + deleteVideoChannelImage, doubleFollow, flushAndRunMultipleServers, getVideo, getVideoChannelVideos, testImage, updateVideo, - updateVideoChannelAvatar, + updateVideoChannelImage, uploadVideo, userLogin, wait @@ -21,7 +22,6 @@ import { deleteVideoChannel, getAccountVideoChannelsList, getMyUserInformation, - getVideoChannel, getVideoChannelsList, ServerInfo, setAccessTokensToServers, @@ -33,6 +33,13 @@ import { User, Video, VideoChannel, VideoDetails } from '../../../../shared/inde const expect = chai.expect +async function findChannel (server: ServerInfo, channelId: number) { + const res = await getVideoChannelsList(server.url, 0, 5, '-name') + const videoChannel = res.body.data.find(c => c.id === channelId) + + return videoChannel as VideoChannel +} + describe('Test video channels', function () { let servers: ServerInfo[] let userInfo: User @@ -262,38 +269,85 @@ describe('Test video channels', function () { }) it('Should update video channel avatar', async function () { - this.timeout(5000) + this.timeout(15000) const fixture = 'avatar.png' - await updateVideoChannelAvatar({ + await updateVideoChannelImage({ url: servers[0].url, accessToken: servers[0].accessToken, videoChannelName: 'second_video_channel', - fixture + fixture, + type: 'avatar' }) await waitJobs(servers) - }) - it('Should have video channel avatar updated', async function () { for (const server of servers) { - const res = await getVideoChannelsList(server.url, 0, 1, '-name') - - const videoChannel = res.body.data.find(c => c.id === secondVideoChannelId) + const videoChannel = await findChannel(server, secondVideoChannelId) await testImage(server.url, 'avatar-resized', videoChannel.avatar.path, '.png') } }) - it('Should get video channel', async function () { - const res = await getVideoChannel(servers[0].url, 'second_video_channel') + it('Should update video channel banner', async function () { + this.timeout(15000) - const videoChannel = res.body - expect(videoChannel.name).to.equal('second_video_channel') - expect(videoChannel.displayName).to.equal('video channel updated') - expect(videoChannel.description).to.equal('video channel description updated') - expect(videoChannel.support).to.equal('video channel support text updated') + const fixture = 'banner.jpg' + + await updateVideoChannelImage({ + url: servers[0].url, + accessToken: servers[0].accessToken, + videoChannelName: 'second_video_channel', + fixture, + type: 'banner' + }) + + await waitJobs(servers) + + for (const server of servers) { + const videoChannel = await findChannel(server, secondVideoChannelId) + + await testImage(server.url, 'banner-resized', videoChannel.banner.path) + } + }) + + it('Should delete the video channel avatar', async function () { + this.timeout(15000) + + await deleteVideoChannelImage({ + url: servers[0].url, + accessToken: servers[0].accessToken, + videoChannelName: 'second_video_channel', + type: 'avatar' + }) + + await waitJobs(servers) + + for (const server of servers) { + const videoChannel = await findChannel(server, secondVideoChannelId) + + expect(videoChannel.avatar).to.be.null + } + }) + + it('Should delete the video channel banner', async function () { + this.timeout(15000) + + await deleteVideoChannelImage({ + url: servers[0].url, + accessToken: servers[0].accessToken, + videoChannelName: 'second_video_channel', + type: 'banner' + }) + + await waitJobs(servers) + + for (const server of servers) { + const videoChannel = await findChannel(server, secondVideoChannelId) + + expect(videoChannel.banner).to.be.null + } }) it('Should list the second video channel videos', async function () { diff --git a/server/tests/fixtures/banner-resized.jpg b/server/tests/fixtures/banner-resized.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13ea422cb09c278d81a796ba4aa59c2142661847 GIT binary patch literal 88780 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 D_p9DH literal 0 HcmV?d00001 diff --git a/server/tests/fixtures/banner.jpg b/server/tests/fixtures/banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e5f284f59dd5a734831304a6fde1405b5e7f23df GIT binary patch literal 31648 zcmeIa2S60P);B&|sM0&qmL?!=cUh`*sS1KL0a4o0q<2uN(gdW70u~em1O)_CL_|co z1rZd)1_FYJO7*b-`(+kTpXYkL_rCZ3|L^yHubG|6FDEA_CufpOCdn*mkTeW2ZPPQ< zgAfP^LVyDzjTj{9hIzO`kfGsbh#G<*I*0**gct!j1x`kQDS=-JP9}gEfL{kr76b}T zPChpxD9C;b2=lDrZh*ztc#r_&Kw5g>KLjTpU^d_ngOe4xDhKBANJNw6EC4K;w2F7A zLy!YFojiOT1Hv)RzTVz0K0y$))zQb-XZ4EFH8IB+%VQw}kPg;q-PboXHpSp&a99~U z9^{I}<5aK&6|5o#tE_^q-V}ON{R`mknAh9(}1Q@%9VSVvy zI>K})g9<{!@pw5LDr2>LF8~vI4bK701TYogp+rFt^BQIVm}L!f0F207m4krol0{1{ z4?mzIvsU%o1TcDyE(0)C)~cQqKrYQ11`wiM<5vJY5m{7FmI?%^1DpUb2Z(>522{>M zLVyI}X2b}c-h6>lpg~MVIg{yhNHbxe%-XA|s2tuvlLQrWK&aUeD8pvl{!|wrR zI=h+{wi}{&6$1z%f5508Fy#*zSG-zxJ_0%TVhXaI(V$Kc0G$uW5CK>o;0*w40}MM@ zM@?|i2RrLSJ$b^?cF zfhAF7&B6c!H-rQSuq-&m0onrm7(kZ;SPI}qfRz9~4e%tuY5;QsoCKPh2EgRIq6k69 z0fzHE3+VX(GXY!H!5R+;0$vn^ z1%42qX9KJaa6iC>0J8vW4QeeKU?G4b0G0<9f#oy<3_Ieg2PuJ?iIcmc? z2*3waMT{cwDc}_42{=em0fQwU04QNG1bK{tGKQdxkzb|$yI0(r^#7t9(5gZ4Fmit* z1vI5Kk-%5LVu9xH1stINk_Q$cpQ}9UoN(;#P!{GWG_)&73L%gbZra2PxuG)2(I;0dcCIna@S5PVg};K2_EdKpE~_y8*~1l)6h zXg~)Drs3ee1y~vfZVX_>Vd3rzaDXK1rvJ66;0_PY5!ez9}k!E&{eX z0q(#6Ne*;|!2XKx9RkmIMGPPS-9SQ+t-KM-4~fL1X)+nZTIhn-CysEj<{C;eSZCN`Hhhw6VC_5UmDm{R=gSVH~m zC`112ut5Cm__@9pR(^I^FaPX7Fa7MO{_?Zq=ehkSsG1PNOri#z0~Ea~jr4bMKG;Op8I8n>cO1rBzZpeXX*Ym8a#vfuel>&hWT$D$J)Fr6Yyb8 zJ%G;-P7Q$J6Q0Qw0O!BzU|BzN|GM5klk%UVt?RSyuS>oTU0;X)*ZS)^ulxT*P!zvA9Lhn|D=qE!d42mRWS$n6y7f!9FR zohf;pbv^XmU#}7C{(8)MKI{HJqOZsQRn9s+aSg1;|J7gT`~S-at3_n@*Yf?N{MXa{ zmCtX@+BxLD5rT%mniA~F*6v0lxrc`!9r9`&1pT}G4&>D|2vQ-hRzXlTx&MVA3|L=U zb#Oa_-FkR6^!>UTU%sa2YXAMu^Z&d053kuJV@)CVwXoEh50(sn>DKGdUzz?&UoZXN z-nVAZFMS42E)p~W&Lyw{OM>RX<9h|_0qDD&f0l1u69iZ*gn+zQARAr{q=cIPOV7o1 zd8__k?fvK2zaN6vGGPa=h{L-s5bF;8kzvPrdId1upTb zgMA7pW-SEP@z)SorvGnuaJ_-ux*b~Av|A6a#(t0gD}6oQ5(fu2H|lKp;k zGMT=JC?$vABdy6k6~zh(lyt3nE|ZWDeEz501iYaJeS)H%<)1;PzVUrW|7=>A?-m6; zdJc7yg6apfffCjLM`6l_hBq6bBhc1731r%1v>&Gd*(N8cV(6I2no3c*F?>&PhRoN6 zX5gY;lcL84ECr`QL^A#w{p%_IGZva7m!k|=qm+UI{TcOM*Vl=dc70;}G7ck*9X|98rN*8(wr7U0gr3>8B~%ms|I zBwtb-*vKWaa0Vf!uov00cP~-}>P57Pkz4!vz!xG3fQkY;%jt#0#lIj$jOz33hK)|0V8M>G(i82k$Ra@_?WQy~u&6(Ss&2JJ&pBAWS!X(7f*9t|+Q>q538 zuONrW=UY<7%KEvU_Mh{KWVTx5W8`{zcyH-%_upfI)w}Wi3Zp-V;4pkZknI|>UJFAs z|L!p0S3UlBdxU$7f$n@XM_`C4`!H5(MA1mYo1=e`so^6!|3WbIs zVZ<{e0zHlnrI@2Ir94XcfRaSHnaYUDlPZ?#7*#1%Jyj3Y7}ZBAO6qmj4jz{9?ri_HW(-7f^oqgq-D}Z5N`xlYS!O{S52DB z7zF^_=l<(`;HreejjO#+{YEPAR^5dBgcwJ(fE6GS=oNX&oBwK&1uqlZN0M2sQFfcPcKzbel-l2{GE*LA9fItsl9}G?gD+5o2gITspXFdb+m$l!% zsolB_D<_W!Us^%BdeX)?d1->Yw>QRBR!&Asw=jmk8ZIZ#Rm0!23PBlM zgN*R2C>sI`9pdWw$!3q!U`Ed$yrIFf7;7(V1Oo1%#qzt z9xR?l4Kf3!Rgjaz62SeHBPc4uHDJ{W(rZ2}WHsMa|JQW@)RHx~$_-D$gEFq&UU0_{ zt6x^aA`xp?7UlroiNj3o;M-l)+Bf6y3Jc{An0*byd+#Ph?yFa1s{zfgdij{0>z9VwSxB$P!QC*r9lxP6dFkh zQBWb)986ku2w+e&1!)MP1N=xP6nxt)!*;xxG8VNhs(!8WzRpBt?mfNVTgB^L59bX8 z^fxeA65@O3b5eNTo|=7h@3gF1pFR^(13RF=ohCf8!zJuOBpVN%mwgh)fG@}>TBulO{O+J zs3c67ayl-#;dTF_eD+Bq%9D;C8Y5WtBpaoi3K!1!nVm(yl5z zr_9KVP`y?)E6X*@x*QpFMzfGDMtw{se8WcHfR?UN=7m!4vMsws_Vh-N>a@iNQI&+- zcBo%uYdyfG%%ATTVvdf9oqH#eYAn^;eq}U#3^nMKT-b9Zk-tOwqJ^A%l#N2R?LANG z%Exb)P8gmLx+EMUd*i@xcDQ`!*lbE;QF5*R)d-{xEB6s`u?4<4f@qQ7a-wqCVei~e z7amR8lOV6{^-rpCs_OcdBD?l=?lLdQn9et_x}9LY%_dx+Da^MmO7L7xbeT#I3U_7a zTRQ>vPgFTs3N=-i^u%~Z86n=!?{~fI_Bu9t8fB7UBF4EdN280ooCKAHMjw2@a{00O z5*-O@YIHoBo>^k1&&%tZ*67dBlJEU;#!G-VLi43iYgF&((yrM}kK7*J-WV##(JtG* zBFdX_FQWF$?H3#KK5)|SQ{6UB#SIj(u zL7z*twoB94ZDe8K?q&q#q!qz5kv92pxPt%L!~NwcYzWT@#>AF#WEm8~OKh;Q|Aa}+ zbUkd~;((kB$rmWmKdBoNYPO7(EHa@Z7WYUoh*FWxIrk#FVMBHWsl&iHaVs(yUYtB zv}oU3?F{ZgiKf`A9+XFy&q>A}8Ie%+yc8FJ>iQh}b!3JFvDokmNi4p2AG2bOIRWuC zpV9m3+*am18T95|bm#4r@ zSqL_U?UeaGd)Zw7SQ$w_=d!3JC%fHhk#YV$jfl9FwUnhjeV<65J3GyhEBx1^UT(dw zFGZxJ<4Tj=Xnm*e0MSb^J80V?icYheD}Qr)fmF%UfV+w;`>xvGAZ8cG#1u_2;Mf{_ zJI7r1Q_bHhQ=BK(Vx<_jcaCTKn$kd4oQ!-Nleb2JL2ltid_C{IyuBQ60!&+NQef1V=Z{DRVl#-uE_pzUOSn=WW@GfCb zgB_3AX#P;z_cGhZ!f6fy0!tY^z``ienk_g10mk3zK;PPVk? zJPWU1csa>1p*l7weSlW|lbsyL%{!te^e*2F<;tR=s(JpZ-qB%@qK1Zj*9XhC7vZU* zyD1aPuoA}o+Mc%d3QP=qMZAXgA*=(lfck~cS zyLBp@#w*{1tNFf(Ee;#YydvRYys^rdA?)ib;g~GF0sVtpqVz7=xJT>B?V;Hje#26e zTJq_J*61ruOJjA#$Qu^SpC^h#Zb{fVv-0f49{tGm;LUU6mMi+UoLTou9)5{vcsFHw zn`iII3@ee5wC8m;lSJ{J*G+8;mj#-H5X!rBtMU{1pGY~G4P$I;tu#m9CF;E?o!7N` zdahgRm61Z4zs-(1$gId{p>>oZL9qZUR`-JsmGtnFC6m^L|ffWulOVIz}~2CCuB;+a<^m6XxyZ6Q~lVCPWsl0x(RL6~d5N zf;`oPtic}!ZS@83Mg$px3|1QaF;WO#2*?N^x~iDz=&eZrAvK{jRYOBVWkTg-d;{EM z!Kc>BvRJ$<9xn|zqyxi!f*ix7eFBBoCFr;WItO_81;H;}utY~E-{2rMA&@^=F%aXd z8wLn#qTw)Ea9|Ko)(`{;pdf%j77W*wq_KEuyfUo&YN5RSjE%pg{HguCy}xk>2I+=; z&*!JyffnI@F0y7Wfxf{3&Mvwk;7^x?*E93;3J&}+ui!uzm_*jqi|8r~)Fj`rb$BJLY6NcWBTr|QE(fkjkw ze4T^g;uAOi*@`COG4ir5#-qm8G%rN?4+T0uFqy z>as4!&?hj+(Z|^ZmIEZqcmN?-XJsewpDNDMP6~=HAU$4QTFFr!q<6$Q;a!}Sm7EAp z>*-AbJV2Fo^!iaBSPl`$aVE;ifzO1o(sC{YS7`#)MN!(x$m5R`;4 zun|?XObyk9@G{u7psAN*kgIQix0;ZVhfi?W8r8zX+r>P{5jGJH=%=U%{t1JCSCW&H zmtW&pd-I1yk^dY^2t#yM(F1}UL9Oucc64)*-RI}xMpj;BYk-SmkZ*v6udkPy(6_(T zT8%Sv4D#@CQxn3%ReY`fsu=k?1G29VIiU-2t@&s>y2%14`}ev28e{J68|w29Qm^x@ zr_~Aw3iS=}GzlAe$`FU1<$j2hg-iNFHw@GwlR)1N!*7oYb&vV+$) z=v;g(&4DihPF}Dp$q+JzOd$-|6B-P@EB69xZPLK^0hB<<48&{yo%HZOlk$R;!62m< zNZ|}p=s>=ZH`w0=r-$Hs0C<4=ZreatIk3tC9D+_8e0cSOM4AWt@2IjNXgPyK`g(>$ zT0RSwU7kTuv(NYRzJ=f~OBMk=<2y~{G*~E$gP<#|-)Tk_4_!bGd)ft*(OY zK`i`f6-*8o3`{B^5U^#)4h1&qQ6MO(zzPr9t zLtOzwOr)65jahYjzNm_Eb&DO5mm^9}D}U^EsS_nm*0789Cbv9isohUFOyKl9bYnP@ zhdonXq`*k@rJ|e8wY1Q9{6&Aek{+HEiSiO3ZT_o#EU$a-di&XjFE){&k%SMo-)B#F zeu*GKMyEGZL%k*`GVqdaht0Axb^?OJdrt zEh-!rLq31l?9nH$XA*I%DQ*83ikfDx0&(^$6rX8>yuBQ15-c#1MJ~6EKALZG`m&Pz ztd8MQ7g`~{A=p|lR^d%aNXVF+_^YG?W7i}N^UB*g7j1Sa>nhDsp1P>UZKJjz)sVkm zX&}`<&MTacs6*{DnUr2Goi{yrztJ=OGVRHV*JA^=WicnGExeBF<@fHYt}q@deNEdx z|J0k6?F;t3&7%C~jjlr+E)ClTVzVk~-BK3Maxq=qm7mV8h;!d(MGPNOy^uV8u#XOX zSzf;OA)igZkMz(rP9HgEopVDF<@{UC3SM^Cxn~KCCrocKiS{-WCmuVfzsn@of+DJQ4*isAt4>1X4Sv3I zJq2Nw>kbl5Zn~by^gY`ib6@Oh(x-PAJE$hzxM;HbaQ=P6tD*6pW#`1**!wR8$bt!3 zX(o6N#5V_e4Y=krLo5`mf|a)9 zVRoDEb^@*8Yx$54@0k}Bv2t^)EJ{z}d9IoW$8I|{Ll=I;-o;XU{}tZX<*l7_r{sH$ ziNoh>as^{lO*)sZs18@(DYX+Ai_klC;+dQNY?CwUj!Bc~qt62;!~elAe`0U&>uY(Z z567bHD(-uX-^|2f(=;Z#YQra@Rp$5V3!SHJbo9C~{WZ7ihSzMGzVJfM!qzLNY@Dm*J3PiTv=Oq&Lfb{7%C=m|shxeMeLZ7p)^De{ z-lsfPPfm%s_La8jRHmWBf&DBwH*7j}eeUvE=H<~4bX6u9Swj1bnU_8EmJ=4Pnm+ed zzq>oCh+>Q2wVB&z#l%cLTN=_mVYAxeB6WS|BFe6_O@gwM>iV!;_6u_nD2dr6leADq8H;Jimz;Bi|pb#500? zyMY}%VO#v2pR!@mmTHT+(_PkF;l8}8A$RRXm(INQ3{8_!ahCQzosm^kYjc-cYU8+V zSWWWP-D(12+};l)ryh}@QOA3nk#F)X%!!mnAD4;7F`W3y7D31*Z3l7ktd!vlzx5j{ zM12$09kGtLl^vrmtj&ieQ&gp-PUNWPZtV(djO((xm($s0aQ(|h&qt0Tu8Z-!+fP_Y z1}J--{4g+k``sClYs0hpGP(>VWg4TkgD*3q^u@y7%o*6_6iD?r(IX!rJ`L}Zcy{{2 zp2(?IZ<*#!{F0eX+KQG4P2T|zv0(cf+!vF}I44-9b6DjZ@FiVu7eCnG+=`d8_-b*H zxo(C`oR4n~41TdIbKy%pGnd}Kc)M~3{di`Iy=8>#Skvz2jeG7`?dAL|>U;9-oOo>l z|6YYCr6y^snz#2G-`)$f8^8zpV{;U&j2x~m_02wu{y69Fv;8ww^H7CI?H_kmjArVu z`3mfL9z7QtLxN^=!bni}DXvWeoVdd)RJ+uZzOyg6Ekn8bMny;WfBM0xu`(+;+!#JOnY*Q^gd8(o^U&I^`0yW?4U zYR{z&84NdXj~hsxb>F1QDw(@~Tuy*S?CtYFsD0*?x~N^#u84?;ts#u6deSLrJXa?j zJo~3p#p2V@m*&`leQneCc!cn^=SC$i=AYTO`5?-YYwUcOnd|(9)cQ~E=V=dYO!v%k zdy;y|Q;}h}z9i>hik#IB+4xv9{*Sz+hfh4BdWW-UZ?!_a+tJ_C-nKzL>f)w-Mv8R| z&W0`&hs`Kt>TgLtkMzvubehx}JNnRZPr`^8H}=FW#Ke2uC!@pr19upHvTGzkeMj?% zS{-GAH!hUVeCd}tJ};}AQ_bs2wcH=r&ufvffA_7vL0a`b){ea71H0U@B8LXc_m77) zSk!K3a{gAno`B`-Q-BCfddrKeYwwMkq#hV|!e}67?XI`dlZRt|- zhP2uf8Ii{oS!4G+8=?J2{w#)_MKrxgt9ZZ3w|9ZKeHQ1s7loo4QNAzBxt zggAg=vUnKDCI&3uHnz5C8e;||l>m?IhulCO4 zvit1?Z|p#xpC&;b_wp;Icbpqe7EH4%tz(JnJa|JzG5bEW|5DK%S2rFii8LPJ?r@VM zXYo}TO~hpz`ZupbKidy3-rm@wF#Ez;Oq6e?vc))e6U8gbCn6KNi*0R*ot9=*qke}m z2IBVYTa5WaduCmtuLh`TK9F5(ZI;h1pW>9;@WkY-m|Zk0oz4CU{#aGt-N)F3k7!Pe z$yDYVLgs@M4TX@m?ecRA)_!71dy`I+YutyENhQbfE_sYen|en&c5RrE8xPuGQhUMV z+7{)Z_R78scl?(UjBs?EZwb}hP(z|p{pHR>h6Xk^w!0=LCJ=0PJC8-&xvgEL>wI3) zazMwUyToFGdm+d=+p^?dz+Au3n?HKyb`-k5J=C?4iT7RYQf=c678QG5iA<{u#{sdH zxR@rM+7pso=Z2C)(=!fph^tg`?6)c_uXxg!FvuelHyA2&E?uCjJ9xS)s%E~A{k>oa zVd+9eFq41BymYotyA2;>rgV}G1tR|Gp5s{oa#kXg-T`7lA7+X%EhQ__M` zu64B*Fg&5&;Bsq68`I3V)8bQ0eTi`=-uMB=OwknqyUNgr=$La$QJhEZa=l831!2!L zd@m0#1h*zGlr3@169+kXeL4AGe(`L5SQJdRdnAOwSs-y0^@`ZVuFWJg^GO`f^$LSXksJJ)R+ zCro7*HEASu$(`HWVpkO-`1G;2xqZj<@%GA*`s0V$a5k(RGZyD^jHdi%F16mQ?~U!4 zV)A@@i|e6}%BF!?cki!*r<_+5kEFFHcVxGla@Gh_zL^$4n4ICypBj7G)8xQnYESnyiFSJ2_Lsz&9M~kr(}CSzUO0UrO?NM zkI|7s`CE$@UZ+pZZoXeSI+1-{*8f@1(HmzIs~%s|o?|f-c~JB)s!c-Vh-}@iV5xn2 zrW9dboQ2TrLSHW?;41$EbN%eWJ=L$f1m09~@Tr_kiw>I%p11SztlDiXE-{Q#OE^9~ z9!JD3zHCl?I&kZuU@vsd(LzDJ>u4 zjC&Sf$J5p#>@F+b1vKKMomm03A5SwsH&X>&#PI;J@Q#=us%+}G@-f=!;8+hW=x8wBU{)#^5 zuZMRot_&WuH+Xv4v$sc^hWqqNhg(1LU4CSieTb=Ix9n8d`x!F0U3o5dAN}xl#BcKDpi%o>H?c%xh|D_{z|Q`*uAABVI{z(Z(_fs zo7?7YYM+XW?sG>!Fh2{SEZ+32W+t%$$rS|tMPlXi^Xtq_#w*socK(AA%uo6vwI2HK zLAoEg8I&DC-&n&1an0Sm`;r7n=x@GpvqWlPb8v;>WU+3d_+z7G%PVgC%*;(YE%^r1 z<9RIuHBm9t4)+G?!@pAGocw_4O?bkcOc|t|94@#Gr#0V_Y8z0GTW0h&~;fUv}4i3kPYPHNs3vTlpW1A!mQYkVr7{ZS<6 zV=j1JMW~EY=OR=3WUT#{az5^leUx-(B`dobR+#k$BIJ+xW}bWqd<9|rVv{Ka? zDj&YdQOm<<%sU%DHh6z_*<-Z*6hnBpQGfWTW1W#|g8AY&2?~{^GhuM2Zk?;2H_DgC z^Y9Mk-H~kT^_NZ0%&DI|XKRvZb4`D@=s=)Dadqjrxx8*g=c6WXa!$!pY_imUt}vk! z$5wvXCNC#zO5=*^_IT~WY3BK%peWr=(Zes*?nWs#ZN%~tqQAb@uNW`uR?Z-DzR61I zwv)NlwQbHzWDno5nlYuy{%OuhROm~IU9y9b+5_7!9%{R~TRD=S=$gM2a5Zp8>yp7n zhSB$UsTWrQ;x6zXiMv1yFVNT3THrmTy3jolu)i+7`uuq8`>JWHk$@0gD(&WLqWy<7 z%k|p}o1<%LH~yg!e5(G4vG@Lfl8b}tNvX?6%_O=6>54xD2fdw%GMP$rWgFo3KS|Gj z+Ea$`KKVwytuz0Dj7n`_pIdqj8$)`^zPqL8 zBTrZ9m1!oMbENav);vPLAk^NkC^;Cm6pX)CamBE$!z<;*;}37CW#O|5! zKa38E6m@O9lk3R-(R;sO$3^S~b1n|G;iTdgpW6$xkDa*;zPR8|^*HYR1par)nTZ5l zi2u@+LYYsgQV`I6(E0JXus-C0NuF2>ftWDu%ASSohiW#=5w*l8Aq$VZ-^Q)mAFjvJHDmZXUWfX{&~BLLXEEA zfM62R*o}XjLRds5W$*23!v@PI+Ie-ij#$t6pxB23lwNAy(UlF4ZhKn!neL+AAe&F2esZ6>Z#-V zI&Z!yZPBOIX?=1@#l^+I4v`X=wf{15zRfK$rM=)?-m}eSmYVl_9I=mC8rv;>?z~^T zEhn-teb6XIDE6y!#j9thC6prGQn7C27Z4+8yNR{Gs(N4I=W3qwLHT~w!xF{KY>(LL z{3kL~KeG}}GhJjDWNlX0XTm#M9&J)tPR?!;NTWUZ?x>yX*&arglqO1%`LXQzmN9?v z`-(M6m%~q4$OK$epmYWNMYtuIA9wTfW>NvHO*cB1&KhRL!Y8ULFJ3k$5tHEp6UE-35L>-<8 zn4P^taY)80%KYBI)APflwnL#^PI7Ovw9j9YOztsVKDqEhCRdOIc_#{gD!X)M`AZem z$T^f}XEm2b0(GCqSb53m^kCmg@8IlDUmmA#Byx^NM2d~(@KmT6zsZy*JPhX{Eah(V zI=Z^M9f1bB+fmeD=iln?cJKv&AP&W%wbM}ue};)w+aKQC-iyYV$!U%_1q9B_uFdGs zYe4>YNKlUJC(}1##ca1O_dRlErcTnnrK!`;bo>=&Q{CnJdiO^t%06xD!^mA_%D3gI z?hF`jO#dT>^_3sX>HV>ntEDvuANJwuN(l1tWBHRQuV^WUD9-d_WOgc}X>>Yj-$<-26ditZ+B-;6t9^mY0G?NtJP%>Y1yDR>1II9|Mkgk?+*^c9J=;KSmWoX5Nhhm=h za?#Xm-~G@L`(8S3gsnJf?+laq#?Xutm|muMCT5MG+t))_U-X@Cyg!Tr;NE-ZxP$waS$ALV@oZ)kckD3D=%4ULc?6(Z?OGaZ zON*}{t{PCrJ$P`t?A0XOr8)80%_4-7UQGzIV@#i$`ZcR=MnK)nuzSf!ZGrfmE3NNn z?#*WTWM6zC<#%esiTAXJ4*8BFD)xL3`lf`2#3@0SijbaSUgAcKkV1)W|G-ryY>AB9Z9Cs;k zMS4j{>((4N!+g!7ap|?jrx@%=s&MI!S9;qV@Q+j3W-&#&FYBJT`zuf~p(wk|ibNf9 z&{?Klw|3T29w^+`r+cj(8HOyA()QJ3yjv85Jf)pK)UVDN|KRM|tyglU8`H-U!AuCqud(LjT-ba&vVkGw`cC{XPVrRN=?QW0(3 zRG;yf=3JS&u={vh!R|lA9WPuir#q>mIjgjJZiKGBNT-xLHYO4Mu#btR0Zg98XZP}N zctc0CjJ|bH(19*1W}Y4=?lNI~PTvA2s*^WD*Nl21z%oS_&ti(F#-@cTRUnOoTDBx> z(kN>2c&HSzaBj`I@+r=+b9cn98fjePnA&NaI)Q#4C& zO^TpaBGegRw^0dIKVa zr7*tlY+RURjga{sr0G5;(GY8e)PvOerQ%skET!4vNym#P^eT%A-%)zpRO%VcltEW+ zEfgc%IhqB2H@eZ_|Q z)fjufOUQ=$J;(g1m(6vk?@BRkQ)Yf1BF@(z8;8Aw8mrf|JS)UWsZ&J3pA;*!<>(8Y zZD_}U$zrtIW}@Iz>U7=k9d*iJu2^Nv)j}&MFi-cPh=c8Oi^C1w-j9)0)ZNenREznU zbFFkm*=eRc`w6o-%T*p8v?JimM|Nj19{ zM3g%qCd~Hn`YB%T3S@3n2EKf`fPc}yD8)GcIN=EbiC** z#Q4R~X^NQ)|H0B`#b>t8sT@tNUrJe)u|zG(lWNg%wzJ@`;JKOhhZqyyNh=FPo}>DD z)q@Xj*LTHTnwRsKa_f?&cV1GPscj6U^3A??&fMA?h*_6u4t9Blq#CE_&|@P9mrG(0 zeK9oGC}S)}35pCO`|{8Riy|Mlj!Ym0n@b;4s~xCR)%+^3iBZ=&I4Cme?OBcoMSstpDkC%`b96H*gAQ` zvwe*ojKX%C^`DhOnkwGRnloFf;)enT)AJPa_l&5-jn>EUA?=bgS{{l`scia+W7yG0 zFbRmRLv`5dC9T{q8bqj8<>|b(I5mzpx^L=vy2-5@>AWc_=IpLU_l_=o>V1r@7fnL_ zQ~Whz;+6!7SIb@NS)Y2Cxc6h{@3jObwmlOI^X@#{{e`{!b71m|QISn~Su!d@Gh&l< zi3z&}eFkmc2~LLX9AjfjrweNF*d&`?6@)1KgK;RR7u``_6(0g>c8-i~=Z@jS)G@j7?~&QYEW~xH~)kC zS?P{jj9CM$!WX&2+;;L=sO@|!cj105e_h&zvWWg+wl~_3qu& zOixelZeex0)Xy?);<*WrxETyOyJ(v-vpDW2oy~ZaD4>fIoDmx;z{~crIz1OU=Ixbn zHu=dJy4~#oD~T5h+Gr}6@-khLZWPHpz9W0(&eF!TvlowT#jC&)qRe2q6b!R}Fa?4c$;65gM4_=bEf&1y&edg7 z^4BXPK|O5=_ToJcFMmm=Y%Y~*`JXr+-s0ZN*qW_t(5XMYhqHR|+z9oKz@f0w1@B-RfrXuH t=N`TZYOo*v^xU`TYEq5sD1Y>be(z2Lt%aRxTR1Xo&E9S=j?f@I`9Jg8YHt7l literal 0 HcmV?d00001 diff --git a/server/typings/express/index.d.ts b/server/typings/express/index.d.ts index ee4faa35d..cf3e7ae34 100644 --- a/server/typings/express/index.d.ts +++ b/server/typings/express/index.d.ts @@ -3,7 +3,6 @@ import { MAbuseMessage, MAbuseReporter, MAccountBlocklist, - MActorFollowActors, MActorFollowActorsDefault, MActorUrl, MChannelBannerAccountDefault, diff --git a/shared/extra-utils/requests/requests.ts b/shared/extra-utils/requests/requests.ts index 3e773ee03..8b5cddf4a 100644 --- a/shared/extra-utils/requests/requests.ts +++ b/shared/extra-utils/requests/requests.ts @@ -152,11 +152,12 @@ function makeHTMLRequest (url: string, path: string) { .expect(HttpStatusCode.OK_200) } -function updateAvatarRequest (options: { +function updateImageRequest (options: { url: string path: string accessToken: string fixture: string + fieldname: string }) { let filePath = '' if (isAbsolute(options.fixture)) { @@ -170,7 +171,7 @@ function updateAvatarRequest (options: { path: options.path, token: options.accessToken, fields: {}, - attaches: { avatarfile: filePath }, + attaches: { [options.fieldname]: filePath }, statusCodeExpected: HttpStatusCode.OK_200 }) } @@ -191,5 +192,5 @@ export { makePutBodyRequest, makeDeleteRequest, makeRawRequest, - updateAvatarRequest + updateImageRequest } diff --git a/shared/extra-utils/users/users.ts b/shared/extra-utils/users/users.ts index db532dbb0..6040dd9c0 100644 --- a/shared/extra-utils/users/users.ts +++ b/shared/extra-utils/users/users.ts @@ -4,7 +4,7 @@ import { UserUpdateMe } from '../../models/users' import { UserAdminFlag } from '../../models/users/user-flag.model' import { UserRegister } from '../../models/users/user-register.model' import { UserRole } from '../../models/users/user-role' -import { makeGetRequest, makePostBodyRequest, makePutBodyRequest, updateAvatarRequest } from '../requests/requests' +import { makeGetRequest, makePostBodyRequest, makePutBodyRequest, updateImageRequest } from '../requests/requests' import { ServerInfo } from '../server/servers' import { userLogin } from './login' import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes' @@ -275,7 +275,7 @@ function updateMyAvatar (options: { }) { const path = '/api/v1/users/me/avatar/pick' - return updateAvatarRequest(Object.assign(options, { path })) + return updateImageRequest({ ...options, path, fieldname: 'avatarfile' }) } function updateUser (options: { diff --git a/shared/extra-utils/videos/video-channels.ts b/shared/extra-utils/videos/video-channels.ts index 3ff445c2a..d0dfb5856 100644 --- a/shared/extra-utils/videos/video-channels.ts +++ b/shared/extra-utils/videos/video-channels.ts @@ -3,7 +3,7 @@ import * as request from 'supertest' import { VideoChannelUpdate } from '../../models/videos/channel/video-channel-update.model' import { VideoChannelCreate } from '../../models/videos/channel/video-channel-create.model' -import { makeGetRequest, updateAvatarRequest } from '../requests/requests' +import { makeDeleteRequest, makeGetRequest, updateImageRequest } from '../requests/requests' import { ServerInfo } from '../server/servers' import { User } from '../../models/users/user.model' import { getMyUserInformation } from '../users/users' @@ -129,16 +129,32 @@ function getVideoChannel (url: string, channelName: string) { .expect('Content-Type', /json/) } -function updateVideoChannelAvatar (options: { +function updateVideoChannelImage (options: { url: string accessToken: string fixture: string videoChannelName: string | number + type: 'avatar' | 'banner' }) { + const path = `/api/v1/video-channels/${options.videoChannelName}/${options.type}/pick` - const path = '/api/v1/video-channels/' + options.videoChannelName + '/avatar/pick' + return updateImageRequest({ ...options, path, fieldname: options.type + 'file' }) +} - return updateAvatarRequest(Object.assign(options, { path })) +function deleteVideoChannelImage (options: { + url: string + accessToken: string + videoChannelName: string | number + type: 'avatar' | 'banner' +}) { + const path = `/api/v1/video-channels/${options.videoChannelName}/${options.type}` + + return makeDeleteRequest({ + url: options.url, + token: options.accessToken, + path, + statusCodeExpected: 204 + }) } function setDefaultVideoChannel (servers: ServerInfo[]) { @@ -157,12 +173,13 @@ function setDefaultVideoChannel (servers: ServerInfo[]) { // --------------------------------------------------------------------------- export { - updateVideoChannelAvatar, + updateVideoChannelImage, getVideoChannelsList, getAccountVideoChannelsList, addVideoChannel, updateVideoChannel, deleteVideoChannel, getVideoChannel, - setDefaultVideoChannel + setDefaultVideoChannel, + deleteVideoChannelImage }