diff --git a/TODO b/TODO new file mode 100644 index 0000000..e1555d2 --- /dev/null +++ b/TODO @@ -0,0 +1,2 @@ +Todo: + ☐ В *service отлавливать ошибки через try catch diff --git a/specification/specification.yml b/specification/specification.yml new file mode 100644 index 0000000..68b3e64 --- /dev/null +++ b/specification/specification.yml @@ -0,0 +1,657 @@ +openapi: 3.0.0 +info: + title: API сервер для демо-проекта «Шесть городов». + description: |- + * Список ресурсов и маршрутов сервера «Шесть городов». + license: + name: MIT + url: https://opensource.org/licenses/MIT + version: 1.0.0 +tags: + - name: offers + description: Действия с объявлениями. + - name: reviews + description: Действия с комментариями. + - name: users + description: Действия с пользователем. + +paths: + /users/register: + post: + tags: + - users + summary: Регистрация пользователя + description: Регистрирует нового пользователя. + + requestBody: + description: Информация для создания нового пользователя. + content: + application/json: + schema: + $ref: '#/components/schemas/CreateUser' + required: true + + responses: + '201': + description: Пользователь зарегистрирован. Объект пользователя. + content: + application/json: + schema: + $ref: '#/components/schemas/User' + + '409': + description: Пользователь с таким email уже существует. + + /users/login: + post: + tags: + - users + summary: Авторизация пользователя + description: Авторизует пользователя на основе логина и пароля + + requestBody: + description: Информация для авторизации пользователя. + content: + application/json: + schema: + $ref: '#/components/schemas/LoginUser' + required: true + + responses: + '200': + description: Пользователь авторизован. Объект пользователя. + content: + application/json: + schema: + $ref: '#/components/schemas/UserInfo' + + get: + tags: + - users + summary: Проверка состояния пользователя + description: Возвращает информацию по авторизованному пользователю + + responses: + '200': + description: Статус авторизации пользователя + content: + application/json: + schema: + $ref: '#/components/schemas/UserInfo' + '401': + description: Пользователь не авторизован + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + + /users/logout: + delete: + tags: + - users + summary: Завершить сеанс пользователя + description: Завершает сеанс пользователя + + parameters: + - in: header + name: X-Token + example: T482kjhsdkKJHJsjhgfeyue73 + description: Токен пользователя + schema: + type: string + required: true + + responses: + '401': + description: Статус авторизации пользователя. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + + /offers/: + post: + tags: + - offers + summary: Создать новое предложение + description: Создание нового предложения + + requestBody: + description: Информация для создания нового предложения. + content: + application/json: + schema: + $ref: '#/components/schemas/CreateOfferDTO' + + required: true + + responses: + '201': + description: Предложение успешно добавлено. + content: + application/json: + schema: + $ref: '#/components/schemas/OfferEntity' + + get: + tags: + - offers + summary: Получить список предложений + description: Получение списка предложений по аренде + + responses: + '201': + description: Список предложений получен + content: + application/json: + schema: + $ref: '#/components/schemas/OfferEntity' + + /offers/{offerId}: + parameters: + - in: path + name: offerId + example: adsduif874865fd + description: id предложения + schema: + type: string + required: true + + post: + tags: + - offers + summary: Редактировать предложение + description: Редактирование предложения + responses: + '201': + description: Предложение отредактировано + content: + application/json: + schema: + $ref: '#/components/schemas/OfferEntity' + + delete: + tags: + - offers + summary: Удалить предложение + description: Удаление предложения + responses: + '201': + description: Предложение удалено + content: + application/json: + schema: + $ref: '#/components/schemas/OfferEntity' + + get: + tags: + - offers + summary: Получить детальную информацию о предложении + description: Получение детальной информации о предложении по аренде + responses: + '201': + description: Получена детальная информация о предложении + content: + application/json: + schema: + $ref: '#/components/schemas/OfferEntity' + + /premium/{cityName}: + parameters: + - in: path + name: cityName + example: Berlin + description: Наименование города + schema: + type: string + required: true + get: + tags: + - offers + summary: Получить премиальные предложения города + description: Получение премиальных предложений по аренде города + responses: + '201': + description: Получены премиальные предложения города + content: + application/json: + schema: + $ref: '#/components/schemas/OfferEntity' + + /favorite: + get: + tags: + - offers + summary: Получить список избранных предложений + description: Получение списка избранных предложений по аренде + responses: + '201': + description: Получены избранные предложения города + content: + application/json: + schema: + $ref: '#/components/schemas/OfferEntity' + post: + tags: + - offers + summary: Добавить/удалить предложение в/из избранное + description: Добавление/удаление предложения в/из избранное + responses: + '201': + description: Флаг избранного изменен + content: + application/json: + schema: + $ref: '#/components/schemas/OfferEntity' + + /reviews/{offerId}: + parameters: + - in: path + name: offerId + example: adsduif874865fd + description: id предложения + schema: + type: string + required: true + get: + tags: + - reviews + summary: Получить список комментариев предложения + description: Получение списка комментариев предложения по аренде + responses: + '201': + description: Флаг избранного изменен + content: + application/json: + schema: + $ref: '#/components/schemas/ReviewEntity' + + post: + tags: + - reviews + summary: Добавить комментарий к предложению + description: Добавление комментария к предложению по аренде + responses: + '201': + description: Флаг избранного изменен + content: + application/json: + schema: + $ref: '#/components/schemas/CreateReviewDto' + +components: + schemas: + CreateUser: + type: object + + properties: + name: + type: string + example: Keks + + email: + type: string + example: keks@htmlacademy.ru + + password: + type: string + example: 123456 + + avatarUrl: + type: string + example: http://avatars.ru/avatar.png + + isPro: + type: boolean + example: true + + User: + type: object + + properties: + id: + type: string + example: 6329c3d6a04ab1061c6425ea + + email: + type: string + example: keks@htmlacademy.ru + + avatarUrl: + type: string + example: http://avatars.ru/avatar.png + + isPro: + type: boolean + example: true + + LoginUser: + type: object + + properties: + email: + type: string + example: keks@htmlacademy.ru + + password: + type: string + example: 123456 + + UserInfo: + type: object + + properties: + name: + type: string + example: 6329c3d6a04ab1061c6425ea + + email: + type: string + example: keks@htmlacademy.ru + + avatarUrl: + type: string + example: http://avatars.ru/avatar.png + + isPro: + type: boolean + example: true + + token: + type: string + example: T482kjhsdkKJHJsjhgfeyue73 + + ErrorInfo: + type: object + + properties: + errorType: + type: string + example: 'NO_AUTH' + + errorMessage: + type: string + example: 'User is not authorized' + + Location: + type: object + properties: + latitude: + type: number + example: 42.23432 + longitude: + type: number + example: 23.346329 + + City: + type: object + + properties: + name: + type: string + example: 'Berlin' + + location: + type: object + $ref: '#/components/schemas/Location' + + CreateOfferDTO: + type: object + + properties: + title: + type: string + example: 'The Pondhouse - A Magical Place' + + description: + type: string + example: 'I am happy to welcome you to my apartment in the city center! Three words: location, cosy and chic!' + + createdDate: + type: string + example: '2024-05-08T14:13:56.569Z' + + city: + type: object + $ref: '#/components/schemas/City' + + previewImage: + type: string + example: 'https://16.design.htmlacademy.pro/static/hotel/1.jpg' + + images: + type: array + items: + type: string + example: + [ + 'https://16.design.htmlacademy.pro/static/hotel/1.jpg', + 'https://16.design.htmlacademy.pro/static/hotel/2.jpg', + 'https://16.design.htmlacademy.pro/static/hotel/3.jpg', + ] + + isPremium: + type: boolean + example: true + + isFavorite: + type: boolean + example: true + + rating: + type: number + example: 3.2 + + type: + type: string + example: 'hotel' + + bedrooms: + type: number + example: 3 + + maxAdults: + type: number + example: 2 + + price: + type: number + example: 600 + + goods: + type: array + items: + type: string + example: ['Breakfast', 'Air conditioning'] + + userId: + type: string + example: cq3wbo78c8325cb26378 + + location: + type: object + $ref: '#/components/schemas/Location' + + UpdateOfferDTO: + type: object + + properties: + title: + type: string + example: 'The Pondhouse - A Magical Place' + + description: + type: string + example: 'I am happy to welcome you to my apartment in the city center! Three words: location, cosy and chic!' + + createdDate: + type: string + example: '2024-05-08T14:13:56.569Z' + + city: + type: object + $ref: '#/components/schemas/City' + + previewImage: + type: string + example: 'https://16.design.htmlacademy.pro/static/hotel/1.jpg' + + images: + type: array + items: + type: string + example: + [ + 'https://16.design.htmlacademy.pro/static/hotel/1.jpg', + 'https://16.design.htmlacademy.pro/static/hotel/2.jpg', + 'https://16.design.htmlacademy.pro/static/hotel/3.jpg', + ] + + isPremium: + type: boolean + example: true + + isFavorite: + type: boolean + example: true + + rating: + type: number + example: 3.2 + + type: + type: string + example: 'hotel' + + bedrooms: + type: number + example: 3 + + maxAdults: + type: number + example: 2 + + price: + type: number + example: 600 + + goods: + type: array + items: + type: string + example: ['Breakfast', 'Air conditioning'] + + location: + type: object + $ref: '#/components/schemas/Location' + + OfferEntity: + type: object + + properties: + title: + type: string + example: 'The Pondhouse - A Magical Place' + + description: + type: string + example: 'I am happy to welcome you to my apartment in the city center! Three words: location, cosy and chic!' + + createdDate: + type: string + example: '2024-05-08T14:13:56.569Z' + + city: + type: object + $ref: '#/components/schemas/City' + + previewImage: + type: string + example: 'https://16.design.htmlacademy.pro/static/hotel/1.jpg' + + images: + type: array + items: + type: string + example: + [ + 'https://16.design.htmlacademy.pro/static/hotel/1.jpg', + 'https://16.design.htmlacademy.pro/static/hotel/2.jpg', + 'https://16.design.htmlacademy.pro/static/hotel/3.jpg', + ] + + isPremium: + type: boolean + example: true + + isFavorite: + type: boolean + example: true + + rating: + type: number + example: 3.2 + + type: + type: string + example: 'hotel' + + bedrooms: + type: number + example: 3 + + maxAdults: + type: number + example: 2 + + price: + type: number + example: 600 + + goods: + type: array + items: + type: string + example: ['Breakfast', 'Air conditioning'] + + host: + type: object + $ref: '#/components/schemas/User' + + location: + type: object + $ref: '#/components/schemas/Location' + + CreateReviewDto: + type: object + + properties: + date: + type: string + example: '2024-05-08T14:13:56.569Z' + userId: + type: string + example: cq3wbo78c8325cb26378 + comment: + type: string + example: A quiet cozy and picturesque that hides behind a a river by the unique lightness of Amsterdam. + rating: + type: number + example: 3 + + ReviewEntity: + type: object + + properties: + date: + type: string + example: '2024-05-08T14:13:56.569Z' + user: + type: object + $ref: '#/components/schemas/User' + comment: + type: string + example: A quiet cozy and picturesque that hides behind a a river by the unique lightness of Amsterdam. + rating: + type: number + example: 3