Skip to content

Реализация роутинга, подключение клиентского слойя API и интеграция с бэкендом#3

Merged
maximste merged 58 commits into
mainfrom
sprint_3
Apr 15, 2026
Merged

Реализация роутинга, подключение клиентского слойя API и интеграция с бэкендом#3
maximste merged 58 commits into
mainfrom
sprint_3

Conversation

@maximste
Copy link
Copy Markdown
Owner

Реализовано

  • клиентский слой API и интеграция с бэкендом;
  • создание групп (в том числе добавление аватара группы);
  • создание приватных сообщений;
  • просмотр и редактирование профиля;
  • добавление аватара профиля;
  • авторизация
  • создание нового профиля

Важные замечания.

  1. Функционал отправки сообщений не реализован, поскольку программа курса была изменена. Будет реализовано в 4 спринте.
  2. Выкладка сделана на github pages (https://maximste.github.io/GilgaChat), так как Netlify нестабильно работает без ВПН.

maximste added 30 commits April 8, 2026 19:34
…ектов, а также тип Indexed для работы с объектами с динамическими ключами
Сегмент shared/lib/router: синглтон Router с History API, basePath и
fallback на 404, Route с монтированием Block в контейнер по селектору,
normalizeAppPath в path/. Реэкспорт из shared/lib.

Made-with: Cursor
Файл shared/config/routes.ts: APP_PATHS для внутренних путей и appHref с
учётом import.meta.env.BASE_URL при деплое в подкаталог.

Made-with: Cursor
…функцию connect и создана функция mapMessengerLayoutState для управления состоянием пользователя в боковой панели.
… роутера. Изменены методы управления маршрутами
… для управления сессиями, входом и выходом пользователей, а также взаимодействия с API чатов.
…енты MessengerRouteBlock и AuthScreenBlock для интеграции новых функций.
… интерфейсы и компоненты формы редактирования профиля для поддержки новых данных.
…овлена обработка события submit для передачи данных регистрации через это свойство.
…ти от статуса аутентификации пользователя.
maximste added 17 commits April 12, 2026 12:28
…ено отображение аватара в SidebarChatSection.
…ства, добавлены новые параметры для поиска, изменено отображение заголовка
…а, добавлены новые стили для кнопки загрузки и метаданных аватара
…в, добавлены функции для обработки типов чатов, обновлены компоненты ChatHeader и ChatPage для отображения статуса пользователя.
…ны модальные окна CreateDmModal и CreateGroupModal на более универсальные компоненты
…есено отдельно от редактирования профиля
@maximste maximste changed the title Sprint 3 Реализация роутинга, подключение клиентского слойяAPI и интеграция с бэкендом Apr 14, 2026
@maximste maximste changed the title Реализация роутинга, подключение клиентского слойяAPI и интеграция с бэкендом Реализация роутинга, подключение клиентского слойя API и интеграция с бэкендом Apr 14, 2026
Copy link
Copy Markdown

@aromanovnik aromanovnik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здравствуйте, Максим! 👋 (Нужно развернуть общий комментарий ↓)

Работа выполнена очень хорошо:

Добавлен корректно работающий роутинг, реализовано HTTP API для чатов, авторизации и пользователей. Код отлично типизирован и структурирован. Все выглядит чисто и понятно. Отличная работа!

Тем не менее, есть несколько моментов, которые стоит доработать. 🔧 Подробнее в комментариях к коду.

Что нужно исправить:

  • При выборе детального чата отображаются моковые данные. По заданию необходимо загружать реальные сообщения, которые были отправлены ранее, а не использовать заглушки.
  • По заданию должна быть реализована возможность добавления и удаления пользователя из чата. Сейчас методы для этого есть, но они не используются.
  • По заданию должна быть реализована работа с WebSocket для получения и отправки сообщений чатов в реальном времени.

Что можно улучшить:

  • Все методы (get, put, post, delete) одинаковы, отличается только тип метода запроса. Можно использовать фабричный метод, который будет возвращать соответствующий функционал в зависимости от типа запроса.
  • Для удобства и снижения вероятности ошибок при работе с HTTP-статусами стоит вынести их в enum.

Напоминаю, что работа может быть принята только после исправления всех критических замечаний с пометкой Надо исправить.

Желаю успехов в доработке проекта! 

}

