1
0
mirror of https://github.com/immich-app/immich.git synced 2024-11-24 08:52:28 +02:00

refactor(server): plural endpoints (#9667)

This commit is contained in:
Jason Rasmussen 2024-05-22 13:24:57 -04:00 committed by GitHub
parent 6a4c2e97c0
commit 202745f14b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
36 changed files with 367 additions and 362 deletions

View File

@ -14,7 +14,7 @@ import { app, asBearerAuth, utils } from 'src/utils';
import request from 'supertest';
import { beforeAll, beforeEach, describe, expect, it } from 'vitest';
describe('/activity', () => {
describe('/activities', () => {
let admin: LoginResponseDto;
let nonOwner: LoginResponseDto;
let asset: AssetFileUploadResponseDto;
@ -45,22 +45,24 @@ describe('/activity', () => {
await utils.resetDatabase(['activity']);
});
describe('GET /activity', () => {
describe('GET /activities', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/activity');
const { status, body } = await request(app).get('/activities');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require an albumId', async () => {
const { status, body } = await request(app).get('/activity').set('Authorization', `Bearer ${admin.accessToken}`);
const { status, body } = await request(app)
.get('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(400);
expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['albumId must be a UUID'])));
});
it('should reject an invalid albumId', async () => {
const { status, body } = await request(app)
.get('/activity')
.get('/activities')
.query({ albumId: uuidDto.invalid })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(400);
@ -69,7 +71,7 @@ describe('/activity', () => {
it('should reject an invalid assetId', async () => {
const { status, body } = await request(app)
.get('/activity')
.get('/activities')
.query({ albumId: uuidDto.notFound, assetId: uuidDto.invalid })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(400);
@ -78,7 +80,7 @@ describe('/activity', () => {
it('should start off empty', async () => {
const { status, body } = await request(app)
.get('/activity')
.get('/activities')
.query({ albumId: album.id })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual([]);
@ -102,7 +104,7 @@ describe('/activity', () => {
]);
const { status, body } = await request(app)
.get('/activity')
.get('/activities')
.query({ albumId: album.id })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(200);
@ -121,7 +123,7 @@ describe('/activity', () => {
]);
const { status, body } = await request(app)
.get('/activity')
.get('/activities')
.query({ albumId: album.id, type: 'comment' })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(200);
@ -140,7 +142,7 @@ describe('/activity', () => {
]);
const { status, body } = await request(app)
.get('/activity')
.get('/activities')
.query({ albumId: album.id, type: 'like' })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(200);
@ -152,7 +154,7 @@ describe('/activity', () => {
const reaction = await createActivity({ albumId: album.id, type: ReactionType.Like });
const response1 = await request(app)
.get('/activity')
.get('/activities')
.query({ albumId: album.id, userId: uuidDto.notFound })
.set('Authorization', `Bearer ${admin.accessToken}`);
@ -160,7 +162,7 @@ describe('/activity', () => {
expect(response1.body.length).toBe(0);
const response2 = await request(app)
.get('/activity')
.get('/activities')
.query({ albumId: album.id, userId: admin.userId })
.set('Authorization', `Bearer ${admin.accessToken}`);
@ -180,7 +182,7 @@ describe('/activity', () => {
]);
const { status, body } = await request(app)
.get('/activity')
.get('/activities')
.query({ albumId: album.id, assetId: asset.id })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(200);
@ -189,16 +191,16 @@ describe('/activity', () => {
});
});
describe('POST /activity', () => {
describe('POST /activities', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/activity');
const { status, body } = await request(app).post('/activities');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require an albumId', async () => {
const { status, body } = await request(app)
.post('/activity')
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ albumId: uuidDto.invalid });
expect(status).toEqual(400);
@ -207,7 +209,7 @@ describe('/activity', () => {
it('should require a comment when type is comment', async () => {
const { status, body } = await request(app)
.post('/activity')
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ albumId: uuidDto.notFound, type: 'comment', comment: null });
expect(status).toEqual(400);
@ -216,7 +218,7 @@ describe('/activity', () => {
it('should add a comment to an album', async () => {
const { status, body } = await request(app)
.post('/activity')
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({
albumId: album.id,
@ -236,7 +238,7 @@ describe('/activity', () => {
it('should add a like to an album', async () => {
const { status, body } = await request(app)
.post('/activity')
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ albumId: album.id, type: 'like' });
expect(status).toEqual(201);
@ -253,7 +255,7 @@ describe('/activity', () => {
it('should return a 200 for a duplicate like on the album', async () => {
const reaction = await createActivity({ albumId: album.id, type: ReactionType.Like });
const { status, body } = await request(app)
.post('/activity')
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ albumId: album.id, type: 'like' });
expect(status).toEqual(200);
@ -267,7 +269,7 @@ describe('/activity', () => {
type: ReactionType.Like,
});
const { status, body } = await request(app)
.post('/activity')
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ albumId: album.id, type: 'like' });
expect(status).toEqual(201);
@ -276,7 +278,7 @@ describe('/activity', () => {
it('should add a comment to an asset', async () => {
const { status, body } = await request(app)
.post('/activity')
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({
albumId: album.id,
@ -297,7 +299,7 @@ describe('/activity', () => {
it('should add a like to an asset', async () => {
const { status, body } = await request(app)
.post('/activity')
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ albumId: album.id, assetId: asset.id, type: 'like' });
expect(status).toEqual(201);
@ -319,7 +321,7 @@ describe('/activity', () => {
});
const { status, body } = await request(app)
.post('/activity')
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ albumId: album.id, assetId: asset.id, type: 'like' });
expect(status).toEqual(200);
@ -327,16 +329,16 @@ describe('/activity', () => {
});
});
describe('DELETE /activity/:id', () => {
describe('DELETE /activities/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).delete(`/activity/${uuidDto.notFound}`);
const { status, body } = await request(app).delete(`/activities/${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require a valid uuid', async () => {
const { status, body } = await request(app)
.delete(`/activity/${uuidDto.invalid}`)
.delete(`/activities/${uuidDto.invalid}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
@ -349,7 +351,7 @@ describe('/activity', () => {
comment: 'This is a test comment',
});
const { status } = await request(app)
.delete(`/activity/${reaction.id}`)
.delete(`/activities/${reaction.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(204);
});
@ -360,7 +362,7 @@ describe('/activity', () => {
type: ReactionType.Like,
});
const { status } = await request(app)
.delete(`/activity/${reaction.id}`)
.delete(`/activities/${reaction.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(204);
});
@ -373,7 +375,7 @@ describe('/activity', () => {
});
const { status } = await request(app)
.delete(`/activity/${reaction.id}`)
.delete(`/activities/${reaction.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(204);
@ -387,7 +389,7 @@ describe('/activity', () => {
});
const { status, body } = await request(app)
.delete(`/activity/${reaction.id}`)
.delete(`/activities/${reaction.id}`)
.set('Authorization', `Bearer ${nonOwner.accessToken}`);
expect(status).toBe(400);
@ -405,7 +407,7 @@ describe('/activity', () => {
);
const { status } = await request(app)
.delete(`/activity/${reaction.id}`)
.delete(`/activities/${reaction.id}`)
.set('Authorization', `Bearer ${nonOwner.accessToken}`);
expect(status).toBe(204);

View File

@ -23,7 +23,7 @@ const user2SharedUser = 'user2SharedUser';
const user2SharedLink = 'user2SharedLink';
const user2NotShared = 'user2NotShared';
describe('/album', () => {
describe('/albums', () => {
let admin: LoginResponseDto;
let user1: LoginResponseDto;
let user1Asset1: AssetFileUploadResponseDto;
@ -110,16 +110,16 @@ describe('/album', () => {
await deleteUser({ id: user3.userId, deleteUserDto: {} }, { headers: asBearerAuth(admin.accessToken) });
});
describe('GET /album', () => {
describe('GET /albums', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/album');
const { status, body } = await request(app).get('/albums');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should reject an invalid shared param', async () => {
const { status, body } = await request(app)
.get('/album?shared=invalid')
.get('/albums?shared=invalid')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toEqual(400);
expect(body).toEqual(errorDto.badRequest(['shared must be a boolean value']));
@ -127,7 +127,7 @@ describe('/album', () => {
it('should reject an invalid assetId param', async () => {
const { status, body } = await request(app)
.get('/album?assetId=invalid')
.get('/albums?assetId=invalid')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toEqual(400);
expect(body).toEqual(errorDto.badRequest(['assetId must be a UUID']));
@ -135,7 +135,7 @@ describe('/album', () => {
it("should not show other users' favorites", async () => {
const { status, body } = await request(app)
.get(`/album/${user1Albums[0].id}?withoutAssets=false`)
.get(`/albums/${user1Albums[0].id}?withoutAssets=false`)
.set('Authorization', `Bearer ${user2.accessToken}`);
expect(status).toEqual(200);
expect(body).toEqual({
@ -146,7 +146,7 @@ describe('/album', () => {
it('should not return shared albums with a deleted owner', async () => {
const { status, body } = await request(app)
.get('/album?shared=true')
.get('/albums?shared=true')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
@ -178,7 +178,7 @@ describe('/album', () => {
});
it('should return the album collection including owned and shared', async () => {
const { status, body } = await request(app).get('/album').set('Authorization', `Bearer ${user1.accessToken}`);
const { status, body } = await request(app).get('/albums').set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
expect(body).toHaveLength(4);
expect(body).toEqual(
@ -209,7 +209,7 @@ describe('/album', () => {
it('should return the album collection filtered by shared', async () => {
const { status, body } = await request(app)
.get('/album?shared=true')
.get('/albums?shared=true')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
expect(body).toHaveLength(4);
@ -241,7 +241,7 @@ describe('/album', () => {
it('should return the album collection filtered by NOT shared', async () => {
const { status, body } = await request(app)
.get('/album?shared=false')
.get('/albums?shared=false')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
expect(body).toHaveLength(1);
@ -258,7 +258,7 @@ describe('/album', () => {
it('should return the album collection filtered by assetId', async () => {
const { status, body } = await request(app)
.get(`/album?assetId=${user1Asset2.id}`)
.get(`/albums?assetId=${user1Asset2.id}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
expect(body).toHaveLength(1);
@ -266,7 +266,7 @@ describe('/album', () => {
it('should return the album collection filtered by assetId and ignores shared=true', async () => {
const { status, body } = await request(app)
.get(`/album?shared=true&assetId=${user1Asset1.id}`)
.get(`/albums?shared=true&assetId=${user1Asset1.id}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
expect(body).toHaveLength(5);
@ -274,23 +274,23 @@ describe('/album', () => {
it('should return the album collection filtered by assetId and ignores shared=false', async () => {
const { status, body } = await request(app)
.get(`/album?shared=false&assetId=${user1Asset1.id}`)
.get(`/albums?shared=false&assetId=${user1Asset1.id}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
expect(body).toHaveLength(5);
});
});
describe('GET /album/:id', () => {
describe('GET /albums/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/album/${user1Albums[0].id}`);
const { status, body } = await request(app).get(`/albums/${user1Albums[0].id}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should return album info for own album', async () => {
const { status, body } = await request(app)
.get(`/album/${user1Albums[0].id}?withoutAssets=false`)
.get(`/albums/${user1Albums[0].id}?withoutAssets=false`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
@ -302,7 +302,7 @@ describe('/album', () => {
it('should return album info for shared album (editor)', async () => {
const { status, body } = await request(app)
.get(`/album/${user2Albums[0].id}?withoutAssets=false`)
.get(`/albums/${user2Albums[0].id}?withoutAssets=false`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
@ -311,7 +311,7 @@ describe('/album', () => {
it('should return album info for shared album (viewer)', async () => {
const { status, body } = await request(app)
.get(`/album/${user1Albums[3].id}?withoutAssets=false`)
.get(`/albums/${user1Albums[3].id}?withoutAssets=false`)
.set('Authorization', `Bearer ${user2.accessToken}`);
expect(status).toBe(200);
@ -320,7 +320,7 @@ describe('/album', () => {
it('should return album info with assets when withoutAssets is undefined', async () => {
const { status, body } = await request(app)
.get(`/album/${user1Albums[0].id}`)
.get(`/albums/${user1Albums[0].id}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
@ -332,7 +332,7 @@ describe('/album', () => {
it('should return album info without assets when withoutAssets is true', async () => {
const { status, body } = await request(app)
.get(`/album/${user1Albums[0].id}?withoutAssets=true`)
.get(`/albums/${user1Albums[0].id}?withoutAssets=true`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
@ -344,16 +344,16 @@ describe('/album', () => {
});
});
describe('GET /album/count', () => {
describe('GET /albums/count', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/album/count');
const { status, body } = await request(app).get('/albums/count');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should return total count of albums the user has access to', async () => {
const { status, body } = await request(app)
.get('/album/count')
.get('/albums/count')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
@ -361,16 +361,16 @@ describe('/album', () => {
});
});
describe('POST /album', () => {
describe('POST /albums', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/album').send({ albumName: 'New album' });
const { status, body } = await request(app).post('/albums').send({ albumName: 'New album' });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should create an album', async () => {
const { status, body } = await request(app)
.post('/album')
.post('/albums')
.send({ albumName: 'New album' })
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(201);
@ -395,9 +395,9 @@ describe('/album', () => {
});
});
describe('PUT /album/:id/assets', () => {
describe('PUT /albums/:id/assets', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/album/${user1Albums[0].id}/assets`);
const { status, body } = await request(app).put(`/albums/${user1Albums[0].id}/assets`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
@ -405,7 +405,7 @@ describe('/album', () => {
it('should be able to add own asset to own album', async () => {
const asset = await utils.createAsset(user1.accessToken);
const { status, body } = await request(app)
.put(`/album/${user1Albums[0].id}/assets`)
.put(`/albums/${user1Albums[0].id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ ids: [asset.id] });
@ -416,7 +416,7 @@ describe('/album', () => {
it('should be able to add own asset to shared album', async () => {
const asset = await utils.createAsset(user1.accessToken);
const { status, body } = await request(app)
.put(`/album/${user2Albums[0].id}/assets`)
.put(`/albums/${user2Albums[0].id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ ids: [asset.id] });
@ -427,7 +427,7 @@ describe('/album', () => {
it('should not be able to add assets to album as a viewer', async () => {
const asset = await utils.createAsset(user2.accessToken);
const { status, body } = await request(app)
.put(`/album/${user1Albums[3].id}/assets`)
.put(`/albums/${user1Albums[3].id}/assets`)
.set('Authorization', `Bearer ${user2.accessToken}`)
.send({ ids: [asset.id] });
@ -438,7 +438,7 @@ describe('/album', () => {
it('should add duplicate assets only once', async () => {
const asset = await utils.createAsset(user1.accessToken);
const { status, body } = await request(app)
.put(`/album/${user1Albums[0].id}/assets`)
.put(`/albums/${user1Albums[0].id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ ids: [asset.id, asset.id] });
@ -450,10 +450,10 @@ describe('/album', () => {
});
});
describe('PATCH /album/:id', () => {
describe('PATCH /albums/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.patch(`/album/${uuidDto.notFound}`)
.patch(`/albums/${uuidDto.notFound}`)
.send({ albumName: 'New album name' });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -464,7 +464,7 @@ describe('/album', () => {
albumName: 'New album',
});
const { status, body } = await request(app)
.patch(`/album/${album.id}`)
.patch(`/albums/${album.id}`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({
albumName: 'New album name',
@ -481,7 +481,7 @@ describe('/album', () => {
it('should not be able to update as a viewer', async () => {
const { status, body } = await request(app)
.patch(`/album/${user1Albums[3].id}`)
.patch(`/albums/${user1Albums[3].id}`)
.set('Authorization', `Bearer ${user2.accessToken}`)
.send({ albumName: 'New album name' });
@ -491,7 +491,7 @@ describe('/album', () => {
it('should not be able to update as an editor', async () => {
const { status, body } = await request(app)
.patch(`/album/${user1Albums[0].id}`)
.patch(`/albums/${user1Albums[0].id}`)
.set('Authorization', `Bearer ${user2.accessToken}`)
.send({ albumName: 'New album name' });
@ -500,10 +500,10 @@ describe('/album', () => {
});
});
describe('DELETE /album/:id/assets', () => {
describe('DELETE /albums/:id/assets', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.delete(`/album/${user1Albums[0].id}/assets`)
.delete(`/albums/${user1Albums[0].id}/assets`)
.send({ ids: [user1Asset1.id] });
expect(status).toBe(401);
@ -512,7 +512,7 @@ describe('/album', () => {
it('should not be able to remove foreign asset from own album', async () => {
const { status, body } = await request(app)
.delete(`/album/${user2Albums[0].id}/assets`)
.delete(`/albums/${user2Albums[0].id}/assets`)
.set('Authorization', `Bearer ${user2.accessToken}`)
.send({ ids: [user1Asset1.id] });
@ -528,7 +528,7 @@ describe('/album', () => {
it('should not be able to remove foreign asset from foreign album', async () => {
const { status, body } = await request(app)
.delete(`/album/${user1Albums[0].id}/assets`)
.delete(`/albums/${user1Albums[0].id}/assets`)
.set('Authorization', `Bearer ${user2.accessToken}`)
.send({ ids: [user1Asset1.id] });
@ -544,7 +544,7 @@ describe('/album', () => {
it('should be able to remove own asset from own album', async () => {
const { status, body } = await request(app)
.delete(`/album/${user1Albums[0].id}/assets`)
.delete(`/albums/${user1Albums[0].id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ ids: [user1Asset1.id] });
@ -554,7 +554,7 @@ describe('/album', () => {
it('should be able to remove own asset from shared album', async () => {
const { status, body } = await request(app)
.delete(`/album/${user2Albums[0].id}/assets`)
.delete(`/albums/${user2Albums[0].id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ ids: [user1Asset1.id] });
@ -564,7 +564,7 @@ describe('/album', () => {
it('should not be able to remove assets from album as a viewer', async () => {
const { status, body } = await request(app)
.delete(`/album/${user1Albums[3].id}/assets`)
.delete(`/albums/${user1Albums[3].id}/assets`)
.set('Authorization', `Bearer ${user2.accessToken}`)
.send({ ids: [user1Asset1.id] });
@ -574,7 +574,7 @@ describe('/album', () => {
it('should remove duplicate assets only once', async () => {
const { status, body } = await request(app)
.delete(`/album/${user1Albums[1].id}/assets`)
.delete(`/albums/${user1Albums[1].id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ ids: [user1Asset1.id, user1Asset1.id] });
@ -596,7 +596,7 @@ describe('/album', () => {
});
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/album/${user1Albums[0].id}/users`).send({ sharedUserIds: [] });
const { status, body } = await request(app).put(`/albums/${user1Albums[0].id}/users`).send({ sharedUserIds: [] });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -604,7 +604,7 @@ describe('/album', () => {
it('should be able to add user to own album', async () => {
const { status, body } = await request(app)
.put(`/album/${album.id}/users`)
.put(`/albums/${album.id}/users`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ albumUsers: [{ userId: user2.userId, role: AlbumUserRole.Editor }] });
@ -618,7 +618,7 @@ describe('/album', () => {
it('should not be able to share album with owner', async () => {
const { status, body } = await request(app)
.put(`/album/${album.id}/users`)
.put(`/albums/${album.id}/users`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ albumUsers: [{ userId: user1.userId, role: AlbumUserRole.Editor }] });
@ -628,12 +628,12 @@ describe('/album', () => {
it('should not be able to add existing user to shared album', async () => {
await request(app)
.put(`/album/${album.id}/users`)
.put(`/albums/${album.id}/users`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ albumUsers: [{ userId: user2.userId, role: AlbumUserRole.Editor }] });
const { status, body } = await request(app)
.put(`/album/${album.id}/users`)
.put(`/albums/${album.id}/users`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ albumUsers: [{ userId: user2.userId, role: AlbumUserRole.Editor }] });
@ -652,14 +652,16 @@ describe('/album', () => {
expect(album.albumUsers[0].role).toEqual(AlbumUserRole.Viewer);
const { status } = await request(app)
.put(`/album/${album.id}/user/${user2.userId}`)
.put(`/albums/${album.id}/user/${user2.userId}`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ role: AlbumUserRole.Editor });
expect(status).toBe(200);
// Get album to verify the role change
const { body } = await request(app).get(`/album/${album.id}`).set('Authorization', `Bearer ${user1.accessToken}`);
const { body } = await request(app)
.get(`/albums/${album.id}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(body).toEqual(
expect.objectContaining({
albumUsers: [expect.objectContaining({ role: AlbumUserRole.Editor })],
@ -676,7 +678,7 @@ describe('/album', () => {
expect(album.albumUsers[0].role).toEqual(AlbumUserRole.Viewer);
const { status, body } = await request(app)
.put(`/album/${album.id}/user/${user2.userId}`)
.put(`/albums/${album.id}/user/${user2.userId}`)
.set('Authorization', `Bearer ${user2.accessToken}`)
.send({ role: AlbumUserRole.Editor });

View File

@ -5,6 +5,7 @@ import {
LoginResponseDto,
SharedLinkType,
getAssetInfo,
getMyUserInfo,
updateAssets,
} from '@immich/sdk';
import { exiftool } from 'exiftool-vendored';
@ -830,7 +831,7 @@ describe('/asset', () => {
expect(body).toEqual({ id: expect.any(String), duplicate: false });
expect(status).toBe(201);
const { body: user } = await request(app).get('/user/me').set('Authorization', `Bearer ${quotaUser.accessToken}`);
const user = await getMyUserInfo({ headers: asBearerAuth(quotaUser.accessToken) });
expect(user).toEqual(expect.objectContaining({ quotaUsageInBytes: 70 }));
});

View File

@ -2,7 +2,7 @@ import { deleteAssets, getAuditFiles, updateAsset, type LoginResponseDto } from
import { asBearerAuth, utils } from 'src/utils';
import { beforeAll, describe, expect, it } from 'vitest';
describe('/audit', () => {
describe('/audits', () => {
let admin: LoginResponseDto;
beforeAll(async () => {

View File

@ -11,7 +11,7 @@ import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest';
const scan = async (accessToken: string, id: string, dto: ScanLibraryDto = {}) =>
scanLibrary({ id, scanLibraryDto: dto }, { headers: asBearerAuth(accessToken) });
describe('/library', () => {
describe('/libraries', () => {
let admin: LoginResponseDto;
let user: LoginResponseDto;
let library: LibraryResponseDto;
@ -37,24 +37,24 @@ describe('/library', () => {
utils.resetEvents();
});
describe('GET /library', () => {
describe('GET /libraries', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/library');
const { status, body } = await request(app).get('/libraries');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
});
describe('POST /library', () => {
describe('POST /libraries', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/library').send({});
const { status, body } = await request(app).post('/libraries').send({});
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require admin authentication', async () => {
const { status, body } = await request(app)
.post('/library')
.post('/libraries')
.set('Authorization', `Bearer ${user.accessToken}`)
.send({ ownerId: admin.userId });
@ -64,7 +64,7 @@ describe('/library', () => {
it('should create an external library with defaults', async () => {
const { status, body } = await request(app)
.post('/library')
.post('/libraries')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ownerId: admin.userId });
@ -83,7 +83,7 @@ describe('/library', () => {
it('should create an external library with options', async () => {
const { status, body } = await request(app)
.post('/library')
.post('/libraries')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({
ownerId: admin.userId,
@ -103,7 +103,7 @@ describe('/library', () => {
it('should not create an external library with duplicate import paths', async () => {
const { status, body } = await request(app)
.post('/library')
.post('/libraries')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({
ownerId: admin.userId,
@ -118,7 +118,7 @@ describe('/library', () => {
it('should not create an external library with duplicate exclusion patterns', async () => {
const { status, body } = await request(app)
.post('/library')
.post('/libraries')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({
ownerId: admin.userId,
@ -132,16 +132,16 @@ describe('/library', () => {
});
});
describe('PUT /library/:id', () => {
describe('PUT /libraries/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/library/${uuidDto.notFound}`).send({});
const { status, body } = await request(app).put(`/libraries/${uuidDto.notFound}`).send({});
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should change the library name', async () => {
const { status, body } = await request(app)
.put(`/library/${library.id}`)
.put(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ name: 'New Library Name' });
@ -155,7 +155,7 @@ describe('/library', () => {
it('should not set an empty name', async () => {
const { status, body } = await request(app)
.put(`/library/${library.id}`)
.put(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ name: '' });
@ -165,7 +165,7 @@ describe('/library', () => {
it('should change the import paths', async () => {
const { status, body } = await request(app)
.put(`/library/${library.id}`)
.put(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ importPaths: [testAssetDirInternal] });
@ -179,7 +179,7 @@ describe('/library', () => {
it('should reject an empty import path', async () => {
const { status, body } = await request(app)
.put(`/library/${library.id}`)
.put(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ importPaths: [''] });
@ -189,7 +189,7 @@ describe('/library', () => {
it('should reject duplicate import paths', async () => {
const { status, body } = await request(app)
.put(`/library/${library.id}`)
.put(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ importPaths: ['/path', '/path'] });
@ -199,7 +199,7 @@ describe('/library', () => {
it('should change the exclusion pattern', async () => {
const { status, body } = await request(app)
.put(`/library/${library.id}`)
.put(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ exclusionPatterns: ['**/Raw/**'] });
@ -213,7 +213,7 @@ describe('/library', () => {
it('should reject duplicate exclusion patterns', async () => {
const { status, body } = await request(app)
.put(`/library/${library.id}`)
.put(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ exclusionPatterns: ['**/*.jpg', '**/*.jpg'] });
@ -223,7 +223,7 @@ describe('/library', () => {
it('should reject an empty exclusion pattern', async () => {
const { status, body } = await request(app)
.put(`/library/${library.id}`)
.put(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ exclusionPatterns: [''] });
@ -232,9 +232,9 @@ describe('/library', () => {
});
});
describe('GET /library/:id', () => {
describe('GET /libraries/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/library/${uuidDto.notFound}`);
const { status, body } = await request(app).get(`/libraries/${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -242,7 +242,7 @@ describe('/library', () => {
it('should require admin access', async () => {
const { status, body } = await request(app)
.get(`/library/${uuidDto.notFound}`)
.get(`/libraries/${uuidDto.notFound}`)
.set('Authorization', `Bearer ${user.accessToken}`);
expect(status).toBe(403);
expect(body).toEqual(errorDto.forbidden);
@ -252,7 +252,7 @@ describe('/library', () => {
const library = await utils.createLibrary(admin.accessToken, { ownerId: admin.userId });
const { status, body } = await request(app)
.get(`/library/${library.id}`)
.get(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
@ -269,18 +269,18 @@ describe('/library', () => {
});
});
describe('GET /library/:id/statistics', () => {
describe('GET /libraries/:id/statistics', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/library/${uuidDto.notFound}/statistics`);
const { status, body } = await request(app).get(`/libraries/${uuidDto.notFound}/statistics`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
});
describe('POST /library/:id/scan', () => {
describe('POST /libraries/:id/scan', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post(`/library/${uuidDto.notFound}/scan`).send({});
const { status, body } = await request(app).post(`/libraries/${uuidDto.notFound}/scan`).send({});
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -496,9 +496,9 @@ describe('/library', () => {
});
});
describe('POST /library/:id/removeOffline', () => {
describe('POST /libraries/:id/removeOffline', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post(`/library/${uuidDto.notFound}/removeOffline`).send({});
const { status, body } = await request(app).post(`/libraries/${uuidDto.notFound}/removeOffline`).send({});
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -532,7 +532,7 @@ describe('/library', () => {
expect(offlineAssets.count).toBe(1);
const { status } = await request(app)
.post(`/library/${library.id}/removeOffline`)
.post(`/libraries/${library.id}/removeOffline`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send();
expect(status).toBe(204);
@ -557,7 +557,7 @@ describe('/library', () => {
expect(assetsBefore.count).toBeGreaterThan(1);
const { status } = await request(app)
.post(`/library/${library.id}/removeOffline`)
.post(`/libraries/${library.id}/removeOffline`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send();
expect(status).toBe(204);
@ -569,9 +569,9 @@ describe('/library', () => {
});
});
describe('POST /library/:id/validate', () => {
describe('POST /libraries/:id/validate', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post(`/library/${uuidDto.notFound}/validate`).send({});
const { status, body } = await request(app).post(`/libraries/${uuidDto.notFound}/validate`).send({});
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -617,9 +617,9 @@ describe('/library', () => {
});
});
describe('DELETE /library/:id', () => {
describe('DELETE /libraries/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).delete(`/library/${uuidDto.notFound}`);
const { status, body } = await request(app).delete(`/libraries/${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -629,7 +629,7 @@ describe('/library', () => {
const library = await utils.createLibrary(admin.accessToken, { ownerId: admin.userId });
const { status, body } = await request(app)
.delete(`/library/${library.id}`)
.delete(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(204);
@ -655,7 +655,7 @@ describe('/library', () => {
await utils.waitForWebsocketEvent({ event: 'assetUpload', total: 2 });
const { status, body } = await request(app)
.delete(`/library/${library.id}`)
.delete(`/libraries/${library.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(204);

View File

@ -5,7 +5,7 @@ import { app, asBearerAuth, utils } from 'src/utils';
import request from 'supertest';
import { beforeAll, describe, expect, it } from 'vitest';
describe('/partner', () => {
describe('/partners', () => {
let admin: LoginResponseDto;
let user1: LoginResponseDto;
let user2: LoginResponseDto;
@ -28,9 +28,9 @@ describe('/partner', () => {
]);
});
describe('GET /partner', () => {
describe('GET /partners', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/partner');
const { status, body } = await request(app).get('/partners');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -38,7 +38,7 @@ describe('/partner', () => {
it('should get all partners shared by user', async () => {
const { status, body } = await request(app)
.get('/partner')
.get('/partners')
.set('Authorization', `Bearer ${user1.accessToken}`)
.query({ direction: 'shared-by' });
@ -48,7 +48,7 @@ describe('/partner', () => {
it('should get all partners that share with user', async () => {
const { status, body } = await request(app)
.get('/partner')
.get('/partners')
.set('Authorization', `Bearer ${user1.accessToken}`)
.query({ direction: 'shared-with' });
@ -57,9 +57,9 @@ describe('/partner', () => {
});
});
describe('POST /partner/:id', () => {
describe('POST /partners/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post(`/partner/${user3.userId}`);
const { status, body } = await request(app).post(`/partners/${user3.userId}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -67,7 +67,7 @@ describe('/partner', () => {
it('should share with new partner', async () => {
const { status, body } = await request(app)
.post(`/partner/${user3.userId}`)
.post(`/partners/${user3.userId}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(201);
@ -76,7 +76,7 @@ describe('/partner', () => {
it('should not share with new partner if already sharing with this partner', async () => {
const { status, body } = await request(app)
.post(`/partner/${user2.userId}`)
.post(`/partners/${user2.userId}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(400);
@ -84,9 +84,9 @@ describe('/partner', () => {
});
});
describe('PUT /partner/:id', () => {
describe('PUT /partners/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/partner/${user2.userId}`);
const { status, body } = await request(app).put(`/partners/${user2.userId}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -94,7 +94,7 @@ describe('/partner', () => {
it('should update partner', async () => {
const { status, body } = await request(app)
.put(`/partner/${user2.userId}`)
.put(`/partners/${user2.userId}`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ inTimeline: false });
@ -103,9 +103,9 @@ describe('/partner', () => {
});
});
describe('DELETE /partner/:id', () => {
describe('DELETE /partners/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).delete(`/partner/${user3.userId}`);
const { status, body } = await request(app).delete(`/partners/${user3.userId}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -113,7 +113,7 @@ describe('/partner', () => {
it('should delete partner', async () => {
const { status } = await request(app)
.delete(`/partner/${user3.userId}`)
.delete(`/partners/${user3.userId}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
@ -121,7 +121,7 @@ describe('/partner', () => {
it('should throw a bad request if partner not found', async () => {
const { status, body } = await request(app)
.delete(`/partner/${user3.userId}`)
.delete(`/partners/${user3.userId}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(400);

View File

@ -12,7 +12,7 @@ const invalidBirthday = [
{ birthDate: new Date(9999, 0, 0).toISOString(), response: ['Birth date cannot be in the future'] },
];
describe('/person', () => {
describe('/people', () => {
let admin: LoginResponseDto;
let visiblePerson: PersonResponseDto;
let hiddenPerson: PersonResponseDto;
@ -47,11 +47,11 @@ describe('/person', () => {
]);
});
describe('GET /person', () => {
describe('GET /people', () => {
beforeEach(async () => {});
it('should require authentication', async () => {
const { status, body } = await request(app).get('/person');
const { status, body } = await request(app).get('/people');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -59,7 +59,7 @@ describe('/person', () => {
it('should return all people (including hidden)', async () => {
const { status, body } = await request(app)
.get('/person')
.get('/people')
.set('Authorization', `Bearer ${admin.accessToken}`)
.query({ withHidden: true });
@ -76,7 +76,7 @@ describe('/person', () => {
});
it('should return only visible people', async () => {
const { status, body } = await request(app).get('/person').set('Authorization', `Bearer ${admin.accessToken}`);
const { status, body } = await request(app).get('/people').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual({
@ -90,9 +90,9 @@ describe('/person', () => {
});
});
describe('GET /person/:id', () => {
describe('GET /people/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/person/${uuidDto.notFound}`);
const { status, body } = await request(app).get(`/people/${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -100,7 +100,7 @@ describe('/person', () => {
it('should throw error if person with id does not exist', async () => {
const { status, body } = await request(app)
.get(`/person/${uuidDto.notFound}`)
.get(`/people/${uuidDto.notFound}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
@ -109,7 +109,7 @@ describe('/person', () => {
it('should return person information', async () => {
const { status, body } = await request(app)
.get(`/person/${visiblePerson.id}`)
.get(`/people/${visiblePerson.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
@ -117,9 +117,9 @@ describe('/person', () => {
});
});
describe('GET /person/:id/statistics', () => {
describe('GET /people/:id/statistics', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/person/${multipleAssetsPerson.id}/statistics`);
const { status, body } = await request(app).get(`/people/${multipleAssetsPerson.id}/statistics`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -127,7 +127,7 @@ describe('/person', () => {
it('should throw error if person with id does not exist', async () => {
const { status, body } = await request(app)
.get(`/person/${uuidDto.notFound}/statistics`)
.get(`/people/${uuidDto.notFound}/statistics`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
@ -136,7 +136,7 @@ describe('/person', () => {
it('should return the correct number of assets', async () => {
const { status, body } = await request(app)
.get(`/person/${multipleAssetsPerson.id}/statistics`)
.get(`/people/${multipleAssetsPerson.id}/statistics`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
@ -144,9 +144,9 @@ describe('/person', () => {
});
});
describe('POST /person', () => {
describe('POST /people', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post(`/person`);
const { status, body } = await request(app).post(`/people`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
@ -154,7 +154,7 @@ describe('/person', () => {
for (const { birthDate, response } of invalidBirthday) {
it(`should not accept an invalid birth date [${birthDate}]`, async () => {
const { status, body } = await request(app)
.post(`/person`)
.post(`/people`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ birthDate });
expect(status).toBe(400);
@ -164,7 +164,7 @@ describe('/person', () => {
it('should create a person', async () => {
const { status, body } = await request(app)
.post(`/person`)
.post(`/people`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({
name: 'New Person',
@ -179,9 +179,9 @@ describe('/person', () => {
});
});
describe('PUT /person/:id', () => {
describe('PUT /people/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/person/${uuidDto.notFound}`);
const { status, body } = await request(app).put(`/people/${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
@ -193,7 +193,7 @@ describe('/person', () => {
]) {
it(`should not allow null ${key}`, async () => {
const { status, body } = await request(app)
.put(`/person/${visiblePerson.id}`)
.put(`/people/${visiblePerson.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ [key]: null });
expect(status).toBe(400);
@ -204,7 +204,7 @@ describe('/person', () => {
for (const { birthDate, response } of invalidBirthday) {
it(`should not accept an invalid birth date [${birthDate}]`, async () => {
const { status, body } = await request(app)
.put(`/person/${visiblePerson.id}`)
.put(`/people/${visiblePerson.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ birthDate });
expect(status).toBe(400);
@ -214,7 +214,7 @@ describe('/person', () => {
it('should update a date of birth', async () => {
const { status, body } = await request(app)
.put(`/person/${visiblePerson.id}`)
.put(`/people/${visiblePerson.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ birthDate: '1990-01-01T05:00:00.000Z' });
expect(status).toBe(200);
@ -223,7 +223,7 @@ describe('/person', () => {
it('should clear a date of birth', async () => {
const { status, body } = await request(app)
.put(`/person/${visiblePerson.id}`)
.put(`/people/${visiblePerson.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ birthDate: null });
expect(status).toBe(200);

View File

@ -13,7 +13,7 @@ import { app, asBearerAuth, shareUrl, utils } from 'src/utils';
import request from 'supertest';
import { beforeAll, describe, expect, it } from 'vitest';
describe('/shared-link', () => {
describe('/shared-links', () => {
let admin: LoginResponseDto;
let asset1: AssetFileUploadResponseDto;
let asset2: AssetFileUploadResponseDto;
@ -114,9 +114,9 @@ describe('/shared-link', () => {
});
});
describe('GET /shared-link', () => {
describe('GET /shared-links', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/shared-link');
const { status, body } = await request(app).get('/shared-links');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -124,7 +124,7 @@ describe('/shared-link', () => {
it('should get all shared links created by user', async () => {
const { status, body } = await request(app)
.get('/shared-link')
.get('/shared-links')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
@ -142,7 +142,7 @@ describe('/shared-link', () => {
it('should not get shared links created by other users', async () => {
const { status, body } = await request(app)
.get('/shared-link')
.get('/shared-links')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
@ -150,15 +150,15 @@ describe('/shared-link', () => {
});
});
describe('GET /shared-link/me', () => {
describe('GET /shared-links/me', () => {
it('should not require admin authentication', async () => {
const { status } = await request(app).get('/shared-link/me').set('Authorization', `Bearer ${admin.accessToken}`);
const { status } = await request(app).get('/shared-links/me').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(403);
});
it('should get data for correct shared link', async () => {
const { status, body } = await request(app).get('/shared-link/me').query({ key: linkWithAlbum.key });
const { status, body } = await request(app).get('/shared-links/me').query({ key: linkWithAlbum.key });
expect(status).toBe(200);
expect(body).toEqual(
@ -172,7 +172,7 @@ describe('/shared-link', () => {
it('should return unauthorized for incorrect shared link', async () => {
const { status, body } = await request(app)
.get('/shared-link/me')
.get('/shared-links/me')
.query({ key: linkWithAlbum.key + 'foo' });
expect(status).toBe(401);
@ -180,14 +180,14 @@ describe('/shared-link', () => {
});
it('should return unauthorized if target has been soft deleted', async () => {
const { status, body } = await request(app).get('/shared-link/me').query({ key: linkWithDeletedAlbum.key });
const { status, body } = await request(app).get('/shared-links/me').query({ key: linkWithDeletedAlbum.key });
expect(status).toBe(401);
expect(body).toEqual(errorDto.invalidShareKey);
});
it('should return unauthorized for password protected link', async () => {
const { status, body } = await request(app).get('/shared-link/me').query({ key: linkWithPassword.key });
const { status, body } = await request(app).get('/shared-links/me').query({ key: linkWithPassword.key });
expect(status).toBe(401);
expect(body).toEqual(errorDto.invalidSharePassword);
@ -195,7 +195,7 @@ describe('/shared-link', () => {
it('should get data for correct password protected link', async () => {
const { status, body } = await request(app)
.get('/shared-link/me')
.get('/shared-links/me')
.query({ key: linkWithPassword.key, password: 'foo' });
expect(status).toBe(200);
@ -209,7 +209,7 @@ describe('/shared-link', () => {
});
it('should return metadata for album shared link', async () => {
const { status, body } = await request(app).get('/shared-link/me').query({ key: linkWithMetadata.key });
const { status, body } = await request(app).get('/shared-links/me').query({ key: linkWithMetadata.key });
expect(status).toBe(200);
expect(body.assets).toHaveLength(1);
@ -225,7 +225,7 @@ describe('/shared-link', () => {
});
it('should not return metadata for album shared link without metadata', async () => {
const { status, body } = await request(app).get('/shared-link/me').query({ key: linkWithoutMetadata.key });
const { status, body } = await request(app).get('/shared-links/me').query({ key: linkWithoutMetadata.key });
expect(status).toBe(200);
expect(body.assets).toHaveLength(1);
@ -239,9 +239,9 @@ describe('/shared-link', () => {
});
});
describe('GET /shared-link/:id', () => {
describe('GET /shared-links/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/shared-link/${linkWithAlbum.id}`);
const { status, body } = await request(app).get(`/shared-links/${linkWithAlbum.id}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -249,7 +249,7 @@ describe('/shared-link', () => {
it('should get shared link by id', async () => {
const { status, body } = await request(app)
.get(`/shared-link/${linkWithAlbum.id}`)
.get(`/shared-links/${linkWithAlbum.id}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
@ -264,7 +264,7 @@ describe('/shared-link', () => {
it('should not get shared link by id if user has not created the link or it does not exist', async () => {
const { status, body } = await request(app)
.get(`/shared-link/${linkWithAlbum.id}`)
.get(`/shared-links/${linkWithAlbum.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
@ -272,10 +272,10 @@ describe('/shared-link', () => {
});
});
describe('POST /shared-link', () => {
describe('POST /shared-links', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.post('/shared-link')
.post('/shared-links')
.send({ type: SharedLinkType.Album, albumId: uuidDto.notFound });
expect(status).toBe(401);
@ -284,7 +284,7 @@ describe('/shared-link', () => {
it('should require a type and the correspondent asset/album id', async () => {
const { status, body } = await request(app)
.post('/shared-link')
.post('/shared-links')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(400);
@ -293,7 +293,7 @@ describe('/shared-link', () => {
it('should require an asset/album id', async () => {
const { status, body } = await request(app)
.post('/shared-link')
.post('/shared-links')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ type: SharedLinkType.Album });
@ -303,7 +303,7 @@ describe('/shared-link', () => {
it('should require a valid asset id', async () => {
const { status, body } = await request(app)
.post('/shared-link')
.post('/shared-links')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ type: SharedLinkType.Individual, assetId: uuidDto.notFound });
@ -313,7 +313,7 @@ describe('/shared-link', () => {
it('should create a shared link', async () => {
const { status, body } = await request(app)
.post('/shared-link')
.post('/shared-links')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ type: SharedLinkType.Album, albumId: album.id });
@ -327,10 +327,10 @@ describe('/shared-link', () => {
});
});
describe('PATCH /shared-link/:id', () => {
describe('PATCH /shared-links/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.patch(`/shared-link/${linkWithAlbum.id}`)
.patch(`/shared-links/${linkWithAlbum.id}`)
.send({ description: 'foo' });
expect(status).toBe(401);
@ -339,7 +339,7 @@ describe('/shared-link', () => {
it('should fail if invalid link', async () => {
const { status, body } = await request(app)
.patch(`/shared-link/${uuidDto.notFound}`)
.patch(`/shared-links/${uuidDto.notFound}`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ description: 'foo' });
@ -349,7 +349,7 @@ describe('/shared-link', () => {
it('should update shared link', async () => {
const { status, body } = await request(app)
.patch(`/shared-link/${linkWithAlbum.id}`)
.patch(`/shared-links/${linkWithAlbum.id}`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ description: 'foo' });
@ -364,10 +364,10 @@ describe('/shared-link', () => {
});
});
describe('PUT /shared-link/:id/assets', () => {
describe('PUT /shared-links/:id/assets', () => {
it('should not add assets to shared link (album)', async () => {
const { status, body } = await request(app)
.put(`/shared-link/${linkWithAlbum.id}/assets`)
.put(`/shared-links/${linkWithAlbum.id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ assetIds: [asset2.id] });
@ -377,7 +377,7 @@ describe('/shared-link', () => {
it('should add an assets to a shared link (individual)', async () => {
const { status, body } = await request(app)
.put(`/shared-link/${linkWithAssets.id}/assets`)
.put(`/shared-links/${linkWithAssets.id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ assetIds: [asset2.id] });
@ -386,10 +386,10 @@ describe('/shared-link', () => {
});
});
describe('DELETE /shared-link/:id/assets', () => {
describe('DELETE /shared-links/:id/assets', () => {
it('should not remove assets from a shared link (album)', async () => {
const { status, body } = await request(app)
.delete(`/shared-link/${linkWithAlbum.id}/assets`)
.delete(`/shared-links/${linkWithAlbum.id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ assetIds: [asset2.id] });
@ -399,7 +399,7 @@ describe('/shared-link', () => {
it('should remove assets from a shared link (individual)', async () => {
const { status, body } = await request(app)
.delete(`/shared-link/${linkWithAssets.id}/assets`)
.delete(`/shared-links/${linkWithAssets.id}/assets`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ assetIds: [asset2.id] });
@ -408,9 +408,9 @@ describe('/shared-link', () => {
});
});
describe('DELETE /shared-link/:id', () => {
describe('DELETE /shared-links/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).delete(`/shared-link/${linkWithAlbum.id}`);
const { status, body } = await request(app).delete(`/shared-links/${linkWithAlbum.id}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@ -418,7 +418,7 @@ describe('/shared-link', () => {
it('should fail if invalid link', async () => {
const { status, body } = await request(app)
.delete(`/shared-link/${uuidDto.notFound}`)
.delete(`/shared-links/${uuidDto.notFound}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(400);
@ -427,7 +427,7 @@ describe('/shared-link', () => {
it('should delete a shared link', async () => {
const { status } = await request(app)
.delete(`/shared-link/${linkWithAlbum.id}`)
.delete(`/shared-links/${linkWithAlbum.id}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);

View File

@ -6,7 +6,7 @@ import { app, asBearerAuth, utils } from 'src/utils';
import request from 'supertest';
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
describe('/user', () => {
describe('/users', () => {
let websocket: Socket;
let admin: LoginResponseDto;
@ -34,15 +34,15 @@ describe('/user', () => {
utils.disconnectWebsocket(websocket);
});
describe('GET /user', () => {
describe('GET /users', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/user');
const { status, body } = await request(app).get('/users');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should get users', async () => {
const { status, body } = await request(app).get('/user').set('Authorization', `Bearer ${admin.accessToken}`);
const { status, body } = await request(app).get('/users').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(200);
expect(body).toHaveLength(5);
expect(body).toEqual(
@ -58,7 +58,7 @@ describe('/user', () => {
it('should hide deleted users', async () => {
const { status, body } = await request(app)
.get(`/user`)
.get(`/users`)
.query({ isAll: true })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
@ -75,7 +75,7 @@ describe('/user', () => {
it('should include deleted users', async () => {
const { status, body } = await request(app)
.get(`/user`)
.get(`/users`)
.query({ isAll: false })
.set('Authorization', `Bearer ${admin.accessToken}`);
@ -93,15 +93,15 @@ describe('/user', () => {
});
});
describe('GET /user/info/:id', () => {
describe('GET /users/info/:id', () => {
it('should require authentication', async () => {
const { status } = await request(app).get(`/user/info/${admin.userId}`);
const { status } = await request(app).get(`/users/info/${admin.userId}`);
expect(status).toEqual(401);
});
it('should get the user info', async () => {
const { status, body } = await request(app)
.get(`/user/info/${admin.userId}`)
.get(`/users/info/${admin.userId}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toMatchObject({
@ -111,15 +111,15 @@ describe('/user', () => {
});
});
describe('GET /user/me', () => {
describe('GET /users/me', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/user/me`);
const { status, body } = await request(app).get(`/users/me`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should get my info', async () => {
const { status, body } = await request(app).get(`/user/me`).set('Authorization', `Bearer ${admin.accessToken}`);
const { status, body } = await request(app).get(`/users/me`).set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toMatchObject({
id: admin.userId,
@ -128,9 +128,9 @@ describe('/user', () => {
});
});
describe('POST /user', () => {
describe('POST /users', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post(`/user`).send(createUserDto.user1);
const { status, body } = await request(app).post(`/users`).send(createUserDto.user1);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
@ -138,7 +138,7 @@ describe('/user', () => {
for (const key of Object.keys(createUserDto.user1)) {
it(`should not allow null ${key}`, async () => {
const { status, body } = await request(app)
.post(`/user`)
.post(`/users`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ...createUserDto.user1, [key]: null });
expect(status).toBe(400);
@ -148,7 +148,7 @@ describe('/user', () => {
it('should ignore `isAdmin`', async () => {
const { status, body } = await request(app)
.post(`/user`)
.post(`/users`)
.send({
isAdmin: true,
email: 'user5@immich.cloud',
@ -166,7 +166,7 @@ describe('/user', () => {
it('should create a user without memories enabled', async () => {
const { status, body } = await request(app)
.post(`/user`)
.post(`/users`)
.send({
email: 'no-memories@immich.cloud',
password: 'Password123',
@ -182,16 +182,16 @@ describe('/user', () => {
});
});
describe('DELETE /user/:id', () => {
describe('DELETE /users/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).delete(`/user/${userToDelete.userId}`);
const { status, body } = await request(app).delete(`/users/${userToDelete.userId}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should delete user', async () => {
const { status, body } = await request(app)
.delete(`/user/${userToDelete.userId}`)
.delete(`/users/${userToDelete.userId}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
@ -204,7 +204,7 @@ describe('/user', () => {
it('should hard delete user', async () => {
const { status, body } = await request(app)
.delete(`/user/${userToHardDelete.userId}`)
.delete(`/users/${userToHardDelete.userId}`)
.send({ force: true })
.set('Authorization', `Bearer ${admin.accessToken}`);
@ -219,9 +219,9 @@ describe('/user', () => {
});
});
describe('PUT /user', () => {
describe('PUT /users', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/user`);
const { status, body } = await request(app).put(`/users`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
@ -229,7 +229,7 @@ describe('/user', () => {
for (const key of Object.keys(userDto.admin)) {
it(`should not allow null ${key}`, async () => {
const { status, body } = await request(app)
.put(`/user`)
.put(`/users`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ...userDto.admin, [key]: null });
expect(status).toBe(400);
@ -239,7 +239,7 @@ describe('/user', () => {
it('should not allow a non-admin to become an admin', async () => {
const { status, body } = await request(app)
.put(`/user`)
.put(`/users`)
.send({ isAdmin: true, id: nonAdmin.userId })
.set('Authorization', `Bearer ${admin.accessToken}`);
@ -249,7 +249,7 @@ describe('/user', () => {
it('ignores updates to profileImagePath', async () => {
const { status, body } = await request(app)
.put(`/user`)
.put(`/users`)
.send({ id: admin.userId, profileImagePath: 'invalid.jpg' })
.set('Authorization', `Bearer ${admin.accessToken}`);
@ -261,7 +261,7 @@ describe('/user', () => {
const before = await getUserById({ id: admin.userId }, { headers: asBearerAuth(admin.accessToken) });
const { status, body } = await request(app)
.put(`/user`)
.put(`/users`)
.send({
id: admin.userId,
name: 'Name',
@ -280,7 +280,7 @@ describe('/user', () => {
it('should update memories enabled', async () => {
const before = await getUserById({ id: admin.userId }, { headers: asBearerAuth(admin.accessToken) });
const { status, body } = await request(app)
.put(`/user`)
.put(`/users`)
.send({
id: admin.userId,
memoriesEnabled: false,

View File

@ -77,5 +77,5 @@ String getThumbnailUrlForRemoteId(
}
String getFaceThumbnailUrl(final String personId) {
return '${Store.get(StoreKey.serverEndpoint)}/person/$personId/thumbnail';
return '${Store.get(StoreKey.serverEndpoint)}/people/$personId/thumbnail';
}

BIN
mobile/openapi/README.md generated

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,7 +1,7 @@
{
"openapi": "3.0.0",
"paths": {
"/activity": {
"/activities": {
"get": {
"operationId": "getActivities",
"parameters": [
@ -120,7 +120,7 @@
]
}
},
"/activity/statistics": {
"/activities/statistics": {
"get": {
"operationId": "getActivityStatistics",
"parameters": [
@ -171,7 +171,7 @@
]
}
},
"/activity/{id}": {
"/activities/{id}": {
"delete": {
"operationId": "deleteActivity",
"parameters": [
@ -206,7 +206,7 @@
]
}
},
"/album": {
"/albums": {
"get": {
"operationId": "getAllAlbums",
"parameters": [
@ -300,7 +300,7 @@
]
}
},
"/album/count": {
"/albums/count": {
"get": {
"operationId": "getAlbumCount",
"parameters": [],
@ -332,7 +332,7 @@
]
}
},
"/album/{id}": {
"/albums/{id}": {
"delete": {
"operationId": "deleteAlbum",
"parameters": [
@ -473,7 +473,7 @@
]
}
},
"/album/{id}/assets": {
"/albums/{id}/assets": {
"delete": {
"operationId": "removeAssetFromAlbum",
"parameters": [
@ -589,7 +589,7 @@
]
}
},
"/album/{id}/user/{userId}": {
"/albums/{id}/user/{userId}": {
"delete": {
"operationId": "removeUserFromAlbum",
"parameters": [
@ -683,7 +683,7 @@
]
}
},
"/album/{id}/users": {
"/albums/{id}/users": {
"put": {
"operationId": "addUsersToAlbum",
"parameters": [
@ -735,7 +735,7 @@
]
}
},
"/api-key": {
"/api-keys": {
"get": {
"operationId": "getApiKeys",
"parameters": [],
@ -810,7 +810,7 @@
]
}
},
"/api-key/{id}": {
"/api-keys/{id}": {
"delete": {
"operationId": "deleteApiKey",
"parameters": [
@ -2256,7 +2256,7 @@
]
}
},
"/face": {
"/faces": {
"get": {
"operationId": "getFaces",
"parameters": [
@ -2301,7 +2301,7 @@
]
}
},
"/face/{id}": {
"/faces/{id}": {
"put": {
"operationId": "reassignFacesById",
"parameters": [
@ -2436,7 +2436,7 @@
]
}
},
"/library": {
"/libraries": {
"get": {
"operationId": "getAllLibraries",
"parameters": [],
@ -2511,7 +2511,7 @@
]
}
},
"/library/{id}": {
"/libraries/{id}": {
"delete": {
"operationId": "deleteLibrary",
"parameters": [
@ -2636,7 +2636,7 @@
]
}
},
"/library/{id}/removeOffline": {
"/libraries/{id}/removeOffline": {
"post": {
"operationId": "removeOfflineFiles",
"parameters": [
@ -2671,7 +2671,7 @@
]
}
},
"/library/{id}/scan": {
"/libraries/{id}/scan": {
"post": {
"operationId": "scanLibrary",
"parameters": [
@ -2716,7 +2716,7 @@
]
}
},
"/library/{id}/statistics": {
"/libraries/{id}/statistics": {
"get": {
"operationId": "getLibraryStatistics",
"parameters": [
@ -2758,7 +2758,7 @@
]
}
},
"/library/{id}/validate": {
"/libraries/{id}/validate": {
"post": {
"operationId": "validate",
"parameters": [
@ -3268,7 +3268,7 @@
]
}
},
"/partner": {
"/partners": {
"get": {
"operationId": "getPartners",
"parameters": [
@ -3316,7 +3316,7 @@
]
}
},
"/partner/{id}": {
"/partners/{id}": {
"delete": {
"operationId": "removePartner",
"parameters": [
@ -3441,7 +3441,7 @@
]
}
},
"/person": {
"/people": {
"get": {
"operationId": "getAllPeople",
"parameters": [
@ -3565,7 +3565,7 @@
]
}
},
"/person/{id}": {
"/people/{id}": {
"get": {
"operationId": "getPerson",
"parameters": [
@ -3657,7 +3657,7 @@
]
}
},
"/person/{id}/assets": {
"/people/{id}/assets": {
"get": {
"operationId": "getPersonAssets",
"parameters": [
@ -3702,7 +3702,7 @@
]
}
},
"/person/{id}/merge": {
"/people/{id}/merge": {
"post": {
"operationId": "mergePerson",
"parameters": [
@ -3757,7 +3757,7 @@
]
}
},
"/person/{id}/reassign": {
"/people/{id}/reassign": {
"put": {
"operationId": "reassignFaces",
"parameters": [
@ -3812,7 +3812,7 @@
]
}
},
"/person/{id}/statistics": {
"/people/{id}/statistics": {
"get": {
"operationId": "getPersonStatistics",
"parameters": [
@ -3854,7 +3854,7 @@
]
}
},
"/person/{id}/thumbnail": {
"/people/{id}/thumbnail": {
"get": {
"operationId": "getPersonThumbnail",
"parameters": [
@ -3897,7 +3897,7 @@
]
}
},
"/report": {
"/reports": {
"get": {
"operationId": "getAuditFiles",
"parameters": [],
@ -3929,7 +3929,7 @@
]
}
},
"/report/checksum": {
"/reports/checksum": {
"post": {
"operationId": "getFileChecksums",
"parameters": [],
@ -3974,7 +3974,7 @@
]
}
},
"/report/fix": {
"/reports/fix": {
"post": {
"operationId": "fixAuditFiles",
"parameters": [],
@ -4656,7 +4656,7 @@
]
}
},
"/shared-link": {
"/shared-links": {
"get": {
"operationId": "getAllSharedLinks",
"parameters": [],
@ -4731,7 +4731,7 @@
]
}
},
"/shared-link/me": {
"/shared-links/me": {
"get": {
"operationId": "getMySharedLink",
"parameters": [
@ -4789,7 +4789,7 @@
]
}
},
"/shared-link/{id}": {
"/shared-links/{id}": {
"delete": {
"operationId": "removeSharedLink",
"parameters": [
@ -4914,7 +4914,7 @@
]
}
},
"/shared-link/{id}/assets": {
"/shared-links/{id}/assets": {
"delete": {
"operationId": "removeSharedLinkAssets",
"parameters": [
@ -5407,7 +5407,7 @@
]
}
},
"/tag": {
"/tags": {
"get": {
"operationId": "getAllTags",
"parameters": [],
@ -5482,7 +5482,7 @@
]
}
},
"/tag/{id}": {
"/tags/{id}": {
"delete": {
"operationId": "deleteTag",
"parameters": [
@ -5607,7 +5607,7 @@
]
}
},
"/tag/{id}/assets": {
"/tags/{id}/assets": {
"delete": {
"operationId": "untagAssets",
"parameters": [
@ -6105,7 +6105,7 @@
]
}
},
"/user": {
"/users": {
"get": {
"operationId": "getAllUsers",
"parameters": [
@ -6229,7 +6229,7 @@
]
}
},
"/user/info/{id}": {
"/users/info/{id}": {
"get": {
"operationId": "getUserById",
"parameters": [
@ -6271,7 +6271,7 @@
]
}
},
"/user/me": {
"/users/me": {
"get": {
"operationId": "getMyUserInfo",
"parameters": [],
@ -6303,7 +6303,7 @@
]
}
},
"/user/profile-image": {
"/users/profile-image": {
"delete": {
"operationId": "deleteProfileImage",
"parameters": [],
@ -6369,7 +6369,7 @@
]
}
},
"/user/profile-image/{id}": {
"/users/profile-image/{id}": {
"get": {
"operationId": "getProfileImage",
"parameters": [
@ -6412,7 +6412,7 @@
]
}
},
"/user/{id}": {
"/users/{id}": {
"delete": {
"operationId": "deleteUser",
"parameters": [
@ -6464,7 +6464,7 @@
]
}
},
"/user/{id}/restore": {
"/users/{id}/restore": {
"post": {
"operationId": "restoreUser",
"parameters": [

View File

@ -1106,7 +1106,7 @@ export function getActivities({ albumId, assetId, level, $type, userId }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: ActivityResponseDto[];
}>(`/activity${QS.query(QS.explode({
}>(`/activities${QS.query(QS.explode({
albumId,
assetId,
level,
@ -1122,7 +1122,7 @@ export function createActivity({ activityCreateDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: ActivityResponseDto;
}>("/activity", oazapfts.json({
}>("/activities", oazapfts.json({
...opts,
method: "POST",
body: activityCreateDto
@ -1135,7 +1135,7 @@ export function getActivityStatistics({ albumId, assetId }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: ActivityStatisticsResponseDto;
}>(`/activity/statistics${QS.query(QS.explode({
}>(`/activities/statistics${QS.query(QS.explode({
albumId,
assetId
}))}`, {
@ -1145,7 +1145,7 @@ export function getActivityStatistics({ albumId, assetId }: {
export function deleteActivity({ id }: {
id: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/activity/${encodeURIComponent(id)}`, {
return oazapfts.ok(oazapfts.fetchText(`/activities/${encodeURIComponent(id)}`, {
...opts,
method: "DELETE"
}));
@ -1157,7 +1157,7 @@ export function getAllAlbums({ assetId, shared }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AlbumResponseDto[];
}>(`/album${QS.query(QS.explode({
}>(`/albums${QS.query(QS.explode({
assetId,
shared
}))}`, {
@ -1170,7 +1170,7 @@ export function createAlbum({ createAlbumDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: AlbumResponseDto;
}>("/album", oazapfts.json({
}>("/albums", oazapfts.json({
...opts,
method: "POST",
body: createAlbumDto
@ -1180,14 +1180,14 @@ export function getAlbumCount(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AlbumCountResponseDto;
}>("/album/count", {
}>("/albums/count", {
...opts
}));
}
export function deleteAlbum({ id }: {
id: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/album/${encodeURIComponent(id)}`, {
return oazapfts.ok(oazapfts.fetchText(`/albums/${encodeURIComponent(id)}`, {
...opts,
method: "DELETE"
}));
@ -1200,7 +1200,7 @@ export function getAlbumInfo({ id, key, withoutAssets }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AlbumResponseDto;
}>(`/album/${encodeURIComponent(id)}${QS.query(QS.explode({
}>(`/albums/${encodeURIComponent(id)}${QS.query(QS.explode({
key,
withoutAssets
}))}`, {
@ -1214,7 +1214,7 @@ export function updateAlbumInfo({ id, updateAlbumDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AlbumResponseDto;
}>(`/album/${encodeURIComponent(id)}`, oazapfts.json({
}>(`/albums/${encodeURIComponent(id)}`, oazapfts.json({
...opts,
method: "PATCH",
body: updateAlbumDto
@ -1227,7 +1227,7 @@ export function removeAssetFromAlbum({ id, bulkIdsDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: BulkIdResponseDto[];
}>(`/album/${encodeURIComponent(id)}/assets`, oazapfts.json({
}>(`/albums/${encodeURIComponent(id)}/assets`, oazapfts.json({
...opts,
method: "DELETE",
body: bulkIdsDto
@ -1241,7 +1241,7 @@ export function addAssetsToAlbum({ id, key, bulkIdsDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: BulkIdResponseDto[];
}>(`/album/${encodeURIComponent(id)}/assets${QS.query(QS.explode({
}>(`/albums/${encodeURIComponent(id)}/assets${QS.query(QS.explode({
key
}))}`, oazapfts.json({
...opts,
@ -1253,7 +1253,7 @@ export function removeUserFromAlbum({ id, userId }: {
id: string;
userId: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/album/${encodeURIComponent(id)}/user/${encodeURIComponent(userId)}`, {
return oazapfts.ok(oazapfts.fetchText(`/albums/${encodeURIComponent(id)}/user/${encodeURIComponent(userId)}`, {
...opts,
method: "DELETE"
}));
@ -1263,7 +1263,7 @@ export function updateAlbumUser({ id, userId, updateAlbumUserDto }: {
userId: string;
updateAlbumUserDto: UpdateAlbumUserDto;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/album/${encodeURIComponent(id)}/user/${encodeURIComponent(userId)}`, oazapfts.json({
return oazapfts.ok(oazapfts.fetchText(`/albums/${encodeURIComponent(id)}/user/${encodeURIComponent(userId)}`, oazapfts.json({
...opts,
method: "PUT",
body: updateAlbumUserDto
@ -1276,7 +1276,7 @@ export function addUsersToAlbum({ id, addUsersDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AlbumResponseDto;
}>(`/album/${encodeURIComponent(id)}/users`, oazapfts.json({
}>(`/albums/${encodeURIComponent(id)}/users`, oazapfts.json({
...opts,
method: "PUT",
body: addUsersDto
@ -1286,7 +1286,7 @@ export function getApiKeys(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: ApiKeyResponseDto[];
}>("/api-key", {
}>("/api-keys", {
...opts
}));
}
@ -1296,7 +1296,7 @@ export function createApiKey({ apiKeyCreateDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: ApiKeyCreateResponseDto;
}>("/api-key", oazapfts.json({
}>("/api-keys", oazapfts.json({
...opts,
method: "POST",
body: apiKeyCreateDto
@ -1305,7 +1305,7 @@ export function createApiKey({ apiKeyCreateDto }: {
export function deleteApiKey({ id }: {
id: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/api-key/${encodeURIComponent(id)}`, {
return oazapfts.ok(oazapfts.fetchText(`/api-keys/${encodeURIComponent(id)}`, {
...opts,
method: "DELETE"
}));
@ -1316,7 +1316,7 @@ export function getApiKey({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: ApiKeyResponseDto;
}>(`/api-key/${encodeURIComponent(id)}`, {
}>(`/api-keys/${encodeURIComponent(id)}`, {
...opts
}));
}
@ -1327,7 +1327,7 @@ export function updateApiKey({ id, apiKeyUpdateDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: ApiKeyResponseDto;
}>(`/api-key/${encodeURIComponent(id)}`, oazapfts.json({
}>(`/api-keys/${encodeURIComponent(id)}`, oazapfts.json({
...opts,
method: "PUT",
body: apiKeyUpdateDto
@ -1712,7 +1712,7 @@ export function getFaces({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AssetFaceResponseDto[];
}>(`/face${QS.query(QS.explode({
}>(`/faces${QS.query(QS.explode({
id
}))}`, {
...opts
@ -1725,7 +1725,7 @@ export function reassignFacesById({ id, faceDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: PersonResponseDto;
}>(`/face/${encodeURIComponent(id)}`, oazapfts.json({
}>(`/faces/${encodeURIComponent(id)}`, oazapfts.json({
...opts,
method: "PUT",
body: faceDto
@ -1756,7 +1756,7 @@ export function getAllLibraries(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: LibraryResponseDto[];
}>("/library", {
}>("/libraries", {
...opts
}));
}
@ -1766,7 +1766,7 @@ export function createLibrary({ createLibraryDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: LibraryResponseDto;
}>("/library", oazapfts.json({
}>("/libraries", oazapfts.json({
...opts,
method: "POST",
body: createLibraryDto
@ -1775,7 +1775,7 @@ export function createLibrary({ createLibraryDto }: {
export function deleteLibrary({ id }: {
id: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/library/${encodeURIComponent(id)}`, {
return oazapfts.ok(oazapfts.fetchText(`/libraries/${encodeURIComponent(id)}`, {
...opts,
method: "DELETE"
}));
@ -1786,7 +1786,7 @@ export function getLibrary({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: LibraryResponseDto;
}>(`/library/${encodeURIComponent(id)}`, {
}>(`/libraries/${encodeURIComponent(id)}`, {
...opts
}));
}
@ -1797,7 +1797,7 @@ export function updateLibrary({ id, updateLibraryDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: LibraryResponseDto;
}>(`/library/${encodeURIComponent(id)}`, oazapfts.json({
}>(`/libraries/${encodeURIComponent(id)}`, oazapfts.json({
...opts,
method: "PUT",
body: updateLibraryDto
@ -1806,7 +1806,7 @@ export function updateLibrary({ id, updateLibraryDto }: {
export function removeOfflineFiles({ id }: {
id: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/library/${encodeURIComponent(id)}/removeOffline`, {
return oazapfts.ok(oazapfts.fetchText(`/libraries/${encodeURIComponent(id)}/removeOffline`, {
...opts,
method: "POST"
}));
@ -1815,7 +1815,7 @@ export function scanLibrary({ id, scanLibraryDto }: {
id: string;
scanLibraryDto: ScanLibraryDto;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/library/${encodeURIComponent(id)}/scan`, oazapfts.json({
return oazapfts.ok(oazapfts.fetchText(`/libraries/${encodeURIComponent(id)}/scan`, oazapfts.json({
...opts,
method: "POST",
body: scanLibraryDto
@ -1827,7 +1827,7 @@ export function getLibraryStatistics({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: LibraryStatsResponseDto;
}>(`/library/${encodeURIComponent(id)}/statistics`, {
}>(`/libraries/${encodeURIComponent(id)}/statistics`, {
...opts
}));
}
@ -1838,7 +1838,7 @@ export function validate({ id, validateLibraryDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: ValidateLibraryResponseDto;
}>(`/library/${encodeURIComponent(id)}/validate`, oazapfts.json({
}>(`/libraries/${encodeURIComponent(id)}/validate`, oazapfts.json({
...opts,
method: "POST",
body: validateLibraryDto
@ -1977,7 +1977,7 @@ export function getPartners({ direction }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: PartnerResponseDto[];
}>(`/partner${QS.query(QS.explode({
}>(`/partners${QS.query(QS.explode({
direction
}))}`, {
...opts
@ -1986,7 +1986,7 @@ export function getPartners({ direction }: {
export function removePartner({ id }: {
id: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/partner/${encodeURIComponent(id)}`, {
return oazapfts.ok(oazapfts.fetchText(`/partners/${encodeURIComponent(id)}`, {
...opts,
method: "DELETE"
}));
@ -1997,7 +1997,7 @@ export function createPartner({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: PartnerResponseDto;
}>(`/partner/${encodeURIComponent(id)}`, {
}>(`/partners/${encodeURIComponent(id)}`, {
...opts,
method: "POST"
}));
@ -2009,7 +2009,7 @@ export function updatePartner({ id, updatePartnerDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: PartnerResponseDto;
}>(`/partner/${encodeURIComponent(id)}`, oazapfts.json({
}>(`/partners/${encodeURIComponent(id)}`, oazapfts.json({
...opts,
method: "PUT",
body: updatePartnerDto
@ -2021,7 +2021,7 @@ export function getAllPeople({ withHidden }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: PeopleResponseDto;
}>(`/person${QS.query(QS.explode({
}>(`/people${QS.query(QS.explode({
withHidden
}))}`, {
...opts
@ -2033,7 +2033,7 @@ export function createPerson({ personCreateDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: PersonResponseDto;
}>("/person", oazapfts.json({
}>("/people", oazapfts.json({
...opts,
method: "POST",
body: personCreateDto
@ -2045,7 +2045,7 @@ export function updatePeople({ peopleUpdateDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: BulkIdResponseDto[];
}>("/person", oazapfts.json({
}>("/people", oazapfts.json({
...opts,
method: "PUT",
body: peopleUpdateDto
@ -2057,7 +2057,7 @@ export function getPerson({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: PersonResponseDto;
}>(`/person/${encodeURIComponent(id)}`, {
}>(`/people/${encodeURIComponent(id)}`, {
...opts
}));
}
@ -2068,7 +2068,7 @@ export function updatePerson({ id, personUpdateDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: PersonResponseDto;
}>(`/person/${encodeURIComponent(id)}`, oazapfts.json({
}>(`/people/${encodeURIComponent(id)}`, oazapfts.json({
...opts,
method: "PUT",
body: personUpdateDto
@ -2080,7 +2080,7 @@ export function getPersonAssets({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AssetResponseDto[];
}>(`/person/${encodeURIComponent(id)}/assets`, {
}>(`/people/${encodeURIComponent(id)}/assets`, {
...opts
}));
}
@ -2091,7 +2091,7 @@ export function mergePerson({ id, mergePersonDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: BulkIdResponseDto[];
}>(`/person/${encodeURIComponent(id)}/merge`, oazapfts.json({
}>(`/people/${encodeURIComponent(id)}/merge`, oazapfts.json({
...opts,
method: "POST",
body: mergePersonDto
@ -2104,7 +2104,7 @@ export function reassignFaces({ id, assetFaceUpdateDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: PersonResponseDto[];
}>(`/person/${encodeURIComponent(id)}/reassign`, oazapfts.json({
}>(`/people/${encodeURIComponent(id)}/reassign`, oazapfts.json({
...opts,
method: "PUT",
body: assetFaceUpdateDto
@ -2116,7 +2116,7 @@ export function getPersonStatistics({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: PersonStatisticsResponseDto;
}>(`/person/${encodeURIComponent(id)}/statistics`, {
}>(`/people/${encodeURIComponent(id)}/statistics`, {
...opts
}));
}
@ -2126,7 +2126,7 @@ export function getPersonThumbnail({ id }: {
return oazapfts.ok(oazapfts.fetchBlob<{
status: 200;
data: Blob;
}>(`/person/${encodeURIComponent(id)}/thumbnail`, {
}>(`/people/${encodeURIComponent(id)}/thumbnail`, {
...opts
}));
}
@ -2134,7 +2134,7 @@ export function getAuditFiles(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: FileReportDto;
}>("/report", {
}>("/reports", {
...opts
}));
}
@ -2144,7 +2144,7 @@ export function getFileChecksums({ fileChecksumDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: FileChecksumResponseDto[];
}>("/report/checksum", oazapfts.json({
}>("/reports/checksum", oazapfts.json({
...opts,
method: "POST",
body: fileChecksumDto
@ -2153,7 +2153,7 @@ export function getFileChecksums({ fileChecksumDto }: {
export function fixAuditFiles({ fileReportFixDto }: {
fileReportFixDto: FileReportFixDto;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText("/report/fix", oazapfts.json({
return oazapfts.ok(oazapfts.fetchText("/reports/fix", oazapfts.json({
...opts,
method: "POST",
body: fileReportFixDto
@ -2346,7 +2346,7 @@ export function getAllSharedLinks(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: SharedLinkResponseDto[];
}>("/shared-link", {
}>("/shared-links", {
...opts
}));
}
@ -2356,7 +2356,7 @@ export function createSharedLink({ sharedLinkCreateDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: SharedLinkResponseDto;
}>("/shared-link", oazapfts.json({
}>("/shared-links", oazapfts.json({
...opts,
method: "POST",
body: sharedLinkCreateDto
@ -2370,7 +2370,7 @@ export function getMySharedLink({ key, password, token }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: SharedLinkResponseDto;
}>(`/shared-link/me${QS.query(QS.explode({
}>(`/shared-links/me${QS.query(QS.explode({
key,
password,
token
@ -2381,7 +2381,7 @@ export function getMySharedLink({ key, password, token }: {
export function removeSharedLink({ id }: {
id: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/shared-link/${encodeURIComponent(id)}`, {
return oazapfts.ok(oazapfts.fetchText(`/shared-links/${encodeURIComponent(id)}`, {
...opts,
method: "DELETE"
}));
@ -2392,7 +2392,7 @@ export function getSharedLinkById({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: SharedLinkResponseDto;
}>(`/shared-link/${encodeURIComponent(id)}`, {
}>(`/shared-links/${encodeURIComponent(id)}`, {
...opts
}));
}
@ -2403,7 +2403,7 @@ export function updateSharedLink({ id, sharedLinkEditDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: SharedLinkResponseDto;
}>(`/shared-link/${encodeURIComponent(id)}`, oazapfts.json({
}>(`/shared-links/${encodeURIComponent(id)}`, oazapfts.json({
...opts,
method: "PATCH",
body: sharedLinkEditDto
@ -2417,7 +2417,7 @@ export function removeSharedLinkAssets({ id, key, assetIdsDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AssetIdsResponseDto[];
}>(`/shared-link/${encodeURIComponent(id)}/assets${QS.query(QS.explode({
}>(`/shared-links/${encodeURIComponent(id)}/assets${QS.query(QS.explode({
key
}))}`, oazapfts.json({
...opts,
@ -2433,7 +2433,7 @@ export function addSharedLinkAssets({ id, key, assetIdsDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AssetIdsResponseDto[];
}>(`/shared-link/${encodeURIComponent(id)}/assets${QS.query(QS.explode({
}>(`/shared-links/${encodeURIComponent(id)}/assets${QS.query(QS.explode({
key
}))}`, oazapfts.json({
...opts,
@ -2544,7 +2544,7 @@ export function getAllTags(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: TagResponseDto[];
}>("/tag", {
}>("/tags", {
...opts
}));
}
@ -2554,7 +2554,7 @@ export function createTag({ createTagDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: TagResponseDto;
}>("/tag", oazapfts.json({
}>("/tags", oazapfts.json({
...opts,
method: "POST",
body: createTagDto
@ -2563,7 +2563,7 @@ export function createTag({ createTagDto }: {
export function deleteTag({ id }: {
id: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/tag/${encodeURIComponent(id)}`, {
return oazapfts.ok(oazapfts.fetchText(`/tags/${encodeURIComponent(id)}`, {
...opts,
method: "DELETE"
}));
@ -2574,7 +2574,7 @@ export function getTagById({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: TagResponseDto;
}>(`/tag/${encodeURIComponent(id)}`, {
}>(`/tags/${encodeURIComponent(id)}`, {
...opts
}));
}
@ -2585,7 +2585,7 @@ export function updateTag({ id, updateTagDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: TagResponseDto;
}>(`/tag/${encodeURIComponent(id)}`, oazapfts.json({
}>(`/tags/${encodeURIComponent(id)}`, oazapfts.json({
...opts,
method: "PATCH",
body: updateTagDto
@ -2598,7 +2598,7 @@ export function untagAssets({ id, assetIdsDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AssetIdsResponseDto[];
}>(`/tag/${encodeURIComponent(id)}/assets`, oazapfts.json({
}>(`/tags/${encodeURIComponent(id)}/assets`, oazapfts.json({
...opts,
method: "DELETE",
body: assetIdsDto
@ -2610,7 +2610,7 @@ export function getTagAssets({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AssetResponseDto[];
}>(`/tag/${encodeURIComponent(id)}/assets`, {
}>(`/tags/${encodeURIComponent(id)}/assets`, {
...opts
}));
}
@ -2621,7 +2621,7 @@ export function tagAssets({ id, assetIdsDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: AssetIdsResponseDto[];
}>(`/tag/${encodeURIComponent(id)}/assets`, oazapfts.json({
}>(`/tags/${encodeURIComponent(id)}/assets`, oazapfts.json({
...opts,
method: "PUT",
body: assetIdsDto
@ -2720,7 +2720,7 @@ export function getAllUsers({ isAll }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: UserResponseDto[];
}>(`/user${QS.query(QS.explode({
}>(`/users${QS.query(QS.explode({
isAll
}))}`, {
...opts
@ -2732,7 +2732,7 @@ export function createUser({ createUserDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: UserResponseDto;
}>("/user", oazapfts.json({
}>("/users", oazapfts.json({
...opts,
method: "POST",
body: createUserDto
@ -2744,7 +2744,7 @@ export function updateUser({ updateUserDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: UserResponseDto;
}>("/user", oazapfts.json({
}>("/users", oazapfts.json({
...opts,
method: "PUT",
body: updateUserDto
@ -2756,7 +2756,7 @@ export function getUserById({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: UserResponseDto;
}>(`/user/info/${encodeURIComponent(id)}`, {
}>(`/users/info/${encodeURIComponent(id)}`, {
...opts
}));
}
@ -2764,12 +2764,12 @@ export function getMyUserInfo(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: UserResponseDto;
}>("/user/me", {
}>("/users/me", {
...opts
}));
}
export function deleteProfileImage(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText("/user/profile-image", {
return oazapfts.ok(oazapfts.fetchText("/users/profile-image", {
...opts,
method: "DELETE"
}));
@ -2780,7 +2780,7 @@ export function createProfileImage({ createProfileImageDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: CreateProfileImageResponseDto;
}>("/user/profile-image", oazapfts.multipart({
}>("/users/profile-image", oazapfts.multipart({
...opts,
method: "POST",
body: createProfileImageDto
@ -2792,7 +2792,7 @@ export function getProfileImage({ id }: {
return oazapfts.ok(oazapfts.fetchBlob<{
status: 200;
data: Blob;
}>(`/user/profile-image/${encodeURIComponent(id)}`, {
}>(`/users/profile-image/${encodeURIComponent(id)}`, {
...opts
}));
}
@ -2803,7 +2803,7 @@ export function deleteUser({ id, deleteUserDto }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: UserResponseDto;
}>(`/user/${encodeURIComponent(id)}`, oazapfts.json({
}>(`/users/${encodeURIComponent(id)}`, oazapfts.json({
...opts,
method: "DELETE",
body: deleteUserDto
@ -2815,7 +2815,7 @@ export function restoreUser({ id }: {
return oazapfts.ok(oazapfts.fetchJson<{
status: 201;
data: UserResponseDto;
}>(`/user/${encodeURIComponent(id)}/restore`, {
}>(`/users/${encodeURIComponent(id)}/restore`, {
...opts,
method: "POST"
}));

View File

@ -14,7 +14,7 @@ import { ActivityService } from 'src/services/activity.service';
import { UUIDParamDto } from 'src/validation';
@ApiTags('Activity')
@Controller('activity')
@Controller('activities')
export class ActivityController {
constructor(private service: ActivityService) {}

View File

@ -17,7 +17,7 @@ import { AlbumService } from 'src/services/album.service';
import { ParseMeUUIDPipe, UUIDParamDto } from 'src/validation';
@ApiTags('Album')
@Controller('album')
@Controller('albums')
export class AlbumController {
constructor(private service: AlbumService) {}

View File

@ -7,7 +7,7 @@ import { APIKeyService } from 'src/services/api-key.service';
import { UUIDParamDto } from 'src/validation';
@ApiTags('API Key')
@Controller('api-key')
@Controller('api-keys')
export class APIKeyController {
constructor(private service: APIKeyService) {}

View File

@ -7,7 +7,7 @@ import { PersonService } from 'src/services/person.service';
import { UUIDParamDto } from 'src/validation';
@ApiTags('Face')
@Controller('face')
@Controller('faces')
export class FaceController {
constructor(private service: PersonService) {}

View File

@ -5,7 +5,7 @@ import { Authenticated } from 'src/middleware/auth.guard';
import { AuditService } from 'src/services/audit.service';
@ApiTags('File Report')
@Controller('report')
@Controller('reports')
export class ReportController {
constructor(private service: AuditService) {}

View File

@ -14,7 +14,7 @@ import { LibraryService } from 'src/services/library.service';
import { UUIDParamDto } from 'src/validation';
@ApiTags('Library')
@Controller('library')
@Controller('libraries')
export class LibraryController {
constructor(private service: LibraryService) {}

View File

@ -8,7 +8,7 @@ import { PartnerService } from 'src/services/partner.service';
import { UUIDParamDto } from 'src/validation';
@ApiTags('Partner')
@Controller('partner')
@Controller('partners')
export class PartnerController {
constructor(private service: PartnerService) {}

View File

@ -22,7 +22,7 @@ import { sendFile } from 'src/utils/file';
import { UUIDParamDto } from 'src/validation';
@ApiTags('Person')
@Controller('person')
@Controller('people')
export class PersonController {
constructor(
private service: PersonService,

View File

@ -17,7 +17,7 @@ import { respondWithCookie } from 'src/utils/response';
import { UUIDParamDto } from 'src/validation';
@ApiTags('Shared Link')
@Controller('shared-link')
@Controller('shared-links')
export class SharedLinkController {
constructor(private service: SharedLinkService) {}

View File

@ -10,7 +10,7 @@ import { TagService } from 'src/services/tag.service';
import { UUIDParamDto } from 'src/validation';
@ApiTags('Tag')
@Controller('tag')
@Controller('tags')
export class TagController {
constructor(private service: TagService) {}

View File

@ -13,7 +13,7 @@ import { AssetService, UploadFile } from 'src/services/asset.service';
export enum Route {
ASSET = 'asset',
USER = 'user',
USER = 'users',
}
export interface ImmichFile extends Express.Multer.File {

View File

@ -174,7 +174,7 @@ export const getProfileImageUrl = (...[userId]: [string]) => {
};
export const getPeopleThumbnailUrl = (personId: string) => {
const path = `/person/${personId}/thumbnail`;
const path = `/people/${personId}/thumbnail`;
return createUrl(path);
};