chore(server): remove user count endpoint (#4724)

* chore: remove unused endpoint

* chore: open api
This commit is contained in:
Jason Rasmussen 2023-10-30 15:29:18 -04:00 committed by GitHub
parent 2f87463170
commit 8dcd159bd6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 3 additions and 356 deletions

View file

@ -3964,6 +3964,7 @@ export const TranscodeHWAccel = {
Nvenc: 'nvenc',
Qsv: 'qsv',
Vaapi: 'vaapi',
Rkmpp: 'rkmpp',
Disabled: 'disabled'
} as const;
@ -4209,19 +4210,6 @@ export interface UsageByUserDto {
*/
'videos': number;
}
/**
*
* @export
* @interface UserCountResponseDto
*/
export interface UserCountResponseDto {
/**
*
* @type {number}
* @memberof UserCountResponseDto
*/
'userCount': number;
}
/**
*
* @export
@ -15742,49 +15730,6 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
*
* @param {boolean} [admin]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getUserCount: async (admin?: boolean, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/user/count`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication cookie required
// authentication api_key required
await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration)
// authentication bearer required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
if (admin !== undefined) {
localVarQueryParameter['admin'] = admin;
}
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
@ -15959,16 +15904,6 @@ export const UserApiFp = function(configuration?: Configuration) {
const localVarAxiosArgs = await localVarAxiosParamCreator.getUserById(id, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
/**
*
* @param {boolean} [admin]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async getUserCount(admin?: boolean, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<UserCountResponseDto>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.getUserCount(admin, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
/**
*
* @param {string} id
@ -16061,15 +15996,6 @@ export const UserApiFactory = function (configuration?: Configuration, basePath?
getUserById(requestParameters: UserApiGetUserByIdRequest, options?: AxiosRequestConfig): AxiosPromise<UserResponseDto> {
return localVarFp.getUserById(requestParameters.id, options).then((request) => request(axios, basePath));
},
/**
*
* @param {UserApiGetUserCountRequest} requestParameters Request parameters.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getUserCount(requestParameters: UserApiGetUserCountRequest = {}, options?: AxiosRequestConfig): AxiosPromise<UserCountResponseDto> {
return localVarFp.getUserCount(requestParameters.admin, options).then((request) => request(axios, basePath));
},
/**
*
* @param {UserApiRestoreUserRequest} requestParameters Request parameters.
@ -16175,20 +16101,6 @@ export interface UserApiGetUserByIdRequest {
readonly id: string
}
/**
* Request parameters for getUserCount operation in UserApi.
* @export
* @interface UserApiGetUserCountRequest
*/
export interface UserApiGetUserCountRequest {
/**
*
* @type {boolean}
* @memberof UserApiGetUserCount
*/
readonly admin?: boolean
}
/**
* Request parameters for restoreUser operation in UserApi.
* @export
@ -16300,17 +16212,6 @@ export class UserApi extends BaseAPI {
return UserApiFp(this.configuration).getUserById(requestParameters.id, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @param {UserApiGetUserCountRequest} requestParameters Request parameters.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof UserApi
*/
public getUserCount(requestParameters: UserApiGetUserCountRequest = {}, options?: AxiosRequestConfig) {
return UserApiFp(this.configuration).getUserCount(requestParameters.admin, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @param {UserApiRestoreUserRequest} requestParameters Request parameters.

View file

@ -156,7 +156,6 @@ doc/UpdateTagDto.md
doc/UpdateUserDto.md
doc/UsageByUserDto.md
doc/UserApi.md
doc/UserCountResponseDto.md
doc/UserResponseDto.md
doc/ValidateAccessTokenResponseDto.md
doc/VideoCodec.md
@ -323,7 +322,6 @@ lib/model/update_stack_parent_dto.dart
lib/model/update_tag_dto.dart
lib/model/update_user_dto.dart
lib/model/usage_by_user_dto.dart
lib/model/user_count_response_dto.dart
lib/model/user_response_dto.dart
lib/model/validate_access_token_response_dto.dart
lib/model/video_codec.dart
@ -481,7 +479,6 @@ test/update_tag_dto_test.dart
test/update_user_dto_test.dart
test/usage_by_user_dto_test.dart
test/user_api_test.dart
test/user_count_response_dto_test.dart
test/user_response_dto_test.dart
test/validate_access_token_response_dto_test.dart
test/video_codec_test.dart

BIN
mobile/openapi/README.md generated

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -5177,48 +5177,6 @@
]
}
},
"/user/count": {
"get": {
"operationId": "getUserCount",
"parameters": [
{
"name": "admin",
"required": false,
"in": "query",
"schema": {
"default": false,
"type": "boolean"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UserCountResponseDto"
}
}
},
"description": ""
}
},
"security": [
{
"bearer": []
},
{
"cookie": []
},
{
"api_key": []
}
],
"tags": [
"User"
]
}
},
"/user/info/{id}": {
"get": {
"operationId": "getUserById",
@ -8769,17 +8727,6 @@
],
"type": "object"
},
"UserCountResponseDto": {
"properties": {
"userCount": {
"type": "integer"
}
},
"required": [
"userCount"
],
"type": "object"
},
"UserResponseDto": {
"properties": {
"createdAt": {

View file

@ -1,4 +1,3 @@
export * from './create-profile-image.dto';
export * from './create-user.dto';
export * from './update-user.dto';
export * from './user-count.dto';

View file

@ -1,13 +0,0 @@
import { Transform } from 'class-transformer';
import { IsBoolean } from 'class-validator';
import { Optional } from '../../domain.util';
export class UserCountDto {
@IsBoolean()
@Optional()
@Transform(({ value }) => value === 'true')
/**
* When true, return the number of admins accounts
*/
admin?: boolean = false;
}

View file

@ -1,3 +1,2 @@
export * from './create-profile-image-response.dto';
export * from './user-count-response.dto';
export * from './user-response.dto';

View file

@ -1,12 +0,0 @@
import { ApiProperty } from '@nestjs/swagger';
export class UserCountResponseDto {
@ApiProperty({ type: 'integer' })
userCount!: number;
}
export function mapUserCountResponse(count: number): UserCountResponseDto {
return {
userCount: count,
};
}

View file

@ -220,24 +220,6 @@ describe(UserService.name, () => {
});
});
describe('getCount', () => {
it('should get the user count', async () => {
userMock.getList.mockResolvedValue([adminUser]);
const response = await sut.getCount({});
expect(userMock.getList).toHaveBeenCalled();
expect(response).toEqual({ userCount: 1 });
});
it('should get the user count of all admin users', async () => {
userMock.getList.mockResolvedValue([adminUser, immichUser]);
await expect(sut.getCount({ admin: true })).resolves.toEqual({ userCount: 1 });
expect(userMock.getList).toHaveBeenCalled();
});
});
describe('update', () => {
it('should update user', async () => {
const update: UpdateUserDto = {

View file

@ -14,15 +14,8 @@ import {
IUserRepository,
} from '../repositories';
import { StorageCore, StorageFolder } from '../storage';
import { CreateUserDto, UpdateUserDto, UserCountDto } from './dto';
import {
CreateProfileImageResponseDto,
UserCountResponseDto,
UserResponseDto,
mapCreateProfileImageResponse,
mapUser,
mapUserCountResponse,
} from './response-dto';
import { CreateUserDto, UpdateUserDto } from './dto';
import { CreateProfileImageResponseDto, UserResponseDto, mapCreateProfileImageResponse, mapUser } from './response-dto';
import { UserCore } from './user.core';
@Injectable()
@ -64,16 +57,6 @@ export class UserService {
return mapUser(user);
}
async getCount(dto: UserCountDto): Promise<UserCountResponseDto> {
let users = await this.userCore.getList();
if (dto.admin) {
users = users.filter((user) => user.isAdmin);
}
return mapUserCountResponse(users.length);
}
async create(createUserDto: CreateUserDto): Promise<UserResponseDto> {
const createdUser = await this.userCore.createUser(createUserDto);
return mapUser(createdUser);

View file

@ -1,11 +1,9 @@
import {
AuthUserDto,
UserCountDto as CountDto,
CreateUserDto as CreateDto,
CreateProfileImageDto,
CreateProfileImageResponseDto,
UpdateUserDto as UpdateDto,
UserCountResponseDto,
UserResponseDto,
UserService,
} from '@app/domain';
@ -59,12 +57,6 @@ export class UserController {
return this.service.create(createUserDto);
}
@AdminRoute()
@Get('count')
getUserCount(@Query() dto: CountDto): Promise<UserCountResponseDto> {
return this.service.getCount(dto);
}
@AdminRoute()
@Delete(':id')
deleteUser(@AuthUser() authUser: AuthUserDto, @Param() { id }: UUIDParamDto): Promise<UserResponseDto> {

View file

@ -312,32 +312,4 @@ describe(`${UserController.name}`, () => {
expect(before.updatedAt).not.toEqual(after.updatedAt);
});
});
describe('GET /user/count', () => {
it('should require authentication', async () => {
const { status, body } = await request(server).get(`/user/count`);
expect(status).toBe(401);
expect(body).toEqual(errorStub.unauthorized);
});
it('should start with just the admin', async () => {
const { status, body } = await request(server).get(`/user/count`).set('Authorization', `Bearer ${accessToken}`);
expect(status).toBe(200);
expect(body).toEqual({ userCount: 1 });
});
it('should return the total user count', async () => {
for (let i = 0; i < 5; i++) {
await api.userApi.create(server, accessToken, {
email: `user${i + 1}@immich.app`,
password: 'Password123',
firstName: `User ${i + 1}`,
lastName: 'Test',
});
}
const { status, body } = await request(server).get(`/user/count`).set('Authorization', `Bearer ${accessToken}`);
expect(status).toBe(200);
expect(body).toEqual({ userCount: 6 });
});
});
});

View file

@ -4210,19 +4210,6 @@ export interface UsageByUserDto {
*/
'videos': number;
}
/**
*
* @export
* @interface UserCountResponseDto
*/
export interface UserCountResponseDto {
/**
*
* @type {number}
* @memberof UserCountResponseDto
*/
'userCount': number;
}
/**
*
* @export
@ -15743,49 +15730,6 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
*
* @param {boolean} [admin]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getUserCount: async (admin?: boolean, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/user/count`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication cookie required
// authentication api_key required
await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration)
// authentication bearer required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
if (admin !== undefined) {
localVarQueryParameter['admin'] = admin;
}
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
@ -15960,16 +15904,6 @@ export const UserApiFp = function(configuration?: Configuration) {
const localVarAxiosArgs = await localVarAxiosParamCreator.getUserById(id, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
/**
*
* @param {boolean} [admin]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async getUserCount(admin?: boolean, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<UserCountResponseDto>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.getUserCount(admin, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
/**
*
* @param {string} id
@ -16062,15 +15996,6 @@ export const UserApiFactory = function (configuration?: Configuration, basePath?
getUserById(requestParameters: UserApiGetUserByIdRequest, options?: AxiosRequestConfig): AxiosPromise<UserResponseDto> {
return localVarFp.getUserById(requestParameters.id, options).then((request) => request(axios, basePath));
},
/**
*
* @param {UserApiGetUserCountRequest} requestParameters Request parameters.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getUserCount(requestParameters: UserApiGetUserCountRequest = {}, options?: AxiosRequestConfig): AxiosPromise<UserCountResponseDto> {
return localVarFp.getUserCount(requestParameters.admin, options).then((request) => request(axios, basePath));
},
/**
*
* @param {UserApiRestoreUserRequest} requestParameters Request parameters.
@ -16176,20 +16101,6 @@ export interface UserApiGetUserByIdRequest {
readonly id: string
}
/**
* Request parameters for getUserCount operation in UserApi.
* @export
* @interface UserApiGetUserCountRequest
*/
export interface UserApiGetUserCountRequest {
/**
*
* @type {boolean}
* @memberof UserApiGetUserCount
*/
readonly admin?: boolean
}
/**
* Request parameters for restoreUser operation in UserApi.
* @export
@ -16301,17 +16212,6 @@ export class UserApi extends BaseAPI {
return UserApiFp(this.configuration).getUserById(requestParameters.id, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @param {UserApiGetUserCountRequest} requestParameters Request parameters.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof UserApi
*/
public getUserCount(requestParameters: UserApiGetUserCountRequest = {}, options?: AxiosRequestConfig) {
return UserApiFp(this.configuration).getUserCount(requestParameters.admin, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @param {UserApiRestoreUserRequest} requestParameters Request parameters.