diff --git a/apps/server/src/infra/boards-client/boards-client.adapter.spec.ts b/apps/server/src/infra/boards-client/boards-client.adapter.spec.ts new file mode 100644 index 00000000000..c5a8230fb81 --- /dev/null +++ b/apps/server/src/infra/boards-client/boards-client.adapter.spec.ts @@ -0,0 +1,107 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { createMock } from '@golevelup/ts-jest'; +import { faker } from '@faker-js/faker'; +import { axiosResponseFactory } from '@testing/factory/axios-response.factory'; +import { BoardsClientAdapter } from './boards-client.adapter'; +import { BoardApi, BoardResponse, CreateBoardBodyParams, CreateBoardResponse } from './generated'; + +describe(BoardsClientAdapter.name, () => { + let module: TestingModule; + let sut: BoardsClientAdapter; + + const boardApiMock = createMock(); + + beforeAll(async () => { + module = await Test.createTestingModule({ + providers: [ + BoardsClientAdapter, + { + provide: BoardApi, + useValue: boardApiMock, + }, + ], + }).compile(); + sut = module.get(BoardsClientAdapter); + }); + + afterAll(async () => { + await module.close(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(sut).toBeDefined(); + }); + + describe('createBoard', () => { + describe('when creating a board', () => { + const setup = () => { + const params: CreateBoardBodyParams = { + title: faker.lorem.words(), + layout: 'columns', + parentId: faker.string.uuid(), + parentType: 'course', + }; + const responseData: CreateBoardResponse = { + id: faker.string.uuid(), + }; + + boardApiMock.boardControllerCreateBoard.mockResolvedValue(axiosResponseFactory.build({ data: responseData })); + + return { + params, + responseData, + }; + }; + + it('should call boardApi.boardControllerCreateBoard', async () => { + const { params, responseData } = setup(); + + const response = await sut.createBoard(params); + + expect(response).toEqual(responseData); + expect(boardApiMock.boardControllerCreateBoard).toHaveBeenCalledWith(params); + }); + }); + }); + + describe('getBoardSkeletonById', () => { + describe('when reading a board', () => { + const setup = () => { + const boardId = faker.string.uuid(); + const responseData: BoardResponse = { + id: boardId, + title: faker.lorem.words(), + layout: 'columns', + columns: [], + isVisible: true, + timestamps: { + createdAt: faker.date.recent().toISOString(), + lastUpdatedAt: faker.date.recent().toISOString(), + }, + }; + + boardApiMock.boardControllerGetBoardSkeleton.mockResolvedValue( + axiosResponseFactory.build({ data: responseData }) + ); + + return { + boardId, + responseData, + }; + }; + + it('should call boardApi.boardControllerGetBoardSkeleton', async () => { + const { boardId, responseData } = setup(); + + const response = await sut.getBoardSkeletonById(boardId); + + expect(response).toEqual(responseData); + expect(boardApiMock.boardControllerGetBoardSkeleton).toHaveBeenCalledWith(boardId); + }); + }); + }); +}); diff --git a/apps/server/src/infra/boards-client/boards-client.adapter.ts b/apps/server/src/infra/boards-client/boards-client.adapter.ts new file mode 100644 index 00000000000..3665f9b0bc7 --- /dev/null +++ b/apps/server/src/infra/boards-client/boards-client.adapter.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@nestjs/common'; +import { BoardApi, BoardResponse, CreateBoardBodyParams, CreateBoardResponse } from './generated'; + +@Injectable() +export class BoardsClientAdapter { + constructor(private readonly boardApi: BoardApi) {} + + public async createBoard(params: CreateBoardBodyParams): Promise { + const response = await this.boardApi.boardControllerCreateBoard(params); + + return response.data; + } + + public async getBoardSkeletonById(boardId: string): Promise { + const response = await this.boardApi.boardControllerGetBoardSkeleton(boardId); + + return response.data; + } +} diff --git a/apps/server/src/infra/boards-client/boards-client.config.ts b/apps/server/src/infra/boards-client/boards-client.config.ts new file mode 100644 index 00000000000..60de28e9889 --- /dev/null +++ b/apps/server/src/infra/boards-client/boards-client.config.ts @@ -0,0 +1,3 @@ +export interface BoardsClientConfig { + API_HOST: string; +} diff --git a/apps/server/src/infra/boards-client/boards-client.module.spec.ts b/apps/server/src/infra/boards-client/boards-client.module.spec.ts new file mode 100644 index 00000000000..996eda04346 --- /dev/null +++ b/apps/server/src/infra/boards-client/boards-client.module.spec.ts @@ -0,0 +1,60 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigModule } from '@nestjs/config'; +import { faker } from '@faker-js/faker'; +import { Request } from 'express'; +import { createMock } from '@golevelup/ts-jest'; +import { REQUEST } from '@nestjs/core'; +import { BoardsClientAdapter } from './boards-client.adapter'; +import { BoardsClientConfig } from './boards-client.config'; +import { BoardsClientModule } from './boards-client.module'; + +describe(BoardsClientModule.name, () => { + let module: TestingModule; + + const requestMock = createMock({ + headers: { + authorization: `Bearer ${faker.string.alphanumeric(42)}`, + }, + }); + + beforeEach(async () => { + module = await Test.createTestingModule({ + imports: [ + BoardsClientModule, + ConfigModule.forRoot({ + isGlobal: true, + load: [ + (): BoardsClientConfig => { + return { + API_HOST: faker.internet.url(), + }; + }, + ], + }), + ], + }) + .overrideProvider(REQUEST) + .useValue(requestMock) + .compile(); + }); + + afterAll(async () => { + await module.close(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(module).toBeDefined(); + }); + + describe('when resolving dependencies', () => { + it('should resolve BoardsClientAdapter', async () => { + const adapter = await module.resolve(BoardsClientAdapter); + + expect(adapter).toBeInstanceOf(BoardsClientAdapter); + }); + }); +}); diff --git a/apps/server/src/infra/boards-client/boards-client.module.ts b/apps/server/src/infra/boards-client/boards-client.module.ts new file mode 100644 index 00000000000..c373b5160f0 --- /dev/null +++ b/apps/server/src/infra/boards-client/boards-client.module.ts @@ -0,0 +1,31 @@ +import { Module, Scope } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { REQUEST } from '@nestjs/core'; +import { Request } from 'express'; +import { JwtExtractor } from '@shared/common/utils'; +import { BoardsClientAdapter } from './boards-client.adapter'; +import { BoardsClientConfig } from './boards-client.config'; +import { Configuration, BoardApi } from './generated'; + +@Module({ + providers: [ + BoardsClientAdapter, + { + provide: BoardApi, + scope: Scope.REQUEST, + useFactory: (configService: ConfigService, request: Request): BoardApi => { + const basePath = configService.getOrThrow('API_HOST'); + const accessToken = JwtExtractor.extractJwtFromRequest(request); + const configuration = new Configuration({ + basePath: `${basePath}/v3`, + accessToken, + }); + + return new BoardApi(configuration); + }, + inject: [ConfigService, REQUEST], + }, + ], + exports: [BoardsClientAdapter], +}) +export class BoardsClientModule {} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.gitignore b/apps/server/src/infra/boards-client/generated/.gitignore similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.gitignore rename to apps/server/src/infra/boards-client/generated/.gitignore diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.npmignore b/apps/server/src/infra/boards-client/generated/.npmignore similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.npmignore rename to apps/server/src/infra/boards-client/generated/.npmignore diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.openapi-generator-ignore b/apps/server/src/infra/boards-client/generated/.openapi-generator-ignore similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.openapi-generator-ignore rename to apps/server/src/infra/boards-client/generated/.openapi-generator-ignore diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.openapi-generator/FILES b/apps/server/src/infra/boards-client/generated/.openapi-generator/FILES similarity index 63% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.openapi-generator/FILES rename to apps/server/src/infra/boards-client/generated/.openapi-generator/FILES index dcd8a9a93e4..172bae4ab4e 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.openapi-generator/FILES +++ b/apps/server/src/infra/boards-client/generated/.openapi-generator/FILES @@ -1,24 +1,19 @@ -.gitignore -.npmignore -api.ts -api/board-api.ts -base.ts -common.ts -configuration.ts -git_push.sh -index.ts -models/api-validation-error.ts -models/board-context-response.ts -models/board-external-reference-type.ts -models/board-layout.ts -models/board-parent-type.ts -models/board-response.ts -models/card-skeleton-response.ts -models/column-response.ts -models/copy-api-response.ts -models/create-board-body-params.ts -models/create-board-response.ts -models/index.ts -models/timestamps-response.ts -models/update-board-title-params.ts -models/visibility-body-params.ts +.gitignore +.npmignore +.openapi-generator-ignore +api.ts +api/board-api.ts +base.ts +common.ts +configuration.ts +git_push.sh +index.ts +models/board-layout.ts +models/board-parent-type.ts +models/board-response.ts +models/card-skeleton-response.ts +models/column-response.ts +models/create-board-body-params.ts +models/create-board-response.ts +models/index.ts +models/timestamps-response.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api.ts b/apps/server/src/infra/boards-client/generated/api.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api.ts rename to apps/server/src/infra/boards-client/generated/api.ts diff --git a/apps/server/src/infra/boards-client/generated/api/board-api.ts b/apps/server/src/infra/boards-client/generated/api/board-api.ts new file mode 100644 index 00000000000..68d76b8a45e --- /dev/null +++ b/apps/server/src/infra/boards-client/generated/api/board-api.ts @@ -0,0 +1,244 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Schulcloud-Verbund-Software Server API + * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. + * + * The version of the OpenAPI document: 3.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import type { Configuration } from '../configuration'; +import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios'; +import globalAxios from 'axios'; +// Some imports not used depending on template conditions +// @ts-ignore +import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from '../common'; +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError, operationServerMap } from '../base'; +// @ts-ignore +import type { ApiValidationError } from '../models'; +// @ts-ignore +import type { BoardResponse } from '../models'; +// @ts-ignore +import type { CreateBoardBodyParams } from '../models'; +// @ts-ignore +import type { CreateBoardResponse } from '../models'; +/** + * BoardApi - axios parameter creator + * @export + */ +export const BoardApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Create a new board. + * @param {CreateBoardBodyParams} createBoardBodyParams + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + boardControllerCreateBoard: async (createBoardBodyParams: CreateBoardBodyParams, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'createBoardBodyParams' is not null or undefined + assertParamExists('boardControllerCreateBoard', 'createBoardBodyParams', createBoardBodyParams) + const localVarPath = `/boards`; + // 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: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(createBoardBodyParams, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get the skeleton of a a board. + * @param {string} boardId The id of the board. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + boardControllerGetBoardSkeleton: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'boardId' is not null or undefined + assertParamExists('boardControllerGetBoardSkeleton', 'boardId', boardId) + const localVarPath = `/boards/{boardId}` + .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); + // 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 bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * BoardApi - functional programming interface + * @export + */ +export const BoardApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = BoardApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Create a new board. + * @param {CreateBoardBodyParams} createBoardBodyParams + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerCreateBoard(createBoardBodyParams, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerCreateBoard']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * + * @summary Get the skeleton of a a board. + * @param {string} boardId The id of the board. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerGetBoardSkeleton(boardId, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerGetBoardSkeleton']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + } +}; + +/** + * BoardApi - factory interface + * @export + */ +export const BoardApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = BoardApiFp(configuration) + return { + /** + * + * @summary Create a new board. + * @param {CreateBoardBodyParams} createBoardBodyParams + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: any): AxiosPromise { + return localVarFp.boardControllerCreateBoard(createBoardBodyParams, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get the skeleton of a a board. + * @param {string} boardId The id of the board. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + boardControllerGetBoardSkeleton(boardId: string, options?: any): AxiosPromise { + return localVarFp.boardControllerGetBoardSkeleton(boardId, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * BoardApi - interface + * @export + * @interface BoardApi + */ +export interface BoardApiInterface { + /** + * + * @summary Create a new board. + * @param {CreateBoardBodyParams} createBoardBodyParams + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof BoardApiInterface + */ + boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * + * @summary Get the skeleton of a a board. + * @param {string} boardId The id of the board. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof BoardApiInterface + */ + boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; + +} + +/** + * BoardApi - object-oriented interface + * @export + * @class BoardApi + * @extends {BaseAPI} + */ +export class BoardApi extends BaseAPI implements BoardApiInterface { + /** + * + * @summary Create a new board. + * @param {CreateBoardBodyParams} createBoardBodyParams + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof BoardApi + */ + public boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig) { + return BoardApiFp(this.configuration).boardControllerCreateBoard(createBoardBodyParams, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get the skeleton of a a board. + * @param {string} boardId The id of the board. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof BoardApi + */ + public boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig) { + return BoardApiFp(this.configuration).boardControllerGetBoardSkeleton(boardId, options).then((request) => request(this.axios, this.basePath)); + } +} + diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/base.ts b/apps/server/src/infra/boards-client/generated/base.ts similarity index 95% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/base.ts rename to apps/server/src/infra/boards-client/generated/base.ts index 82686c7b81b..5bcf014a72f 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/base.ts +++ b/apps/server/src/infra/boards-client/generated/base.ts @@ -19,7 +19,7 @@ import type { Configuration } from './configuration'; import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios'; import globalAxios from 'axios'; -export const BASE_PATH = "http://localhost/api/v3".replace(/\/+$/, ""); +export const BASE_PATH = "http://localhost:3030/api/v3".replace(/\/+$/, ""); /** * diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/common.ts b/apps/server/src/infra/boards-client/generated/common.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/common.ts rename to apps/server/src/infra/boards-client/generated/common.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/configuration.ts b/apps/server/src/infra/boards-client/generated/configuration.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/configuration.ts rename to apps/server/src/infra/boards-client/generated/configuration.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/git_push.sh b/apps/server/src/infra/boards-client/generated/git_push.sh similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/git_push.sh rename to apps/server/src/infra/boards-client/generated/git_push.sh diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/index.ts b/apps/server/src/infra/boards-client/generated/index.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/index.ts rename to apps/server/src/infra/boards-client/generated/index.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-layout.ts b/apps/server/src/infra/boards-client/generated/models/board-layout.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-layout.ts rename to apps/server/src/infra/boards-client/generated/models/board-layout.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-parent-type.ts b/apps/server/src/infra/boards-client/generated/models/board-parent-type.ts similarity index 97% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-parent-type.ts rename to apps/server/src/infra/boards-client/generated/models/board-parent-type.ts index 3c8d64356bc..6193dd4737d 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-parent-type.ts +++ b/apps/server/src/infra/boards-client/generated/models/board-parent-type.ts @@ -22,6 +22,7 @@ export const BoardParentType = { COURSE: 'course', + ROOM: 'room', USER: 'user' } as const; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-response.ts b/apps/server/src/infra/boards-client/generated/models/board-response.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-response.ts rename to apps/server/src/infra/boards-client/generated/models/board-response.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/card-skeleton-response.ts b/apps/server/src/infra/boards-client/generated/models/card-skeleton-response.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/card-skeleton-response.ts rename to apps/server/src/infra/boards-client/generated/models/card-skeleton-response.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/column-response.ts b/apps/server/src/infra/boards-client/generated/models/column-response.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/column-response.ts rename to apps/server/src/infra/boards-client/generated/models/column-response.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/create-board-body-params.ts b/apps/server/src/infra/boards-client/generated/models/create-board-body-params.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/create-board-body-params.ts rename to apps/server/src/infra/boards-client/generated/models/create-board-body-params.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/create-board-response.ts b/apps/server/src/infra/boards-client/generated/models/create-board-response.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/create-board-response.ts rename to apps/server/src/infra/boards-client/generated/models/create-board-response.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/index.ts b/apps/server/src/infra/boards-client/generated/models/index.ts similarity index 54% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/index.ts rename to apps/server/src/infra/boards-client/generated/models/index.ts index 32513649aeb..0354f94654b 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/index.ts +++ b/apps/server/src/infra/boards-client/generated/models/index.ts @@ -1,14 +1,8 @@ -export * from './api-validation-error'; -export * from './board-context-response'; -export * from './board-external-reference-type'; export * from './board-layout'; export * from './board-parent-type'; export * from './board-response'; export * from './card-skeleton-response'; export * from './column-response'; -export * from './copy-api-response'; export * from './create-board-body-params'; export * from './create-board-response'; export * from './timestamps-response'; -export * from './update-board-title-params'; -export * from './visibility-body-params'; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/timestamps-response.ts b/apps/server/src/infra/boards-client/generated/models/timestamps-response.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/timestamps-response.ts rename to apps/server/src/infra/boards-client/generated/models/timestamps-response.ts diff --git a/apps/server/src/infra/boards-client/index.ts b/apps/server/src/infra/boards-client/index.ts new file mode 100644 index 00000000000..d98df00e1ed --- /dev/null +++ b/apps/server/src/infra/boards-client/index.ts @@ -0,0 +1,4 @@ +export { BoardsClientAdapter } from './boards-client.adapter'; +export { BoardsClientConfig } from './boards-client.config'; +export { BoardsClientModule } from './boards-client.module'; +export type * from './generated/models'; diff --git a/apps/server/src/infra/courses-client/courses-client.adapter.ts b/apps/server/src/infra/courses-client/courses-client.adapter.ts index 4628d93f2df..b862675fa79 100644 --- a/apps/server/src/infra/courses-client/courses-client.adapter.ts +++ b/apps/server/src/infra/courses-client/courses-client.adapter.ts @@ -1,5 +1,10 @@ import { Injectable } from '@nestjs/common'; -import { CourseCommonCartridgeMetadataResponse, CoursesApi, CreateCourseBodyParams } from './generated'; +import { + CourseCommonCartridgeMetadataResponse, + CoursesApi, + CreateCourseBodyParams, + CreateCourseResponse, +} from './generated'; @Injectable() export class CoursesClientAdapter { @@ -11,7 +16,9 @@ export class CoursesClientAdapter { return response.data; } - public async createCourse(params: CreateCourseBodyParams): Promise { - await this.coursesApi.courseControllerCreateCourse(params); + public async createCourse(params: CreateCourseBodyParams): Promise { + const response = await this.coursesApi.courseControllerCreateCourse(params); + + return response.data; } } diff --git a/apps/server/src/infra/courses-client/generated/.openapi-generator/FILES b/apps/server/src/infra/courses-client/generated/.openapi-generator/FILES index e10dec0e56c..6d8aa5a56df 100644 --- a/apps/server/src/infra/courses-client/generated/.openapi-generator/FILES +++ b/apps/server/src/infra/courses-client/generated/.openapi-generator/FILES @@ -10,4 +10,5 @@ git_push.sh index.ts models/course-common-cartridge-metadata-response.ts models/create-course-body-params.ts +models/create-course-response.ts models/index.ts diff --git a/apps/server/src/infra/courses-client/generated/api/courses-api.ts b/apps/server/src/infra/courses-client/generated/api/courses-api.ts index 9be58d522be..50ca3d76371 100644 --- a/apps/server/src/infra/courses-client/generated/api/courses-api.ts +++ b/apps/server/src/infra/courses-client/generated/api/courses-api.ts @@ -25,6 +25,8 @@ import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError import type { CourseCommonCartridgeMetadataResponse } from '../models'; // @ts-ignore import type { CreateCourseBodyParams } from '../models'; +// @ts-ignore +import type { CreateCourseResponse } from '../models'; /** * CoursesApi - axios parameter creator * @export @@ -126,7 +128,7 @@ export const CoursesApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + async courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { const localVarAxiosArgs = await localVarAxiosParamCreator.courseControllerCreateCourse(createCourseBodyParams, options); const localVarOperationServerIndex = configuration?.serverIndex ?? 0; const localVarOperationServerBasePath = operationServerMap['CoursesApi.courseControllerCreateCourse']?.[localVarOperationServerIndex]?.url; @@ -162,7 +164,7 @@ export const CoursesApiFactory = function (configuration?: Configuration, basePa * @param {*} [options] Override http request option. * @throws {RequiredError} */ - courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: any): AxiosPromise { + courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: any): AxiosPromise { return localVarFp.courseControllerCreateCourse(createCourseBodyParams, options).then((request) => request(axios, basePath)); }, /** @@ -192,7 +194,7 @@ export interface CoursesApiInterface { * @throws {RequiredError} * @memberof CoursesApiInterface */ - courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: RawAxiosRequestConfig): AxiosPromise; + courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: RawAxiosRequestConfig): AxiosPromise; /** * diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/update-board-title-params.ts b/apps/server/src/infra/courses-client/generated/models/create-course-response.ts similarity index 72% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/update-board-title-params.ts rename to apps/server/src/infra/courses-client/generated/models/create-course-response.ts index d5d90955c3e..bbffda32373 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/update-board-title-params.ts +++ b/apps/server/src/infra/courses-client/generated/models/create-course-response.ts @@ -17,14 +17,14 @@ /** * * @export - * @interface UpdateBoardTitleParams + * @interface CreateCourseResponse */ -export interface UpdateBoardTitleParams { +export interface CreateCourseResponse { /** - * + * The id of the created course * @type {string} - * @memberof UpdateBoardTitleParams + * @memberof CreateCourseResponse */ - 'title': string; + 'courseId': string; } diff --git a/apps/server/src/infra/courses-client/generated/models/index.ts b/apps/server/src/infra/courses-client/generated/models/index.ts index 3a4d2661a7c..0cc02a2c367 100644 --- a/apps/server/src/infra/courses-client/generated/models/index.ts +++ b/apps/server/src/infra/courses-client/generated/models/index.ts @@ -1,2 +1,3 @@ export * from './course-common-cartridge-metadata-response'; export * from './create-course-body-params'; +export * from './create-course-response'; diff --git a/apps/server/src/modules/board/controller/board.controller.ts b/apps/server/src/modules/board/controller/board.controller.ts index 8b40226a40c..3ed6fdf9c8c 100644 --- a/apps/server/src/modules/board/controller/board.controller.ts +++ b/apps/server/src/modules/board/controller/board.controller.ts @@ -41,7 +41,7 @@ export class BoardController { @ApiResponse({ status: 403, type: ForbiddenException }) @ApiResponse({ status: 404, type: NotFoundException }) @Post() - async createBoard( + public async createBoard( @Body() bodyParams: CreateBoardBodyParams, @CurrentUser() currentUser: ICurrentUser ): Promise { @@ -58,7 +58,7 @@ export class BoardController { @ApiResponse({ status: 403, type: ForbiddenException }) @ApiResponse({ status: 404, type: NotFoundException }) @Get(':boardId') - async getBoardSkeleton( + public async getBoardSkeleton( @Param() urlParams: BoardUrlParams, @CurrentUser() currentUser: ICurrentUser ): Promise { @@ -75,7 +75,7 @@ export class BoardController { @ApiResponse({ status: 403, type: ForbiddenException }) @ApiResponse({ status: 404, type: NotFoundException }) @Get(':boardId/context') - async getBoardContext( + public async getBoardContext( @Param() urlParams: BoardUrlParams, @CurrentUser() currentUser: ICurrentUser ): Promise { @@ -93,7 +93,7 @@ export class BoardController { @ApiResponse({ status: 404, type: NotFoundException }) @HttpCode(204) @Patch(':boardId/title') - async updateBoardTitle( + public async updateBoardTitle( @Param() urlParams: BoardUrlParams, @Body() bodyParams: UpdateBoardTitleParams, @CurrentUser() currentUser: ICurrentUser @@ -108,7 +108,10 @@ export class BoardController { @ApiResponse({ status: 404, type: NotFoundException }) @HttpCode(204) @Delete(':boardId') - async deleteBoard(@Param() urlParams: BoardUrlParams, @CurrentUser() currentUser: ICurrentUser): Promise { + public async deleteBoard( + @Param() urlParams: BoardUrlParams, + @CurrentUser() currentUser: ICurrentUser + ): Promise { await this.boardUc.deleteBoard(currentUser.userId, urlParams.boardId); } @@ -118,7 +121,7 @@ export class BoardController { @ApiResponse({ status: 403, type: ForbiddenException }) @ApiResponse({ status: 404, type: NotFoundException }) @Post(':boardId/columns') - async createColumn( + public async createColumn( @Param() urlParams: BoardUrlParams, @CurrentUser() currentUser: ICurrentUser ): Promise { @@ -136,7 +139,7 @@ export class BoardController { @ApiResponse({ status: 404, type: NotFoundException }) @Post(':boardId/copy') @RequestTimeout('INCOMING_REQUEST_TIMEOUT_COPY_API') - async copyBoard( + public async copyBoard( @Param() urlParams: BoardUrlParams, @CurrentUser() currentUser: ICurrentUser ): Promise { @@ -152,11 +155,11 @@ export class BoardController { @ApiResponse({ status: 404, type: NotFoundException }) @HttpCode(204) @Patch(':boardId/visibility') - async updateVisibility( + public async updateVisibility( @Param() urlParams: BoardUrlParams, @Body() bodyParams: VisibilityBodyParams, @CurrentUser() currentUser: ICurrentUser - ) { + ): Promise { await this.boardUc.updateVisibility(currentUser.userId, urlParams.boardId, bodyParams.isVisible); } diff --git a/apps/server/src/modules/board/controller/dto/board/create-board.body.params.ts b/apps/server/src/modules/board/controller/dto/board/create-board.body.params.ts index 8c59f934c45..546e69a64fe 100644 --- a/apps/server/src/modules/board/controller/dto/board/create-board.body.params.ts +++ b/apps/server/src/modules/board/controller/dto/board/create-board.body.params.ts @@ -11,14 +11,14 @@ export class CreateBoardBodyParams { @MinLength(1) @MaxLength(100) @SanitizeHtml() - title!: string; + public title!: string; @IsMongoId() @ApiProperty({ description: 'The id of the parent', required: true, }) - parentId!: string; + public parentId!: string; @ApiProperty({ description: 'The type of the parent', @@ -27,7 +27,7 @@ export class CreateBoardBodyParams { enumName: 'BoardParentType', }) @IsEnum(BoardExternalReferenceType) - parentType!: BoardExternalReferenceType; + public parentType!: BoardExternalReferenceType; @ApiProperty({ description: 'The layout of the board', @@ -37,5 +37,5 @@ export class CreateBoardBodyParams { }) @IsEnum(BoardLayout, {}) @NotEquals(BoardLayout[BoardLayout.GRID]) - layout!: BoardLayout; + public layout!: BoardLayout; } diff --git a/apps/server/src/modules/board/service/column-board.service.spec.ts b/apps/server/src/modules/board/service/column-board.service.spec.ts index 64d59057a75..5a7e49021cc 100644 --- a/apps/server/src/modules/board/service/column-board.service.spec.ts +++ b/apps/server/src/modules/board/service/column-board.service.spec.ts @@ -4,7 +4,7 @@ import { StorageLocation } from '@modules/files-storage/interface'; import { Test, TestingModule } from '@nestjs/testing'; import { EntityId } from '@shared/domain/types'; import { CopyElementType, CopyStatus, CopyStatusEnum } from '../../copy-helper'; -import { BoardExternalReference, BoardExternalReferenceType, ColumnBoard } from '../domain'; +import { BoardExternalReference, BoardExternalReferenceType, ColumnBoard, ColumnBoardProps } from '../domain'; import { BoardNodeRepo } from '../repo'; import { columnBoardFactory } from '../testing'; import { BoardNodeService } from './board-node.service'; @@ -131,4 +131,24 @@ describe('ColumnBoardService', () => { expect(result).toEqual(columnBoard); }); + + describe('createColumnBoard', () => { + describe('when creating new ColumnBoard', () => { + const setup = () => { + const columnBoard = columnBoardFactory.build() as unknown as ColumnBoardProps; + + repo.save.mockResolvedValue(); + + return { columnBoard }; + }; + + it('should call BoardNodeRepo', async () => { + const { columnBoard } = setup(); + + await service.createColumnBoard(columnBoard); + + expect(repo.save).toHaveBeenCalledTimes(1); + }); + }); + }); }); diff --git a/apps/server/src/modules/board/service/column-board.service.ts b/apps/server/src/modules/board/service/column-board.service.ts index d468adf595e..18803c51518 100644 --- a/apps/server/src/modules/board/service/column-board.service.ts +++ b/apps/server/src/modules/board/service/column-board.service.ts @@ -6,6 +6,7 @@ import { BoardExternalReference, BoardExternalReferenceType, ColumnBoard, + ColumnBoardProps, isColumnBoard, } from '../domain'; import { BoardNodeRepo } from '../repo'; @@ -21,13 +22,13 @@ export class ColumnBoardService { private readonly columnBoardLinkService: ColumnBoardLinkService ) {} - async findById(id: EntityId, depth?: number): Promise { - const columnBoard = this.boardNodeService.findByClassAndId(ColumnBoard, id, depth); + public async findById(id: EntityId, depth?: number): Promise { + const columnBoard = await this.boardNodeService.findByClassAndId(ColumnBoard, id, depth); return columnBoard; } - async findByExternalReference(reference: BoardExternalReference, depth?: number): Promise { + public async findByExternalReference(reference: BoardExternalReference, depth?: number): Promise { const boardNodes: AnyBoardNode[] = await this.boardNodeRepo.findByExternalReference(reference, depth); const boards: ColumnBoard[] = boardNodes.filter((bn: AnyBoardNode): bn is ColumnBoard => isColumnBoard(bn)); @@ -35,13 +36,13 @@ export class ColumnBoardService { return boards; } - async updateVisibility(columnBoard: ColumnBoard, visibility: boolean): Promise { + public async updateVisibility(columnBoard: ColumnBoard, visibility: boolean): Promise { await this.boardNodeService.updateVisibility(columnBoard, visibility); } // called from feathers // TODO remove when not needed anymore - async deleteByCourseId(courseId: EntityId): Promise { + public async deleteByCourseId(courseId: EntityId): Promise { const boardNodes = await this.findByExternalReference({ type: BoardExternalReferenceType.Course, id: courseId, @@ -50,15 +51,23 @@ export class ColumnBoardService { await this.boardNodeRepo.delete(boardNodes); } - async copyColumnBoard(params: CopyColumnBoardParams): Promise { + public async copyColumnBoard(params: CopyColumnBoardParams): Promise { const copyStatus = await this.columnBoardCopyService.copyColumnBoard(params); return copyStatus; } - async swapLinkedIds(boardId: EntityId, idMap: Map): Promise { + public async swapLinkedIds(boardId: EntityId, idMap: Map): Promise { const board = await this.columnBoardLinkService.swapLinkedIds(boardId, idMap); return board; } + + public async createColumnBoard(props: ColumnBoardProps): Promise { + const columnBoard = new ColumnBoard(props); + + await this.boardNodeRepo.save(columnBoard); + + return columnBoard; + } } diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api/board-api.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api/board-api.ts deleted file mode 100644 index 72900986b52..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api/board-api.ts +++ /dev/null @@ -1,772 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - -import type { Configuration } from '../configuration'; -import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios'; -import globalAxios from 'axios'; -// Some imports not used depending on template conditions -// @ts-ignore -import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from '../common'; -// @ts-ignore -import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError, operationServerMap } from '../base'; -// @ts-ignore -import type { ApiValidationError } from '../models'; -// @ts-ignore -import type { BoardContextResponse } from '../models'; -// @ts-ignore -import type { BoardResponse } from '../models'; -// @ts-ignore -import type { ColumnResponse } from '../models'; -// @ts-ignore -import type { CopyApiResponse } from '../models'; -// @ts-ignore -import type { CreateBoardBodyParams } from '../models'; -// @ts-ignore -import type { CreateBoardResponse } from '../models'; -// @ts-ignore -import type { UpdateBoardTitleParams } from '../models'; -// @ts-ignore -import type { VisibilityBodyParams } from '../models'; -/** - * BoardApi - axios parameter creator - * @export - */ -export const BoardApiAxiosParamCreator = function (configuration?: Configuration) { - return { - /** - * - * @summary Create a board copy. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCopyBoard: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerCopyBoard', 'boardId', boardId) - const localVarPath = `/boards/{boardId}/copy` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // 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: 'POST', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Create a new board. - * @param {CreateBoardBodyParams} createBoardBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCreateBoard: async (createBoardBodyParams: CreateBoardBodyParams, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'createBoardBodyParams' is not null or undefined - assertParamExists('boardControllerCreateBoard', 'createBoardBodyParams', createBoardBodyParams) - const localVarPath = `/boards`; - // 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: 'POST', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(createBoardBodyParams, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Create a new column on a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCreateColumn: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerCreateColumn', 'boardId', boardId) - const localVarPath = `/boards/{boardId}/columns` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // 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: 'POST', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Delete a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerDeleteBoard: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerDeleteBoard', 'boardId', boardId) - const localVarPath = `/boards/{boardId}` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // 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: 'DELETE', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Get the context of a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerGetBoardContext: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerGetBoardContext', 'boardId', boardId) - const localVarPath = `/boards/{boardId}/context` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // 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 bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Get the skeleton of a a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerGetBoardSkeleton: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerGetBoardSkeleton', 'boardId', boardId) - const localVarPath = `/boards/{boardId}` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // 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 bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Update the title of a board. - * @param {string} boardId The id of the board. - * @param {UpdateBoardTitleParams} updateBoardTitleParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerUpdateBoardTitle: async (boardId: string, updateBoardTitleParams: UpdateBoardTitleParams, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerUpdateBoardTitle', 'boardId', boardId) - // verify required parameter 'updateBoardTitleParams' is not null or undefined - assertParamExists('boardControllerUpdateBoardTitle', 'updateBoardTitleParams', updateBoardTitleParams) - const localVarPath = `/boards/{boardId}/title` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // 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: 'PATCH', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(updateBoardTitleParams, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Update the visibility of a board. - * @param {string} boardId The id of the board. - * @param {VisibilityBodyParams} visibilityBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerUpdateVisibility: async (boardId: string, visibilityBodyParams: VisibilityBodyParams, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerUpdateVisibility', 'boardId', boardId) - // verify required parameter 'visibilityBodyParams' is not null or undefined - assertParamExists('boardControllerUpdateVisibility', 'visibilityBodyParams', visibilityBodyParams) - const localVarPath = `/boards/{boardId}/visibility` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // 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: 'PATCH', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(visibilityBodyParams, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - } -}; - -/** - * BoardApi - functional programming interface - * @export - */ -export const BoardApiFp = function(configuration?: Configuration) { - const localVarAxiosParamCreator = BoardApiAxiosParamCreator(configuration) - return { - /** - * - * @summary Create a board copy. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerCopyBoard(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerCopyBoard(boardId, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerCopyBoard']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Create a new board. - * @param {CreateBoardBodyParams} createBoardBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerCreateBoard(createBoardBodyParams, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerCreateBoard']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Create a new column on a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerCreateColumn(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerCreateColumn(boardId, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerCreateColumn']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Delete a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerDeleteBoard(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerDeleteBoard(boardId, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerDeleteBoard']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Get the context of a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerGetBoardContext(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerGetBoardContext(boardId, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerGetBoardContext']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Get the skeleton of a a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerGetBoardSkeleton(boardId, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerGetBoardSkeleton']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Update the title of a board. - * @param {string} boardId The id of the board. - * @param {UpdateBoardTitleParams} updateBoardTitleParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerUpdateBoardTitle(boardId: string, updateBoardTitleParams: UpdateBoardTitleParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerUpdateBoardTitle(boardId, updateBoardTitleParams, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerUpdateBoardTitle']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Update the visibility of a board. - * @param {string} boardId The id of the board. - * @param {VisibilityBodyParams} visibilityBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerUpdateVisibility(boardId: string, visibilityBodyParams: VisibilityBodyParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerUpdateVisibility(boardId, visibilityBodyParams, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerUpdateVisibility']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - } -}; - -/** - * BoardApi - factory interface - * @export - */ -export const BoardApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { - const localVarFp = BoardApiFp(configuration) - return { - /** - * - * @summary Create a board copy. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCopyBoard(boardId: string, options?: any): AxiosPromise { - return localVarFp.boardControllerCopyBoard(boardId, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Create a new board. - * @param {CreateBoardBodyParams} createBoardBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: any): AxiosPromise { - return localVarFp.boardControllerCreateBoard(createBoardBodyParams, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Create a new column on a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCreateColumn(boardId: string, options?: any): AxiosPromise { - return localVarFp.boardControllerCreateColumn(boardId, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Delete a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerDeleteBoard(boardId: string, options?: any): AxiosPromise { - return localVarFp.boardControllerDeleteBoard(boardId, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Get the context of a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerGetBoardContext(boardId: string, options?: any): AxiosPromise { - return localVarFp.boardControllerGetBoardContext(boardId, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Get the skeleton of a a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerGetBoardSkeleton(boardId: string, options?: any): AxiosPromise { - return localVarFp.boardControllerGetBoardSkeleton(boardId, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Update the title of a board. - * @param {string} boardId The id of the board. - * @param {UpdateBoardTitleParams} updateBoardTitleParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerUpdateBoardTitle(boardId: string, updateBoardTitleParams: UpdateBoardTitleParams, options?: any): AxiosPromise { - return localVarFp.boardControllerUpdateBoardTitle(boardId, updateBoardTitleParams, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Update the visibility of a board. - * @param {string} boardId The id of the board. - * @param {VisibilityBodyParams} visibilityBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerUpdateVisibility(boardId: string, visibilityBodyParams: VisibilityBodyParams, options?: any): AxiosPromise { - return localVarFp.boardControllerUpdateVisibility(boardId, visibilityBodyParams, options).then((request) => request(axios, basePath)); - }, - }; -}; - -/** - * BoardApi - interface - * @export - * @interface BoardApi - */ -export interface BoardApiInterface { - /** - * - * @summary Create a board copy. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerCopyBoard(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Create a new board. - * @param {CreateBoardBodyParams} createBoardBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Create a new column on a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerCreateColumn(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Delete a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerDeleteBoard(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Get the context of a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerGetBoardContext(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Get the skeleton of a a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Update the title of a board. - * @param {string} boardId The id of the board. - * @param {UpdateBoardTitleParams} updateBoardTitleParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerUpdateBoardTitle(boardId: string, updateBoardTitleParams: UpdateBoardTitleParams, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Update the visibility of a board. - * @param {string} boardId The id of the board. - * @param {VisibilityBodyParams} visibilityBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerUpdateVisibility(boardId: string, visibilityBodyParams: VisibilityBodyParams, options?: RawAxiosRequestConfig): AxiosPromise; - -} - -/** - * BoardApi - object-oriented interface - * @export - * @class BoardApi - * @extends {BaseAPI} - */ -export class BoardApi extends BaseAPI implements BoardApiInterface { - /** - * - * @summary Create a board copy. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerCopyBoard(boardId: string, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerCopyBoard(boardId, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Create a new board. - * @param {CreateBoardBodyParams} createBoardBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerCreateBoard(createBoardBodyParams, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Create a new column on a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerCreateColumn(boardId: string, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerCreateColumn(boardId, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Delete a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerDeleteBoard(boardId: string, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerDeleteBoard(boardId, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Get the context of a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerGetBoardContext(boardId: string, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerGetBoardContext(boardId, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Get the skeleton of a a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerGetBoardSkeleton(boardId, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Update the title of a board. - * @param {string} boardId The id of the board. - * @param {UpdateBoardTitleParams} updateBoardTitleParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerUpdateBoardTitle(boardId: string, updateBoardTitleParams: UpdateBoardTitleParams, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerUpdateBoardTitle(boardId, updateBoardTitleParams, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Update the visibility of a board. - * @param {string} boardId The id of the board. - * @param {VisibilityBodyParams} visibilityBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerUpdateVisibility(boardId: string, visibilityBodyParams: VisibilityBodyParams, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerUpdateVisibility(boardId, visibilityBodyParams, options).then((request) => request(this.axios, this.basePath)); - } -} - diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/api-validation-error.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/api-validation-error.ts deleted file mode 100644 index 3f49cf86f0d..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/api-validation-error.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - - -/** - * - * @export - * @interface ApiValidationError - */ -export interface ApiValidationError { - /** - * The response status code. - * @type {number} - * @memberof ApiValidationError - */ - 'code': number; - /** - * The error type. - * @type {string} - * @memberof ApiValidationError - */ - 'type': string; - /** - * The error title. - * @type {string} - * @memberof ApiValidationError - */ - 'title': string; - /** - * The error message. - * @type {string} - * @memberof ApiValidationError - */ - 'message': string; - /** - * The error details. - * @type {object} - * @memberof ApiValidationError - */ - 'details'?: object; -} - diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-context-response.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-context-response.ts deleted file mode 100644 index e2c9b1b0a19..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-context-response.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - -// May contain unused imports in some cases -// @ts-ignore -import type { BoardExternalReferenceType } from './board-external-reference-type'; - -/** - * - * @export - * @interface BoardContextResponse - */ -export interface BoardContextResponse { - /** - * - * @type {string} - * @memberof BoardContextResponse - */ - 'id': string; - /** - * - * @type {BoardExternalReferenceType} - * @memberof BoardContextResponse - */ - 'type': BoardExternalReferenceType; -} - - - diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-external-reference-type.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-external-reference-type.ts deleted file mode 100644 index 5510db52c19..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-external-reference-type.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - - -/** - * - * @export - * @enum {string} - */ - -export const BoardExternalReferenceType = { - COURSE: 'course', - USER: 'user' -} as const; - -export type BoardExternalReferenceType = typeof BoardExternalReferenceType[keyof typeof BoardExternalReferenceType]; - - - diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/copy-api-response.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/copy-api-response.ts deleted file mode 100644 index 3c78d846edc..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/copy-api-response.ts +++ /dev/null @@ -1,110 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -/** - * - * @export - * @interface CopyApiResponse - */ -export interface CopyApiResponse { - /** - * Id of copied element - * @type {string} - * @memberof CopyApiResponse - */ - id?: string; - /** - * Title of copied element - * @type {string} - * @memberof CopyApiResponse - */ - title?: string; - /** - * Type of copied element - * @type {string} - * @memberof CopyApiResponse - */ - type: CopyApiResponseType; - /** - * Id of destination parent reference - * @type {string} - * @memberof CopyApiResponse - */ - destinationId?: string; - /** - * Copy progress status of copied element - * @type {string} - * @memberof CopyApiResponse - */ - status: CopyApiResponseStatus; - /** - * List of included sub elements with recursive type structure - * @type {Array} - * @memberof CopyApiResponse - */ - elements?: Array; -} - -export const CopyApiResponseType = { - BOARD: 'BOARD', - CARD: 'CARD', - COLLABORATIVE_TEXT_EDITOR_ELEMENT: 'COLLABORATIVE_TEXT_EDITOR_ELEMENT', - COLUMN: 'COLUMN', - COLUMNBOARD: 'COLUMNBOARD', - CONTENT: 'CONTENT', - COURSE: 'COURSE', - COURSEGROUP_GROUP: 'COURSEGROUP_GROUP', - EXTERNAL_TOOL: 'EXTERNAL_TOOL', - EXTERNAL_TOOL_ELEMENT: 'EXTERNAL_TOOL_ELEMENT', - FILE: 'FILE', - FILE_ELEMENT: 'FILE_ELEMENT', - DRAWING_ELEMENT: 'DRAWING_ELEMENT', - FILE_GROUP: 'FILE_GROUP', - LEAF: 'LEAF', - LESSON: 'LESSON', - LESSON_CONTENT_ETHERPAD: 'LESSON_CONTENT_ETHERPAD', - LESSON_CONTENT_GEOGEBRA: 'LESSON_CONTENT_GEOGEBRA', - LESSON_CONTENT_GROUP: 'LESSON_CONTENT_GROUP', - LESSON_CONTENT_LERNSTORE: 'LESSON_CONTENT_LERNSTORE', - LESSON_CONTENT_NEXBOARD: 'LESSON_CONTENT_NEXBOARD', - LESSON_CONTENT_TASK: 'LESSON_CONTENT_TASK', - LESSON_CONTENT_TEXT: 'LESSON_CONTENT_TEXT', - LERNSTORE_MATERIAL: 'LERNSTORE_MATERIAL', - LERNSTORE_MATERIAL_GROUP: 'LERNSTORE_MATERIAL_GROUP', - LINK_ELEMENT: 'LINK_ELEMENT', - LTITOOL_GROUP: 'LTITOOL_GROUP', - MEDIA_BOARD: 'MEDIA_BOARD', - MEDIA_LINE: 'MEDIA_LINE', - MEDIA_EXTERNAL_TOOL_ELEMENT: 'MEDIA_EXTERNAL_TOOL_ELEMENT', - METADATA: 'METADATA', - RICHTEXT_ELEMENT: 'RICHTEXT_ELEMENT', - SUBMISSION_CONTAINER_ELEMENT: 'SUBMISSION_CONTAINER_ELEMENT', - SUBMISSION_ITEM: 'SUBMISSION_ITEM', - SUBMISSION_GROUP: 'SUBMISSION_GROUP', - TASK: 'TASK', - TASK_GROUP: 'TASK_GROUP', - TIME_GROUP: 'TIME_GROUP', - USER_GROUP: 'USER_GROUP', -} as const; - -export type CopyApiResponseType = typeof CopyApiResponseType[keyof typeof CopyApiResponseType]; -export const CopyApiResponseStatus = { - SUCCESS: 'success', - FAILURE: 'failure', - NOT_DOING: 'not-doing', - NOT_IMPLEMENTED: 'not-implemented', - PARTIAL: 'partial', -} as const; - -export type CopyApiResponseStatus = typeof CopyApiResponseStatus[keyof typeof CopyApiResponseStatus]; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/visibility-body-params.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/visibility-body-params.ts deleted file mode 100644 index 46cf8306234..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/visibility-body-params.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - - -/** - * - * @export - * @interface VisibilityBodyParams - */ -export interface VisibilityBodyParams { - /** - * - * @type {boolean} - * @memberof VisibilityBodyParams - */ - 'isVisible': boolean; -} - diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.spec.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.spec.ts deleted file mode 100644 index 8dacf504e49..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.spec.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { faker } from '@faker-js/faker'; -import { createMock, DeepMocked } from '@golevelup/ts-jest'; -import { UnauthorizedException } from '@nestjs/common'; -import { REQUEST } from '@nestjs/core'; -import { Test, TestingModule } from '@nestjs/testing'; -import { AxiosResponse } from 'axios'; -import { Request } from 'express'; -import { BoardApi, BoardResponse } from './board-api-client'; -import { BoardClientAdapter } from './board-client.adapter'; - -const jwtToken = 'someJwtToken'; - -describe(BoardClientAdapter.name, () => { - let module: TestingModule; - let sut: BoardClientAdapter; - let boardApiMock: DeepMocked; - - beforeAll(async () => { - module = await Test.createTestingModule({ - providers: [ - BoardClientAdapter, - { - provide: BoardApi, - useValue: createMock(), - }, - { - provide: REQUEST, - useValue: createMock({ - headers: { - authorization: `Bearer ${jwtToken}`, - }, - }), - }, - ], - }).compile(); - - sut = module.get(BoardClientAdapter); - boardApiMock = module.get(BoardApi); - }); - - afterAll(async () => { - await module.close(); - }); - - afterEach(() => { - jest.resetAllMocks(); - }); - - it('should be defined', () => { - expect(sut).toBeDefined(); - }); - - describe('getBoardSkeletonById', () => { - describe('When getBoardSkeletonById is called', () => { - const setup = () => { - const response = createMock>({ - data: { - id: faker.string.uuid(), - title: faker.lorem.sentence(), - columns: [], - isVisible: true, - layout: 'layout', - timestamps: { - createdAt: faker.date.past().toString(), - lastUpdatedAt: faker.date.recent().toString(), - }, - }, - }); - - boardApiMock.boardControllerGetBoardSkeleton.mockResolvedValue(response); - - return { boardId: response.data.id }; - }; - - it('it should return a board skeleton dto', async () => { - const { boardId } = setup(); - - await sut.getBoardSkeletonById(boardId); - - expect(boardApiMock.boardControllerGetBoardSkeleton).toHaveBeenCalled(); - }); - }); - - describe('When no JWT token is found', () => { - const setup = () => { - const boardId = faker.string.uuid(); - const request = createMock({ - headers: {}, - }); - - const adapter: BoardClientAdapter = new BoardClientAdapter(boardApiMock, request); - - return { boardId, adapter }; - }; - - it('should throw an UnauthorizedError', async () => { - const { boardId, adapter } = setup(); - - await expect(adapter.getBoardSkeletonById(boardId)).rejects.toThrowError(UnauthorizedException); - }); - }); - }); -}); diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.ts deleted file mode 100644 index b2b48e2d331..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Inject, Injectable, UnauthorizedException } from '@nestjs/common'; -import { REQUEST } from '@nestjs/core'; -import { extractJwtFromHeader } from '@shared/common/utils'; -import { RawAxiosRequestConfig } from 'axios'; -import { Request } from 'express'; -import { BoardApi } from './board-api-client'; -import { BoardSkeletonDto } from './dto'; -import { BoardSkeletonDtoMapper } from './mapper'; - -@Injectable() -export class BoardClientAdapter { - constructor(private readonly boardApi: BoardApi, @Inject(REQUEST) private request: Request) {} - - public async getBoardSkeletonById(boardId: string): Promise { - const options = this.createOptionParams(); - const boardResponse = await this.boardApi - .boardControllerGetBoardSkeleton(boardId, options) - .then((response) => response.data); - - const boardSkeletonDto = BoardSkeletonDtoMapper.mapToBoardSkeletonDto(boardResponse); - - return boardSkeletonDto; - } - - private createOptionParams(): RawAxiosRequestConfig { - const jwt = this.getJwt(); - const options: RawAxiosRequestConfig = { headers: { authorization: `Bearer ${jwt}` } }; - - return options; - } - - private getJwt(): string { - const jwt = extractJwtFromHeader(this.request) ?? this.request.headers.authorization; - - if (!jwt) { - throw new UnauthorizedException('No JWT found in request'); - } - - return jwt; - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.config.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.config.ts deleted file mode 100644 index ba6d1e4ad52..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ConfigurationParameters } from './board-api-client'; - -export interface BoardClientConfig extends ConfigurationParameters { - basePath: string; -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.spec.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.spec.ts deleted file mode 100644 index b46d574e0f8..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { BoardClientModule } from './board-client.module'; -import { BoardClientAdapter } from './board-client.adapter'; - -describe('BoardClientModule', () => { - let module: TestingModule; - - beforeAll(async () => { - module = await Test.createTestingModule({ - imports: [ - BoardClientModule.register({ - basePath: 'http://localhost:3030/api/v3', - }), - ], - }).compile(); - }); - - afterAll(async () => { - await module.close(); - }); - - describe('when module is initialized', () => { - it('should have the BoardClientAdapter defined', () => { - const boardClientAdapter = module.get(BoardClientAdapter); - expect(boardClientAdapter).toBeDefined(); - }); - }); -}); diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.ts deleted file mode 100644 index 3ad0125843d..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { DynamicModule, Module } from '@nestjs/common'; -import { BoardClientAdapter } from './board-client.adapter'; -import { BoardApi, Configuration } from './board-api-client'; -import { BoardClientConfig } from './board-client.config'; - -@Module({}) -export class BoardClientModule { - static register(config: BoardClientConfig): DynamicModule { - const providers = [ - BoardClientAdapter, - { - provide: BoardApi, - useFactory: () => { - const configuration = new Configuration(config); - return new BoardApi(configuration); - }, - }, - ]; - - return { - module: BoardClientModule, - providers, - exports: [BoardClientAdapter], - }; - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/board-skeleton.dto.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/board-skeleton.dto.ts deleted file mode 100644 index 144ac8e4786..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/board-skeleton.dto.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ColumnSkeletonDto } from './column-skeleton.dto'; - -export class BoardSkeletonDto { - boardId: string; - - title: string; - - columns: ColumnSkeletonDto[]; - - isVisible: boolean; - - layout: string; - - constructor(props: BoardSkeletonDto) { - this.boardId = props.boardId; - this.title = props.title; - this.columns = props.columns; - this.isVisible = props.isVisible; - this.layout = props.layout; - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/card-skeleton.dto.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/card-skeleton.dto.ts deleted file mode 100644 index fe50f01386f..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/card-skeleton.dto.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class CardSkeletonDto { - cardId: string; - - height: number; - - constructor(props: CardSkeletonDto) { - this.cardId = props.cardId; - this.height = props.height; - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/column-skeleton.dto.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/column-skeleton.dto.ts deleted file mode 100644 index 01aeb8a9d29..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/column-skeleton.dto.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CardSkeletonDto } from './card-skeleton.dto'; - -export class ColumnSkeletonDto { - public columnId: string; - - public title: string; - - public cards: CardSkeletonDto[]; - - constructor(props: ColumnSkeletonDto) { - this.columnId = props.columnId; - this.title = props.title; - this.cards = props.cards; - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/index.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/index.ts deleted file mode 100644 index 58a91c50d68..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { BoardSkeletonDto } from './board-skeleton.dto'; -export { ColumnSkeletonDto } from './column-skeleton.dto'; -export { CardSkeletonDto } from './card-skeleton.dto'; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/index.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/index.ts deleted file mode 100644 index 4347b129920..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { BoardClientModule } from './board-client.module'; -export { BoardClientConfig } from './board-client.config'; -export { BoardClientAdapter } from './board-client.adapter'; -export * from './dto'; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.spec.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.spec.ts deleted file mode 100644 index ee1d26fa583..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { faker } from '@faker-js/faker'; -import { BoardResponse, CardSkeletonResponse, ColumnResponse } from '../board-api-client'; -import { BoardSkeletonDtoMapper } from './board-skeleton-response.mapper'; - -describe('BoardSkeletonDtoMapper', () => { - describe('mapToBoardSkeletonDto', () => { - describe('when mapping to BoardResponse', () => { - const setup = () => { - const cardResponse: CardSkeletonResponse = { - cardId: faker.string.uuid(), - height: faker.number.int(), - }; - - const columnResponse: ColumnResponse = { - id: faker.string.uuid(), - title: faker.lorem.sentence(), - cards: [cardResponse], - timestamps: { - createdAt: faker.date.past().toString(), - lastUpdatedAt: faker.date.recent().toString(), - }, - }; - - const boardResponse: BoardResponse = { - id: faker.string.uuid(), - title: faker.lorem.sentence(), - columns: [columnResponse], - isVisible: true, - layout: 'layout', - timestamps: { - createdAt: faker.date.past().toString(), - lastUpdatedAt: faker.date.recent().toString(), - }, - }; - - return { boardResponse }; - }; - it('should return BoardSkeletonDto', () => { - const { boardResponse } = setup(); - - const result = BoardSkeletonDtoMapper.mapToBoardSkeletonDto(boardResponse); - - expect(result).toEqual({ - // AI next 16 lines - boardId: boardResponse.id, - title: boardResponse.title, - isVisible: boardResponse.isVisible, - layout: boardResponse.layout, - columns: [ - { - columnId: boardResponse.columns[0].id, - title: boardResponse.columns[0].title, - cards: [ - { - cardId: boardResponse.columns[0].cards[0].cardId, - height: boardResponse.columns[0].cards[0].height, - }, - ], - }, - ], - }); - }); - }); - }); -}); diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.ts deleted file mode 100644 index 15e12d3b2a3..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { BoardResponse, ColumnResponse, CardSkeletonResponse } from '../board-api-client'; -import { BoardSkeletonDto, ColumnSkeletonDto, CardSkeletonDto } from '../dto'; - -export class BoardSkeletonDtoMapper { - public static mapToBoardSkeletonDto(boardResponse: BoardResponse): BoardSkeletonDto { - return new BoardSkeletonDto({ - boardId: boardResponse.id, - title: boardResponse.title, - columns: boardResponse.columns.map((column) => this.mapToColumnSkeletonDto(column)), - isVisible: boardResponse.isVisible, - layout: boardResponse.layout, - }); - } - - private static mapToColumnSkeletonDto(columnResponse: ColumnResponse): ColumnSkeletonDto { - return new ColumnSkeletonDto({ - columnId: columnResponse.id, - title: columnResponse.title, - cards: columnResponse.cards.map((card) => this.mapToCardSkeletonDto(card)), - }); - } - - private static mapToCardSkeletonDto(cardResponse: CardSkeletonResponse): CardSkeletonDto { - return new CardSkeletonDto({ - cardId: cardResponse.cardId, - height: cardResponse.height, - }); - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/index.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/index.ts deleted file mode 100644 index 0213105c0d1..00000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { BoardSkeletonDtoMapper } from './board-skeleton-response.mapper'; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge.module.ts b/apps/server/src/modules/common-cartridge/common-cartridge.module.ts index 676972ac543..dab66351deb 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge.module.ts +++ b/apps/server/src/modules/common-cartridge/common-cartridge.module.ts @@ -8,7 +8,7 @@ import { Module } from '@nestjs/common'; import { defaultMikroOrmOptions } from '@shared/common/defaultMikroOrmOptions'; import { ALL_ENTITIES } from '@shared/domain/entity'; import { LoggerModule } from '@core/logger'; -import { BoardClientModule } from './common-cartridge-client/board-client'; +import { BoardsClientModule } from '@infra/boards-client'; import { CardClientModule } from './common-cartridge-client/card-client/card-client.module'; import { LessonClientModule } from './common-cartridge-client/lesson-client/lesson-client.module'; import { CourseRoomsModule } from './common-cartridge-client/room-client'; @@ -24,6 +24,7 @@ import { CommonCartridgeUc } from './uc/common-cartridge.uc'; FilesStorageClientModule, LoggerModule, CoursesClientModule, + BoardsClientModule, MikroOrmModule.forRoot({ ...defaultMikroOrmOptions, type: 'mongo', @@ -32,9 +33,6 @@ import { CommonCartridgeUc } from './uc/common-cartridge.uc'; user: DB_USERNAME, entities: ALL_ENTITIES, }), - BoardClientModule.register({ - basePath: `${Configuration.get('API_HOST') as string}/v3/`, - }), CourseRoomsModule.register({ basePath: `${Configuration.get('API_HOST') as string}/v3/`, }), diff --git a/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.spec.ts b/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.spec.ts index 1aca822b171..d185576c017 100644 --- a/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.spec.ts +++ b/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.spec.ts @@ -2,12 +2,13 @@ import { DeepMocked, createMock } from '@golevelup/ts-jest'; import { FileDto, FilesStorageClientAdapterService } from '@modules/files-storage-client'; import { Test, TestingModule } from '@nestjs/testing'; import AdmZip from 'adm-zip'; +import { BoardsClientAdapter, BoardResponse } from '@infra/boards-client'; import { CoursesClientAdapter } from '@infra/courses-client'; -import { CourseCommonCartridgeMetadataDto } from '@infra/courses-client/dto'; import { FilesStorageClientAdapter } from '@infra/files-storage-client'; import { faker } from '@faker-js/faker'; import { FileRecordParentType } from '@modules/files-storage/interface'; -import { BoardClientAdapter, BoardSkeletonDto } from '../common-cartridge-client/board-client'; +import { CourseRoomsClientAdapter } from '../common-cartridge-client/room-client'; +import { CommonCartridgeExportService } from './common-cartridge-export.service'; import { CardClientAdapter } from '../common-cartridge-client/card-client/card-client.adapter'; import { CardListResponseDto, @@ -15,7 +16,6 @@ import { RichTextElementContentDto, } from '../common-cartridge-client/card-client/dto'; import { LessonClientAdapter } from '../common-cartridge-client/lesson-client/lesson-client.adapter'; -import { CourseRoomsClientAdapter } from '../common-cartridge-client/room-client'; import { BoardColumnBoardDto, BoardLessonDto, @@ -33,7 +33,6 @@ import { listOfCardResponseFactory, roomFactory, } from '../testing/common-cartridge-dtos.factory'; -import { CommonCartridgeExportService } from './common-cartridge-export.service'; import { CommonCartridgeExportMapper } from './common-cartridge.mapper'; describe('CommonCartridgeExportService', () => { @@ -42,7 +41,7 @@ describe('CommonCartridgeExportService', () => { let coursesClientAdapterMock: DeepMocked; let courseRoomsClientAdapterMock: DeepMocked; let cardClientAdapterMock: DeepMocked; - let boardClientAdapterMock: DeepMocked; + let boardClientAdapterMock: DeepMocked; let lessonClientAdapterMock: DeepMocked; let filesMetadataClientAdapterMock: DeepMocked; let filesStorageClientAdapterMock: DeepMocked; @@ -57,12 +56,12 @@ describe('CommonCartridgeExportService', () => { exportTasks: boolean, exportColumnBoards: boolean ) => { - const courseMetadata: CourseCommonCartridgeMetadataDto = courseMetadataFactory.build(); + const courseMetadata = courseMetadataFactory.build(); const lessons = lessonFactory.buildList(2); const [lesson] = lessons; lesson.courseId = courseMetadata.id; - const boardSkeleton: BoardSkeletonDto = columnBoardFactory.build(); + const boardSkeleton: BoardResponse = columnBoardFactory.build(); const listOfCardsResponse: CardListResponseDto = listOfCardResponseFactory.build(); const boardTask: BoardTaskDto = boardTaskFactory.build(); boardTask.courseName = courseMetadata.title; @@ -133,8 +132,8 @@ describe('CommonCartridgeExportService', () => { useValue: createMock(), }, { - provide: BoardClientAdapter, - useValue: createMock(), + provide: BoardsClientAdapter, + useValue: createMock(), }, { provide: CoursesClientAdapter, @@ -167,7 +166,7 @@ describe('CommonCartridgeExportService', () => { coursesClientAdapterMock = module.get(CoursesClientAdapter); courseRoomsClientAdapterMock = module.get(CourseRoomsClientAdapter); cardClientAdapterMock = module.get(CardClientAdapter); - boardClientAdapterMock = module.get(BoardClientAdapter); + boardClientAdapterMock = module.get(BoardsClientAdapter); lessonClientAdapterMock = module.get(LessonClientAdapter); filesMetadataClientAdapterMock = module.get(FilesStorageClientAdapterService); filesStorageClientAdapterMock = module.get(FilesStorageClientAdapter); diff --git a/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.ts b/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.ts index d87b0cda938..68e811fe68c 100644 --- a/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.ts +++ b/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.ts @@ -1,9 +1,8 @@ import { Injectable } from '@nestjs/common'; import { CoursesClientAdapter } from '@infra/courses-client'; -import { CourseCommonCartridgeMetadataDto } from '@infra/courses-client/dto'; import { FilesStorageClientAdapter } from '@infra/files-storage-client'; import { FilesStorageClientAdapterService } from '@modules/files-storage-client'; -import { BoardClientAdapter, BoardSkeletonDto, ColumnSkeletonDto } from '../common-cartridge-client/board-client'; +import { BoardResponse, BoardsClientAdapter, ColumnResponse } from '@infra/boards-client'; import { CardClientAdapter } from '../common-cartridge-client/card-client'; import { CourseRoomsClientAdapter } from '../common-cartridge-client/room-client'; import { LessonClientAdapter } from '../common-cartridge-client/lesson-client'; @@ -32,7 +31,7 @@ import { @Injectable() export class CommonCartridgeExportService { constructor( - private readonly boardClientAdapter: BoardClientAdapter, + private readonly boardClientAdapter: BoardsClientAdapter, private readonly cardClientAdapter: CardClientAdapter, private readonly coursesClientAdapter: CoursesClientAdapter, private readonly courseRoomsClientAdapter: CourseRoomsClientAdapter, @@ -51,8 +50,7 @@ export class CommonCartridgeExportService { ): Promise { const builder = new CommonCartridgeFileBuilder(this.mapper.mapCourseToManifest(version, courseId)); - const courseCommonCartridgeMetadata: CourseCommonCartridgeMetadataDto = - await this.coursesClientAdapter.getCourseCommonCartridgeMetadata(courseId); + const courseCommonCartridgeMetadata = await this.coursesClientAdapter.getCourseCommonCartridgeMetadata(courseId); builder.addMetadata(this.mapper.mapCourseToMetadata(courseCommonCartridgeMetadata)); @@ -160,7 +158,7 @@ export class CommonCartridgeExportService { const columnBoardsIds = columnBoards .filter((columnBoard) => exportedColumnBoards.includes(columnBoard.id)) .map((columBoard) => columBoard.columnBoardId); - const boardSkeletons: BoardSkeletonDto[] = await Promise.all( + const boardSkeletons: BoardResponse[] = await Promise.all( columnBoardsIds.map((columnBoardId) => this.boardClientAdapter.getBoardSkeletonById(columnBoardId)) ); @@ -168,7 +166,7 @@ export class CommonCartridgeExportService { boardSkeletons.map(async (boardSkeleton) => { const columnBoardOrganization = builder.createOrganization({ title: boardSkeleton.title, - identifier: createIdentifier(boardSkeleton.boardId), + identifier: createIdentifier(boardSkeleton.id), }); await Promise.all( @@ -179,13 +177,12 @@ export class CommonCartridgeExportService { } private async addColumnToOrganization( - column: ColumnSkeletonDto, + column: ColumnResponse, columnBoardOrganization: CommonCartridgeOrganizationNode ): Promise { - const { columnId } = column; const columnOrganization = columnBoardOrganization.createChild({ title: column.title ?? '', - identifier: createIdentifier(columnId), + identifier: createIdentifier(column.id), }); if (column.cards.length) { diff --git a/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.spec.ts b/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.spec.ts index fb771065ccb..144199a70c1 100644 --- a/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.spec.ts +++ b/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.spec.ts @@ -2,6 +2,7 @@ import { faker } from '@faker-js/faker'; import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { CoursesClientAdapter } from '@infra/courses-client'; import { Test, TestingModule } from '@nestjs/testing'; +import { BoardsClientAdapter } from '@infra/boards-client'; import type { CommonCartridgeFileParser } from '../import/common-cartridge-file-parser'; import { CommonCartridgeImportService } from './common-cartridge-import.service'; @@ -9,6 +10,18 @@ jest.mock('../import/common-cartridge-file-parser', () => { const fileParserMock = createMock(); fileParserMock.getTitle.mockReturnValue(faker.lorem.words()); + fileParserMock.getOrganizations.mockReturnValue([ + { + pathDepth: 0, + title: faker.lorem.words(), + path: faker.system.filePath(), + identifier: faker.string.uuid(), + isInlined: true, + isResource: false, + resourcePath: faker.system.filePath(), + resourceType: faker.lorem.word(), + }, + ]); return { CommonCartridgeFileParser: jest.fn(() => fileParserMock), @@ -19,6 +32,7 @@ describe(CommonCartridgeImportService.name, () => { let module: TestingModule; let sut: CommonCartridgeImportService; let coursesClientAdapterMock: DeepMocked; + let boardsClientAdapterMock: DeepMocked; beforeEach(async () => { module = await Test.createTestingModule({ @@ -28,11 +42,16 @@ describe(CommonCartridgeImportService.name, () => { provide: CoursesClientAdapter, useValue: createMock(), }, + { + provide: BoardsClientAdapter, + useValue: createMock(), + }, ], }).compile(); sut = module.get(CommonCartridgeImportService); coursesClientAdapterMock = module.get(CoursesClientAdapter); + boardsClientAdapterMock = module.get(BoardsClientAdapter); }); afterEach(async () => { @@ -49,11 +68,27 @@ describe(CommonCartridgeImportService.name, () => { describe('importFile', () => { describe('when importing a file', () => { + const setup = () => { + const file = Buffer.from(''); + + return { file }; + }; + it('should create a course', async () => { - await sut.importFile(Buffer.from('')); + const { file } = setup(); + + await sut.importFile(file); expect(coursesClientAdapterMock.createCourse).toHaveBeenCalledWith({ title: expect.any(String) }); }); + + it('should create boards', async () => { + const { file } = setup(); + + await sut.importFile(file); + + expect(boardsClientAdapterMock.createBoard).toHaveBeenCalledTimes(1); + }); }); }); }); diff --git a/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.ts b/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.ts index 0580f260cbd..6d51255348b 100644 --- a/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.ts +++ b/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.ts @@ -1,11 +1,12 @@ import { CoursesClientAdapter } from '@infra/courses-client'; import { Injectable } from '@nestjs/common'; +import { BoardsClientAdapter } from '@infra/boards-client'; import { CommonCartridgeFileParser } from '../import/common-cartridge-file-parser'; import { DEFAULT_FILE_PARSER_OPTIONS } from '../import/common-cartridge-import.types'; @Injectable() export class CommonCartridgeImportService { - constructor(private readonly coursesClient: CoursesClientAdapter) {} + constructor(private readonly coursesClient: CoursesClientAdapter, private boardsClient: BoardsClientAdapter) {} public async importFile(file: Buffer): Promise { const parser = new CommonCartridgeFileParser(file, DEFAULT_FILE_PARSER_OPTIONS); @@ -16,6 +17,29 @@ export class CommonCartridgeImportService { private async createCourse(parser: CommonCartridgeFileParser): Promise { const courseName = parser.getTitle() ?? 'Untitled Course'; - await this.coursesClient.createCourse({ title: courseName }); + const course = await this.coursesClient.createCourse({ title: courseName }); + + await this.createBoards(course.courseId, parser); + } + + private async createBoards(parentId: string, parser: CommonCartridgeFileParser): Promise { + const titles = parser + .getOrganizations() + .filter((organization) => organization.pathDepth === 0) + .map((organization) => organization.title); + const ids = new Array(); + + for await (const title of titles) { + const response = await this.boardsClient.createBoard({ + title, + layout: 'columns', + parentId, + parentType: 'course', + }); + + ids.push(response.id); + } + + return ids; } } diff --git a/apps/server/src/modules/common-cartridge/testing/common-cartridge-dtos.factory.ts b/apps/server/src/modules/common-cartridge/testing/common-cartridge-dtos.factory.ts index c08ee658bed..2f16371a966 100644 --- a/apps/server/src/modules/common-cartridge/testing/common-cartridge-dtos.factory.ts +++ b/apps/server/src/modules/common-cartridge/testing/common-cartridge-dtos.factory.ts @@ -1,8 +1,8 @@ import { faker } from '@faker-js/faker'; import { Factory } from 'fishery'; import { CourseCommonCartridgeMetadataDto } from '@infra/courses-client/dto'; +import { BoardResponse, ColumnResponse, CardSkeletonResponse } from '@infra/boards-client'; import { LessonContentDto, LessonDto, LessonLinkedTaskDto } from '../common-cartridge-client/lesson-client/dto'; -import { BoardSkeletonDto, CardSkeletonDto, ColumnSkeletonDto } from '../common-cartridge-client/board-client'; import { CardListResponseDto } from '../common-cartridge-client/card-client/dto/card-list-response.dto'; import { CardResponseDto } from '../common-cartridge-client/card-client/dto/card-response.dto'; import { @@ -27,28 +27,36 @@ export const courseMetadataFactory = Factory.define(({ sequence }) => { +export const cardFactory = Factory.define(({ sequence }) => { return { cardId: sequence.toString(), height: faker.number.int(), }; }); -export const columnFactory = Factory.define(({ sequence }) => { +export const columnFactory = Factory.define(({ sequence }) => { return { - columnId: sequence.toString(), + id: sequence.toString(), title: faker.lorem.sentence(), cards: [cardFactory.build(), cardFactory.build()], + timestamps: { + createdAt: faker.date.recent().toISOString(), + lastUpdatedAt: faker.date.recent().toISOString(), + }, }; }); -export const columnBoardFactory = Factory.define(({ sequence }) => { +export const columnBoardFactory = Factory.define(({ sequence }) => { return { - boardId: sequence.toString(), + id: sequence.toString(), title: faker.lorem.sentence(), columns: [columnFactory.build(), columnFactory.build()], isVisible: faker.datatype.boolean(), layout: faker.lorem.word(), + timestamps: { + createdAt: faker.date.recent().toISOString(), + lastUpdatedAt: faker.date.recent().toISOString(), + }, }; }); diff --git a/apps/server/src/modules/learnroom/controller/course.controller.ts b/apps/server/src/modules/learnroom/controller/course.controller.ts index 488cc691089..ddd49dd315a 100644 --- a/apps/server/src/modules/learnroom/controller/course.controller.ts +++ b/apps/server/src/modules/learnroom/controller/course.controller.ts @@ -34,6 +34,7 @@ import { CourseSyncBodyParams, CourseUrlParams, CreateCourseBodyParams, + CreateCourseResponse, } from './dto'; import { CourseCommonCartridgeMetadataResponse } from './dto/course-cc-metadata.response'; @@ -64,11 +65,17 @@ export class CourseController { @ApiOperation({ summary: 'Create a new course.' }) @ApiConsumes('application/json') @ApiProduces('application/json') - @ApiCreatedResponse({ description: 'Course was successfully created.' }) + @ApiCreatedResponse({ description: 'Course was successfully created.', type: CreateCourseResponse }) @ApiBadRequestResponse({ description: 'Request data has invalid format.' }) @ApiInternalServerErrorResponse({ description: 'Internal server error.' }) - public async createCourse(@CurrentUser() user: ICurrentUser, @Body() body: CreateCourseBodyParams): Promise { - await this.courseUc.createCourse(user, body.title); + public async createCourse( + @CurrentUser() user: ICurrentUser, + @Body() body: CreateCourseBodyParams + ): Promise { + const course = await this.courseUc.createCourse(user, body.title); + const response = CourseMapper.mapToCreateCourseResponse(course); + + return response; } @Post('import') diff --git a/apps/server/src/modules/learnroom/controller/dto/create-course.response.ts b/apps/server/src/modules/learnroom/controller/dto/create-course.response.ts new file mode 100644 index 00000000000..97a04d39020 --- /dev/null +++ b/apps/server/src/modules/learnroom/controller/dto/create-course.response.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class CreateCourseResponse { + @ApiProperty({ + description: 'The id of the created course', + type: () => String, + readOnly: true, + }) + public courseId: string; + + constructor(props: Readonly) { + this.courseId = props.courseId; + } +} diff --git a/apps/server/src/modules/learnroom/controller/dto/index.ts b/apps/server/src/modules/learnroom/controller/dto/index.ts index 79a0302dde6..da750e75e4f 100644 --- a/apps/server/src/modules/learnroom/controller/dto/index.ts +++ b/apps/server/src/modules/learnroom/controller/dto/index.ts @@ -21,3 +21,4 @@ export { BoardTaskStatusResponse, SingleColumnBoardResponse, } from './single-column-board'; +export { CreateCourseResponse } from './create-course.response'; diff --git a/apps/server/src/modules/learnroom/mapper/course.mapper.spec.ts b/apps/server/src/modules/learnroom/mapper/course.mapper.spec.ts new file mode 100644 index 00000000000..b6b7a7354fb --- /dev/null +++ b/apps/server/src/modules/learnroom/mapper/course.mapper.spec.ts @@ -0,0 +1,26 @@ +import { courseFactory } from '@testing/factory/course.factory'; +import { setupEntities } from '@testing/setup-entities'; +import { CourseMapper } from './course.mapper'; +import { CreateCourseResponse } from '../controller/dto'; + +describe(CourseMapper.name, () => { + beforeAll(async () => { + await setupEntities(); + }); + + describe('mapToCreateCourseResponse', () => { + const setup = () => { + const course = courseFactory.build(); + + return { course }; + }; + + it('should return CreateCourseResponse', () => { + const { course } = setup(); + + const result = CourseMapper.mapToCreateCourseResponse(course); + + expect(result).toEqual(new CreateCourseResponse({ courseId: course.id })); + }); + }); +}); diff --git a/apps/server/src/modules/learnroom/mapper/course.mapper.ts b/apps/server/src/modules/learnroom/mapper/course.mapper.ts index b87bcbff711..4f9992e9984 100644 --- a/apps/server/src/modules/learnroom/mapper/course.mapper.ts +++ b/apps/server/src/modules/learnroom/mapper/course.mapper.ts @@ -1,9 +1,9 @@ import { Course } from '@shared/domain/entity'; -import { CourseMetadataResponse } from '../controller/dto'; +import { CourseMetadataResponse, CreateCourseResponse } from '../controller/dto'; import { CourseCommonCartridgeMetadataResponse } from '../controller/dto/course-cc-metadata.response'; export class CourseMapper { - static mapToMetadataResponse(course: Course): CourseMetadataResponse { + public static mapToMetadataResponse(course: Course): CourseMetadataResponse { const courseMetadata = course.getMetadata(); const dto = new CourseMetadataResponse( courseMetadata.id, @@ -17,7 +17,7 @@ export class CourseMapper { return dto; } - static mapToCommonCartridgeMetadataResponse(course: Course): CourseCommonCartridgeMetadataResponse { + public static mapToCommonCartridgeMetadataResponse(course: Course): CourseCommonCartridgeMetadataResponse { const courseMetadata = course.getMetadata(); const teachers = course.teachers.toArray().map((teacher) => `${teacher.firstName} ${teacher.lastName}`); const courseCCMetadataResopne: CourseCommonCartridgeMetadataResponse = new CourseCommonCartridgeMetadataResponse( @@ -29,4 +29,10 @@ export class CourseMapper { return courseCCMetadataResopne; } + + public static mapToCreateCourseResponse(course: Course): CreateCourseResponse { + const response = new CreateCourseResponse({ courseId: course.id }); + + return response; + } } diff --git a/apps/server/src/modules/learnroom/service/course.service.spec.ts b/apps/server/src/modules/learnroom/service/course.service.spec.ts index e7d71d0d95e..8962d781315 100644 --- a/apps/server/src/modules/learnroom/service/course.service.spec.ts +++ b/apps/server/src/modules/learnroom/service/course.service.spec.ts @@ -177,19 +177,22 @@ describe('CourseService', () => { }); describe('create', () => { - const setup = () => { - const course = courseFactory.buildWithId(); - legacyCourseRepo.createCourse.mockResolvedValueOnce(); + describe('when creating new Course', () => { + const setup = () => { + const course = courseFactory.buildWithId(); - return { course }; - }; + legacyCourseRepo.createCourse.mockResolvedValueOnce(course); - it('should call createCourse from course repository', async () => { - const { course } = setup(); + return { course }; + }; + + it('should call createCourse from course repository', async () => { + const { course } = setup(); - await expect(courseService.create(course)).resolves.not.toThrow(); + await expect(courseService.create(course)).resolves.not.toThrow(); - expect(legacyCourseRepo.createCourse).toBeCalledWith(course); + expect(legacyCourseRepo.createCourse).toBeCalledWith(course); + }); }); }); diff --git a/apps/server/src/modules/learnroom/service/course.service.ts b/apps/server/src/modules/learnroom/service/course.service.ts index b2988491313..550b04b1365 100644 --- a/apps/server/src/modules/learnroom/service/course.service.ts +++ b/apps/server/src/modules/learnroom/service/course.service.ts @@ -36,8 +36,10 @@ export class CourseService implements DeletionService, IEventHandler { - return this.repo.findById(courseId); + public findById(courseId: EntityId): Promise { + const course = this.repo.findById(courseId); + + return course; } public async findAllCoursesByUserId(userId: EntityId): Promise> { @@ -79,22 +81,25 @@ export class CourseService implements DeletionService, IEventHandler { + public async findAllByUserId(userId: EntityId): Promise { const [courses] = await this.repo.findAllByUserId(userId); return courses; } - async create(course: CourseEntity): Promise { - await this.repo.createCourse(course); + public async create(course: CourseEntity): Promise { + const result = await this.repo.createCourse(course); + + return result; } private getCoursesId(courses: CourseEntity[]): EntityId[] { return courses.map((course) => course.id); } - async findOneForUser(courseId: EntityId, userId: EntityId): Promise { + public async findOneForUser(courseId: EntityId, userId: EntityId): Promise { const course = await this.repo.findOne(courseId, userId); + return course; } } diff --git a/apps/server/src/modules/learnroom/uc/course.uc.ts b/apps/server/src/modules/learnroom/uc/course.uc.ts index 8547261576d..71df5cfd8ec 100644 --- a/apps/server/src/modules/learnroom/uc/course.uc.ts +++ b/apps/server/src/modules/learnroom/uc/course.uc.ts @@ -38,13 +38,14 @@ export class CourseUc { return course; } - public async createCourse(currentUser: ICurrentUser, name: string): Promise { + public async createCourse(currentUser: ICurrentUser, name: string): Promise { const user = await this.authService.getUserWithPermissions(currentUser.userId); this.authService.checkAllPermissions(user, [Permission.COURSE_CREATE]); const course = new Course({ teachers: [user], school: user.school, name }); + const savedCourse = await this.courseService.create(course); - await this.courseService.create(course); + return savedCourse; } } diff --git a/apps/server/src/shared/repo/course/course.repo.ts b/apps/server/src/shared/repo/course/course.repo.ts index ebe1074db02..a62a2c4411d 100644 --- a/apps/server/src/shared/repo/course/course.repo.ts +++ b/apps/server/src/shared/repo/course/course.repo.ts @@ -1,6 +1,5 @@ import { QueryOrderMap } from '@mikro-orm/core'; import { Injectable } from '@nestjs/common'; - import { Course } from '@shared/domain/entity'; import { IFindOptions } from '@shared/domain/interface'; import { Counted, EntityId } from '@shared/domain/types'; @@ -9,15 +8,17 @@ import { CourseScope } from './course.scope'; @Injectable() export class CourseRepo extends BaseRepo { - get entityName() { + get entityName(): typeof Course { return Course; } - async createCourse(course: Course): Promise { - return this.save(this.create(course)); + public async createCourse(course: Course): Promise { + await this.save(this.create(course)); + + return course; } - async findById(id: EntityId, populate = true): Promise { + public async findById(id: EntityId, populate = true): Promise { const course = await super.findById(id); if (populate) { await this._em.populate(course, ['courseGroups', 'teachers', 'substitutionTeachers', 'students']); @@ -25,7 +26,7 @@ export class CourseRepo extends BaseRepo { return course; } - async findAllByUserId( + public async findAllByUserId( userId: EntityId, filters?: { onlyActiveCourses?: boolean }, options?: IFindOptions @@ -49,7 +50,7 @@ export class CourseRepo extends BaseRepo { return [courses, count]; } - async findAllForTeacher( + public async findAllForTeacher( userId: EntityId, filters?: { onlyActiveCourses?: boolean }, options?: IFindOptions @@ -74,7 +75,7 @@ export class CourseRepo extends BaseRepo { } // not tested in repo.integration.spec - async findAllForTeacherOrSubstituteTeacher(userId: EntityId): Promise> { + public async findAllForTeacherOrSubstituteTeacher(userId: EntityId): Promise> { const scope = new CourseScope(); scope.forTeacherOrSubstituteTeacher(userId); @@ -83,7 +84,7 @@ export class CourseRepo extends BaseRepo { return [courses, count]; } - async findOne(courseId: EntityId, userId?: EntityId): Promise { + public async findOne(courseId: EntityId, userId?: EntityId): Promise { const scope = new CourseScope(); scope.forCourseId(courseId); if (userId) scope.forAllGroupTypes(userId); diff --git a/openapitools.json b/openapitools.json index 194e1096fa6..d55223b9aa7 100644 --- a/openapitools.json +++ b/openapitools.json @@ -28,6 +28,31 @@ "withSeparateModelsAndApi": true } }, + "boards-api": { + "generatorName": "typescript-axios", + "inputSpec": "http://localhost:3030/api/v3/docs-json", + "output": "./apps/server/src/infra/boards-client/generated", + "skipValidateSpec": true, + "enablePostProcessFile": true, + "openapiNormalizer": { + "FILTER": "operationId:BoardController_createBoard|BoardController_getBoardSkeleton" + }, + "globalProperty": { + "models": "CreateBoardBodyParams:CreateBoardResponse:BoardParentType:BoardLayout:BoardResponse:ColumnResponse:CardSkeletonResponse:TimestampsResponse", + + "apis": "", + "supportingFiles": "" + }, + "additionalProperties": { + "apiPackage": "api", + "enumNameSuffix": "", + "enumPropertyNaming": "UPPERCASE", + "modelPackage": "models", + "supportsES6": true, + "withInterfaces": true, + "withSeparateModelsAndApi": true + } + }, "files-storage-api": { "generatorName": "typescript-axios", "inputSpec": "http://localhost:4444/api/v3/docs-json", @@ -62,9 +87,18 @@ "FILTER": "operationId:CourseController_getCourseCcMetadataById|CourseController_createCourse" }, "globalProperty": { - "models": "CourseCommonCartridgeMetadataResponse:CreateCourseBodyParams", + "models": "CourseCommonCartridgeMetadataResponse:CreateCourseBodyParams:CreateCourseResponse", "apis": "", "supportingFiles": "" + }, + "additionalProperties": { + "apiPackage": "api", + "enumNameSuffix": "", + "enumPropertyNaming": "UPPERCASE", + "modelPackage": "models", + "supportsES6": true, + "withInterfaces": true, + "withSeparateModelsAndApi": true } }, "svs-lesson-api": { diff --git a/package.json b/package.json index 9acdf383850..fadfb01bef5 100644 --- a/package.json +++ b/package.json @@ -136,6 +136,8 @@ "generate-client:courses-api": "openapi-generator-cli generate -c ./openapitools.json --generator-key courses-api", "pregenerate-client:tldraw-api": "rimraf ./apps/server/src/infra/tldraw-client/generated", "generate-client:tldraw-api": "openapi-generator-cli generate -c ./openapitools.json --generator-key tldraw-api", + "pregenerate-client:boards-api": "rimraf ./apps/server/src/infra/boards-client/generated", + "generate-client:boards-api": "openapi-generator-cli generate -c ./openapitools.json --generator-key boards-api", "generate-client:vidis-api": "openapi-generator-cli generate -c ./openapitools.json --generator-key vidis-api" }, "overrides": {