class HTTPTransport {
get = (url: string, options: HTTPRequestOptions = {}) => {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно лучше: Все методы (get, put, post, delete) одинаковы, отличается только тип метода запроса. Можно использовать фабричный метод, который будет возвращать соответствующий функционал в зависимости от типа запроса. Это улучшит структуру кода, повысит его повторное использование и упростит изменения в будущем, поскольку все изменения будут централизованы в одном месте.

type HTTPMethod = <R = unknown>(url: string, options?: Partial<RequestOptions<QueryParams>>) => Promise<R>;


export class HTTPTransport {
  // Фабричный метод для создания HTTP-методов
  private createMethod(method: METHODS): HTTPMethod {
    return (url, options = {}) => this.request(url, { ...options, method });
  }

  // Методы HTTP
  protected readonly get = this.createMethod(METHODS.GET);

  protected readonly put = this.createMethod(METHODS.PUT);

  protected readonly post = this.createMethod(METHODS.POST);

  protected readonly delete = this.createMethod(METHODS.DELETE);
  
  // Реализация метода request
  private request<R>(
    url: string,
    options: RequestOptions<QueryParams>,
  ): Promise<R> {
    // Логика выполнения HTTP-запроса
  }
}

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавил фабрику. Спасибо за идею

});

xhr.onload = function () {
if (xhr.status >= 200 && xhr.status < 300) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно лучше: Для удобства и снижения вероятности ошибок при работе с HTTP-статусами стоит вынести их в enum. Это избавляет от “магических чисел” в коде, упрощает поддержку и помогает избежать опечаток. Пример:

export enum HttpStatus {
  Ok = 200,
  Created = 201,
  NoContent = 204,
  MultipleChoices = 300,
  BadRequest = 400,
  Unauthorized = 401,
  Forbidden = 403,
  NotFound = 404,
  Conflict = 409,
  InternalServerError = 500,
}

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Доработал. Спасибо за рекомендацию, так почище и без магических чисел

import type { ChatTimelineRowVm } from "@/shared/lib/utils";
import { Block, type BlockOwnProps } from "@/shared/ui/block";

import template from "./ChatThread.hbs?raw";
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Надо исправить: При выборе детального чата отображаются моковые данные. По заданию необходимо загружать реальные сообщения, которые были отправлены ранее, а не использовать заглушки.

Image

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Получение и отправка сообщений будет реализована в четвертом спринте (как нам объяснили - была пересмотрена программа). Поэтому в этом спринте использовал моки

await this.loadChats();
},

async addUsersToChat(data: ChatsUsersRequest): Promise<void> {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Надо исправить: По заданию должна быть реализована возможность добавления и удаления пользователя из чата. Сейчас методы для этого есть, но они не используются.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавил. Как-то упустил этот момент

import type { ChatTimelineRowVm } from "@/shared/lib/utils";
import { Block, type BlockOwnProps } from "@/shared/ui/block";

import template from "./ChatThread.hbs?raw";
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Надо исправить: По заданию должна быть реализована работа с WebSocket для получения и отправки сообщений чатов в реальном времени.

Image

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Получение и отправка сообщений будет реализована в четвертом спринте (как нам объяснили - была пересмотрена программа). Поэтому в этом спринте использовал моки

@maximste maximste requested a review from aromanovnik April 14, 2026 19:13
Copy link
Copy Markdown

@aromanovnik aromanovnik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉 Поздравляю! Работа принята!

Все недочёты успешно исправлены, и результат получился просто отличным!

Вы проделали огромную работу, и это действительно впечатляет!
Желаю успехов в дальнейшей учёбе и новых достижений! 🚀

@maximste maximste merged commit 05d05c3 into main Apr 15, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants