summaryrefslogtreecommitdiff
path: root/packages/backend/src
diff options
context:
space:
mode:
authorMar0xy <marie@kaifa.ch>2023-10-30 00:27:04 +0100
committerMar0xy <marie@kaifa.ch>2023-10-30 00:27:04 +0100
commitb57ec5e2eb5e7ad30d9c989105cb2ac34de9d2ba (patch)
treef1fc3c3c5573d4c20a6f97c512a5353ebe1011e2 /packages/backend/src
parentfix: reply edits not staying attached (diff)
downloadsharkey-b57ec5e2eb5e7ad30d9c989105cb2ac34de9d2ba.tar.gz
sharkey-b57ec5e2eb5e7ad30d9c989105cb2ac34de9d2ba.tar.bz2
sharkey-b57ec5e2eb5e7ad30d9c989105cb2ac34de9d2ba.zip
test: avatar and header uploading
Diffstat (limited to 'packages/backend/src')
-rw-r--r--packages/backend/src/misc/prelude/array.ts4
-rw-r--r--packages/backend/src/server/api/mastodon/MastodonApiServerService.ts43
2 files changed, 43 insertions, 4 deletions
diff --git a/packages/backend/src/misc/prelude/array.ts b/packages/backend/src/misc/prelude/array.ts
index b2f29bcecf..8438b64805 100644
--- a/packages/backend/src/misc/prelude/array.ts
+++ b/packages/backend/src/misc/prelude/array.ts
@@ -142,3 +142,7 @@ export function toArray<T>(x: T | T[] | undefined): T[] {
export function toSingle<T>(x: T | T[] | undefined): T | undefined {
return Array.isArray(x) ? x[0] : x;
}
+
+export function toSingleLast<T>(x: T | T[] | undefined): T | undefined {
+ return Array.isArray(x) ? x.at(-1) : x;
+}
diff --git a/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts b/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts
index efc2302f3f..0bfa1a39fa 100644
--- a/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts
+++ b/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts
@@ -3,16 +3,18 @@ import megalodon, { Entity, MegalodonInterface } from 'megalodon';
import querystring from 'querystring';
import { IsNull } from 'typeorm';
import multer from 'fastify-multer';
-import type { NoteEditRepository, NotesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
+import type { AccessTokensRepository, NoteEditRepository, NotesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
import type { Config } from '@/config.js';
import { MetaService } from '@/core/MetaService.js';
-import { convertAnnouncement, convertFilter, convertAttachment, convertFeaturedTag, convertList, MastoConverters } from './converters.js';
+import { convertAnnouncement, convertFilter, convertAttachment, convertFeaturedTag, convertList, MastoConverters } from './converters.js';
import { getInstance } from './endpoints/meta.js';
import { ApiAuthMastodon, ApiAccountMastodon, ApiFilterMastodon, ApiNotifyMastodon, ApiSearchMastodon, ApiTimelineMastodon, ApiStatusMastodon } from './endpoints.js';
import type { FastifyInstance, FastifyPluginOptions } from 'fastify';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
+import { DriveService } from '@/core/DriveService.js';
+import { toSingleLast } from '@/misc/prelude/array.js';
export function getClient(BASE_URL: string, authorization: string | undefined): MegalodonInterface {
const accessTokenArr = authorization?.split(' ') ?? [null];
@@ -33,10 +35,13 @@ export class MastodonApiServerService {
private userProfilesRepository: UserProfilesRepository,
@Inject(DI.noteEditRepository)
private noteEditRepository: NoteEditRepository,
+ @Inject(DI.accessTokensRepository)
+ private accessTokensRepository: AccessTokensRepository,
@Inject(DI.config)
private config: Config,
private metaService: MetaService,
private userEntityService: UserEntityService,
+ private driveService: DriveService,
private mastoConverter: MastoConverters,
) { }
@@ -245,16 +250,46 @@ export class MastodonApiServerService {
}
});
- fastify.patch('/v1/accounts/update_credentials', { preHandler: upload.none() }, async (_request, reply) => {
+ fastify.patch('/v1/accounts/update_credentials', { preHandler: upload.any() }, async (_request, reply) => {
const BASE_URL = `${_request.protocol}://${_request.hostname}`;
const accessTokens = _request.headers.authorization;
const client = getClient(BASE_URL, accessTokens); // we are using this here, because in private mode some info isnt
// displayed without being logged in
try {
+ if (_request.files.length > 0) {
+ const tokeninfo = await this.accessTokensRepository.findOneBy({ token: accessTokens });
+ console.error(tokeninfo);
+ if (tokeninfo && (_request.files as any)['avatar']) {
+ const file = toSingleLast((_request.files as any)['avatar']);
+ const user = await this.usersRepository.findOneBy({ id: tokeninfo.userId });
+ const upload = await this.driveService.addFile({
+ user: { id: tokeninfo.userId, host: user ? user.host : null },
+ path: file.path,
+ name: file.originalname !== null && file.originalname !== 'file' ? file.originalname : undefined,
+ sensitive: false,
+ });
+ if (upload.type.startsWith('image/')) {
+ (_request.body as any).avatar = upload.id;
+ }
+ }
+ if (tokeninfo && (_request.files as any)['header']) {
+ const file = toSingleLast((_request.files as any)['header']);
+ const user = await this.usersRepository.findOneBy({ id: tokeninfo.userId });
+ const upload = await this.driveService.addFile({
+ user: { id: tokeninfo.userId, host: user ? user.host : null },
+ path: file.path,
+ name: file.originalname !== null && file.originalname !== 'file' ? file.originalname : undefined,
+ sensitive: false,
+ });
+ if (upload.type.startsWith('image/')) {
+ (_request.body as any).header = upload.id;
+ }
+ }
+ }
const data = await client.updateCredentials(_request.body!);
reply.send(await this.mastoConverter.convertAccount(data.data));
} catch (e: any) {
- /* console.error(e); */
+ //console.error(e);
reply.code(401).send(e.response.data);
}
});