diff --git a/e2e/src/api/specs/activity.e2e-spec.ts b/e2e/src/api/specs/activity.e2e-spec.ts index a1b717883d..3258f74d6e 100644 --- a/e2e/src/api/specs/activity.e2e-spec.ts +++ b/e2e/src/api/specs/activity.e2e-spec.ts @@ -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); diff --git a/e2e/src/api/specs/album.e2e-spec.ts b/e2e/src/api/specs/album.e2e-spec.ts index ec5238f376..5cebe8f42c 100644 --- a/e2e/src/api/specs/album.e2e-spec.ts +++ b/e2e/src/api/specs/album.e2e-spec.ts @@ -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 }); diff --git a/e2e/src/api/specs/asset.e2e-spec.ts b/e2e/src/api/specs/asset.e2e-spec.ts index 50b84fd9b0..5dd3ec698b 100644 --- a/e2e/src/api/specs/asset.e2e-spec.ts +++ b/e2e/src/api/specs/asset.e2e-spec.ts @@ -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 })); }); diff --git a/e2e/src/api/specs/audit.e2e-spec.ts b/e2e/src/api/specs/audit.e2e-spec.ts index ec8c3799c8..c6a2adbb0a 100644 --- a/e2e/src/api/specs/audit.e2e-spec.ts +++ b/e2e/src/api/specs/audit.e2e-spec.ts @@ -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 () => { diff --git a/e2e/src/api/specs/library.e2e-spec.ts b/e2e/src/api/specs/library.e2e-spec.ts index f31a20e27c..762606de5e 100644 --- a/e2e/src/api/specs/library.e2e-spec.ts +++ b/e2e/src/api/specs/library.e2e-spec.ts @@ -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); diff --git a/e2e/src/api/specs/partner.e2e-spec.ts b/e2e/src/api/specs/partner.e2e-spec.ts index b2fb7f4101..1654f04e18 100644 --- a/e2e/src/api/specs/partner.e2e-spec.ts +++ b/e2e/src/api/specs/partner.e2e-spec.ts @@ -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); diff --git a/e2e/src/api/specs/person.e2e-spec.ts b/e2e/src/api/specs/person.e2e-spec.ts index 54fbfa9be5..963b4cf7bc 100644 --- a/e2e/src/api/specs/person.e2e-spec.ts +++ b/e2e/src/api/specs/person.e2e-spec.ts @@ -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); diff --git a/e2e/src/api/specs/shared-link.e2e-spec.ts b/e2e/src/api/specs/shared-link.e2e-spec.ts index c446fe9cdb..aa4ec7e349 100644 --- a/e2e/src/api/specs/shared-link.e2e-spec.ts +++ b/e2e/src/api/specs/shared-link.e2e-spec.ts @@ -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); diff --git a/e2e/src/api/specs/user.e2e-spec.ts b/e2e/src/api/specs/user.e2e-spec.ts index 5de410606a..7518e732ec 100644 --- a/e2e/src/api/specs/user.e2e-spec.ts +++ b/e2e/src/api/specs/user.e2e-spec.ts @@ -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, diff --git a/mobile/lib/utils/image_url_builder.dart b/mobile/lib/utils/image_url_builder.dart index f830aa39e2..5d5719313e 100644 --- a/mobile/lib/utils/image_url_builder.dart +++ b/mobile/lib/utils/image_url_builder.dart @@ -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'; } diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 6055742602..e23b1fea76 100644 Binary files a/mobile/openapi/README.md and b/mobile/openapi/README.md differ diff --git a/mobile/openapi/lib/api/activity_api.dart b/mobile/openapi/lib/api/activity_api.dart index bf2c168fc9..52dceadc72 100644 Binary files a/mobile/openapi/lib/api/activity_api.dart and b/mobile/openapi/lib/api/activity_api.dart differ diff --git a/mobile/openapi/lib/api/album_api.dart b/mobile/openapi/lib/api/album_api.dart index 52b3e466b4..dbc8648a37 100644 Binary files a/mobile/openapi/lib/api/album_api.dart and b/mobile/openapi/lib/api/album_api.dart differ diff --git a/mobile/openapi/lib/api/api_key_api.dart b/mobile/openapi/lib/api/api_key_api.dart index 43cb233114..03c6605706 100644 Binary files a/mobile/openapi/lib/api/api_key_api.dart and b/mobile/openapi/lib/api/api_key_api.dart differ diff --git a/mobile/openapi/lib/api/face_api.dart b/mobile/openapi/lib/api/face_api.dart index 5d21a223a1..cf37c30197 100644 Binary files a/mobile/openapi/lib/api/face_api.dart and b/mobile/openapi/lib/api/face_api.dart differ diff --git a/mobile/openapi/lib/api/file_report_api.dart b/mobile/openapi/lib/api/file_report_api.dart index 4919dfeaf1..a52f02d43b 100644 Binary files a/mobile/openapi/lib/api/file_report_api.dart and b/mobile/openapi/lib/api/file_report_api.dart differ diff --git a/mobile/openapi/lib/api/library_api.dart b/mobile/openapi/lib/api/library_api.dart index 48f46e6e1b..e634dae836 100644 Binary files a/mobile/openapi/lib/api/library_api.dart and b/mobile/openapi/lib/api/library_api.dart differ diff --git a/mobile/openapi/lib/api/partner_api.dart b/mobile/openapi/lib/api/partner_api.dart index 6dac6286b1..66ec2b089b 100644 Binary files a/mobile/openapi/lib/api/partner_api.dart and b/mobile/openapi/lib/api/partner_api.dart differ diff --git a/mobile/openapi/lib/api/person_api.dart b/mobile/openapi/lib/api/person_api.dart index cf0d289388..a05aa03e1f 100644 Binary files a/mobile/openapi/lib/api/person_api.dart and b/mobile/openapi/lib/api/person_api.dart differ diff --git a/mobile/openapi/lib/api/shared_link_api.dart b/mobile/openapi/lib/api/shared_link_api.dart index 7d4ef098b0..80a5034dff 100644 Binary files a/mobile/openapi/lib/api/shared_link_api.dart and b/mobile/openapi/lib/api/shared_link_api.dart differ diff --git a/mobile/openapi/lib/api/tag_api.dart b/mobile/openapi/lib/api/tag_api.dart index 539e3c8e27..961f0cb394 100644 Binary files a/mobile/openapi/lib/api/tag_api.dart and b/mobile/openapi/lib/api/tag_api.dart differ diff --git a/mobile/openapi/lib/api/user_api.dart b/mobile/openapi/lib/api/user_api.dart index 42a9532e28..1f070d436f 100644 Binary files a/mobile/openapi/lib/api/user_api.dart and b/mobile/openapi/lib/api/user_api.dart differ diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index c6eff20a47..929338b734 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -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": [ diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 050dbfeb9a..02ff002f01 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -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" })); diff --git a/server/src/controllers/activity.controller.ts b/server/src/controllers/activity.controller.ts index 9a5fc41885..de59437a89 100644 --- a/server/src/controllers/activity.controller.ts +++ b/server/src/controllers/activity.controller.ts @@ -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) {} diff --git a/server/src/controllers/album.controller.ts b/server/src/controllers/album.controller.ts index c38f733b42..ea42ed4d79 100644 --- a/server/src/controllers/album.controller.ts +++ b/server/src/controllers/album.controller.ts @@ -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) {} diff --git a/server/src/controllers/api-key.controller.ts b/server/src/controllers/api-key.controller.ts index e0b07ede50..4225bdc1bc 100644 --- a/server/src/controllers/api-key.controller.ts +++ b/server/src/controllers/api-key.controller.ts @@ -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) {} diff --git a/server/src/controllers/face.controller.ts b/server/src/controllers/face.controller.ts index 5b45432944..cb4bc080c8 100644 --- a/server/src/controllers/face.controller.ts +++ b/server/src/controllers/face.controller.ts @@ -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) {} diff --git a/server/src/controllers/file-report.controller.ts b/server/src/controllers/file-report.controller.ts index 1f9ebe52dd..523debfb4c 100644 --- a/server/src/controllers/file-report.controller.ts +++ b/server/src/controllers/file-report.controller.ts @@ -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) {} diff --git a/server/src/controllers/library.controller.ts b/server/src/controllers/library.controller.ts index adbae8af0f..b6d65874ca 100644 --- a/server/src/controllers/library.controller.ts +++ b/server/src/controllers/library.controller.ts @@ -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) {} diff --git a/server/src/controllers/partner.controller.ts b/server/src/controllers/partner.controller.ts index 1faf82898c..102f6f10ce 100644 --- a/server/src/controllers/partner.controller.ts +++ b/server/src/controllers/partner.controller.ts @@ -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) {} diff --git a/server/src/controllers/person.controller.ts b/server/src/controllers/person.controller.ts index 1d3371f82a..26f9df2e1f 100644 --- a/server/src/controllers/person.controller.ts +++ b/server/src/controllers/person.controller.ts @@ -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, diff --git a/server/src/controllers/shared-link.controller.ts b/server/src/controllers/shared-link.controller.ts index 64d3e38e7e..a7be1911d9 100644 --- a/server/src/controllers/shared-link.controller.ts +++ b/server/src/controllers/shared-link.controller.ts @@ -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) {} diff --git a/server/src/controllers/tag.controller.ts b/server/src/controllers/tag.controller.ts index 2a46fdec71..1f8a44dd5b 100644 --- a/server/src/controllers/tag.controller.ts +++ b/server/src/controllers/tag.controller.ts @@ -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) {} diff --git a/server/src/middleware/file-upload.interceptor.ts b/server/src/middleware/file-upload.interceptor.ts index 1b8405fe6e..6af502786e 100644 --- a/server/src/middleware/file-upload.interceptor.ts +++ b/server/src/middleware/file-upload.interceptor.ts @@ -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 { diff --git a/web/src/lib/utils.ts b/web/src/lib/utils.ts index 2baabd0a44..5c055b875d 100644 --- a/web/src/lib/utils.ts +++ b/web/src/lib/utils.ts @@ -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); };