Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
6c51850
Add docs/PROJECT.md: workspace overview (stack, sub-projects, path
Awakich May 7, 2026
1510a2d
docs(core): document the entire core library + drop README stubs
Awakich May 7, 2026
72ab5f0
docs(uilib): document the uilib library + drop README stub
Awakich May 7, 2026
1950220
docs(social_platform): document the layered architecture
Awakich May 7, 2026
480825a
docs(social_platform): document the shared layer
Awakich May 7, 2026
0fe1aef
docs(social_platform): document ui/primitives and ui/widgets
Awakich May 7, 2026
f9c43c4
docs(auth): document the auth module across all layers
Awakich May 7, 2026
4aa1af3
docs(profile): document the profile module across all layers
Awakich May 7, 2026
088b543
docs(skills): document the skills module across all layers
Awakich May 7, 2026
fdbb8a1
docs(specializations): document the specializations module
Awakich May 7, 2026
66df166
docs(industry): document the industry module
Awakich May 7, 2026
b50a56a
docs(member): document the member module
Awakich May 7, 2026
bb5ffe4
docs(project): document the project module across all layers
Awakich May 7, 2026
90cc893
docs(vacancy): document the vacancy module
Awakich May 7, 2026
8536369
docs(invite): document the invite module
Awakich May 7, 2026
a8d0176
docs(program): document the program module
Awakich May 7, 2026
cf42de6
docs(courses): document the courses module
Awakich May 7, 2026
06a808d
docs(news): document the news module
Awakich May 7, 2026
cf239d1
docs(feed): document the feed module
Awakich May 7, 2026
3ed9fd7
docs(chat): document the chat module
Awakich May 7, 2026
46254a2
docs(office-shell): document office shell, error, onboarding + UI ser…
Awakich May 7, 2026
260fd67
docs: audit project documentation
Awakich May 8, 2026
2691409
fix profile, policy, select merged files to actual & add format to docs
Awakich May 8, 2026
5c2ddb3
remove deprecated skills domain from core & ui
Awakich May 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 8 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,15 @@

# Procollab

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.3.5.
Frontend-монорепозиторий для социальной платформы Procollab: Angular 17 приложение (`social_platform`) плюс две разделяемые библиотеки (`core`, `ui`).

## Development server
📖 **Вся документация лежит в [`docs/`](docs/).** Начни с [`docs/PROJECT.md`](docs/PROJECT.md) — там обзор воркспейса (стек, под-проекты, слои, окружения, build/CI), а дальше иди по модулям в [`docs/modules/`](docs/modules/).

Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
## Быстрый старт

## Code scaffolding
```bash
npm ci
npm run start:social # ng serve social_platform --open
```

Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.

## Build

Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.

## Running unit tests

Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).

## Running end-to-end tests

Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.

## Further help

To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
Полный список скриптов и команд — в [`docs/PROJECT.md`](docs/PROJECT.md).
212 changes: 212 additions & 0 deletions docs/PROJECT.md

Large diffs are not rendered by default.

111 changes: 111 additions & 0 deletions docs/core/consts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
<!-- @format -->

# `@corelib` — consts

Все константы лежат в `projects/core/src/consts/` (вне `lib/`, отдельная иерархия). Не реэкспортируются из `core/src/public-api.ts` — потребители импортируют их через `@core/consts/...` (alias `@core/*` указывает на `projects/core/src/*`).

## Структура папок

```
core/src/consts/
filters/ # массивы для фильтров (feed, vacancies, ratings) — value/label/id
lists/ # справочники для select-полей (educations, languages, etc.)
navigation/ # элементы боковой/верхней навигации
other/ # всё, что не попало в другие группы (цвета, иконки, profile-fields, kanban-* — см. ниже)
```

---

## Правила нейминга

(Сохранено из удалённого `projects/core/src/consts/README.md`.)

### Имена файлов

- Формат: `feature.const.ts`
- Стиль: **kebab-case**
- Примеры: `navigation.const.ts`, `selects.const.ts`, `permissions.const.ts`

### Имена переменных

- Стиль: **camelCase**
- Если переменная — список, имя во **множественном числе**
- Имя отражает назначение
- Экспорт только через `export const`

```ts
export const navItems = [...];
```

---

## `consts/lists/` — справочники для `<app-select>`

Формат каждой константы: `{ id: number, value: string, label: string }[]` (иногда + дополнительные поля).

| Файл | Экспорт | Где используется |
| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- |
| `actiion-type-list.const.ts` | `actionTypeList` (3 элемента: action/call/meet) | Канбан task-detail (выбор типа задачи). |
| `direction-project-list.const.ts` | `directionProjectList` (8 направлений: Технология, IT, Транспорт, Хим Био, Дизайн, Мультимедиа, СоцТех, Урбанистика) | Создание/редактирование проекта. |
| `education-info-list.const.ts` | `educationUserType` (3) + `educationUserLevel` (5) | Profile edit — образование. |
| `language-info-list.const.ts` | `languageNamesList` | Profile edit — языки. |
| `mock-months-list.const.ts` | `mockMonthsList` | Месяцы для дат рождения и т. п. |
| `priority-info-list.const.ts` | `priorityInfoList` (6 приоритетов: бэклог/в ближайшие часы/высокий/средний/низкий/улучшение, с цветом и `priorityType` для бэка) | Канбан task-detail (выбор приоритета). |
| `resource-options-list.const.ts` | `resourceOptionsList` | Project edit — типы ресурсов. |
| `roles-members-list.const.ts` | `rolesMembersList` | Members filters / project team. |
| `track-project-list.const.ts` | `trackProjectList` | Программные треки. |
| `work-experience-list.const.ts` | `workExperienceList` | Vacancy / profile (опыт работы). |
| `work-format-list.const.ts` | `workFormatList` | Vacancy (формат работы — онлайн/гибрид/офис). |
| `work-schelude-list.const.ts` | `workScheludeList` (опечатка) | Vacancy (график). |

---

## `consts/filters/` — конфигурации фильтров

| Файл | Экспорт |
| --------------------------------- | ---------------------- |
| `feed-filter.const.ts` | `feedFilter` |
| `rating-filter.const.ts` | `ratingFilters` |
| `tags-filter.const.ts` | `tagsFilter` |
| `work-experience-filter.const.ts` | `workExperienceFilter` |
| `work-format-filter.const.ts` | `workFormatFilter` |
| `work-schedule-filter.const.ts` | `workScheduleFilter` |

Используются виджетами `widgets/feed-filter`, `widgets/projects-filter`, `widgets/vacancy-filter`. Структура — массив групп с фильтрами.

---

## `consts/navigation/` — элементы пошагового редактирования

| Файл | Экспорт | Что |
| ---------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `nav-profile-items.const.ts` | `navProfileItems` | Шаги редактирования профиля (`main` / `education` / `experience` / `achievements` / `additional`), каждый шаг → `{ step: EditStep, src: iconName, label: string }`. |
| `nav-project-items.const.ts` | `navProjectItems` | Шаги редактирования проекта (`main` / `contacts` / `achievements` / `vacancies` / `team` / `additional`). |

Тип `EditStep` импортируется из `projects/social_platform/src/app/api/project/project-step.service` — это ещё одна зависимость `core` → `social_platform`.

---

## `consts/other/`

| Файл | Экспорт | Что | Статус |
| ----------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
| `profile-fields.const.ts` | `profileFields` | Конфигурация полей профиля: `{ key, type: "array" \| "string" }[]`. Используется при сериализации формы edit. | актив |
| `quick-answers.const.ts` | `QuickAnswers` (PascalCase) | 5 готовых причин отказа от выполнения канбан-задачи. | **используется только канбаном** — модуль отключён |
| `tag-colors.const.ts` | `tagColors` | 10+ цветов для UI-тегов: `{ id, name: string, color: hex }`. | актив (используется в `<app-tag>`) |
| `trajectory-more.const.ts` | `trajectoryMore` | Items для меню "ещё" в траектории курсов. | актив |
| `kanban-column-info.const.ts` | `kanbanColumnInfo` | Опции dropdown для колонки канбана. | **kanban-only**, модуль отключён |
| `kanban-icons.const.ts` | `KanbanIcons` (PascalCase) | Иконки досок канбана. | **kanban-only**, модуль отключён |

---

## Как добавлять новую константу

1. Создать `<feature>.const.ts` в подходящей папке (`lists/` для справочников `<select>`, `filters/` для фильтров, `navigation/` для шагов нав-меню, `other/` для остального).
2. Имя файла — **kebab-case**, имя константы — **camelCase**.
3. Если константа — массив, имя во множественном числе.
4. Экспорт через `export const`. Никаких `export default`.
5. Если константа описывает выбор для `<app-select>` — структура `{ id, value, label }` плюс при необходимости `additionalInfo` для иконки/цвета.
6. Импортировать через alias: `import { foo } from "@core/consts/other/foo.const"`.

---
113 changes: 113 additions & 0 deletions docs/core/guards-models.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
<!-- @format -->

# `@corelib` — guards + models

## Guards

Все гарды лежат в `projects/core/src/lib/guards/`. Это `CanActivateFn` (новый Angular 14+ API), не `Injectable`-классы. Используются в `ui/routes/*.routes.ts`.

| Guard | Файл | Где используется |
| ------------------------------------------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------- |
| [`AuthRequiredGuard`](#authrequiredguard) | `guards/auth/auth-required.guard.ts` | Все приватные роуты внутри `office`. |
| [`ProfileEditRequiredGuard`](#profileeditrequiredguard) | `guards/profile-edit/profile-edit.guard.ts` | `/office/profile/:id/edit`. |
| [`ProjectEditRequiredGuard`](#projecteditrequiredguard) | `guards/projects-edit/projects-edit.guard.ts` | `/office/projects/:projectId/edit`. |
| ~~`KanbanBoardGuard`~~ | `guards/kanban/kanban.guard.ts` | **Не используется** — kanban-роуты закомментированы, см. [`docs/PROJECT.md`](../PROJECT.md). |

---

### AuthRequiredGuard

Гард на наличие сессии. Используется на корневом `office`-роуте.

**Логика**

1. Если `tokenService.getTokens() === null` → сразу `router.createUrlTree(["/auth/login"])`.
2. Иначе дёргает `authRepository.fetchProfile()`:
- если профиль приходит → `true`;
- если ошибка (401, network, etc.) → `router.navigateByUrl("/auth/login")` (важно: возвращается `Promise<boolean>` от `navigateByUrl`, не `UrlTree`).

**Зависимости**: `TokenService`, `AuthRepositoryPort`, `Router`.

---

### ProfileEditRequiredGuard

Не пускает редактировать чужой профиль.

**Логика**

```ts
const profileId = Number(route.paramMap.get("id"));
authRepository.fetchProfile().pipe(
map(
profile =>
profile.id === profileId ? true : router.createUrlTree([`/office/profile/${profileId}/`]) // редирект на просмотр
),
catchError(() => of(router.createUrlTree(["/auth/login"])))
);
```

Если `id` из URL не совпадает с `profile.id` — кидает на просмотр чужого профиля. Если профиль вообще не получили — на логин.

---

### ProjectEditRequiredGuard

Не пускает редактировать проект, который уже подан на партнёрскую программу.

**Логика**

```ts
const projectId = Number(route.paramMap.get("projectId"));
if (isNaN(projectId)) {
return of(router.createUrlTree(["/office/projects/my"]));
}

projectRepository.getOne(projectId).pipe(
map(project =>
project.partnerProgram?.isSubmitted
? router.createUrlTree([`/office/projects/${projectId}`]) // редирект на просмотр
: true
),
catchError(() => of(router.createUrlTree([`/office/projects/${projectId}`])))
);
```

> Бизнес-правило: `partnerProgram.isSubmitted === true` означает «уже подал, редактировать нельзя» — пользователя кидает на страницу просмотра.

---

## Models

`projects/core/src/lib/models/` — **набор интерфейсов и enum'ов общего назначения**.

| Файл | Экспорт | Что |
| ------------------------ | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | --- |
| `error/error-code.ts` | `enum ErrorCode { NOT_FOUND = "404", SERVER_ERROR = "500" }` | Используется `ErrorService` для построения URL `/error/<code>`. |
| `error/error-message.ts` | `enum ErrorMessage` | Все текстовые сообщения об ошибках на русском, сгруппированы по категориям: AUTH, VALIDATION, USER, рейтинг проектов. Полная таблица — ниже. |
| `http.model.ts` | `interface ApiError { detail: string }` | Типизация ошибок API: бэк отдаёт `{ detail: "..." }` для 4xx. | |

### ErrorMessage — все значения

| Ключ | Текст |
| ------------------------------ | -------------------------------------------------------------- |
| `AUTH_EMAIL_EXIST` | Аккаунт с таким email уже зарегистрирован |
| `AUTH_WRONG_AUTH` | Неправильный логин или пароль |
| `AUTH_WRONG_PASSWORD` | Неправильный пароль |
| `AUTH_EMAIL_NOT_EXIST` | Аккаунт с таким email не зарегистрирован |
| `VALIDATION_TOO_LONG` | Максимальная длина: |
| `VALIDATION_TOO_SHORT` | Минимальная длина: |
| `VALIDATION_REQUIRED` | Обязательное поле |
| `MINIMAL_AGE` | Минимальный возраст |
| `MAXIMAL_AGE` | Максимальный возраст |
| `INVALID_DATE` | Неправильный формат даты |
| `VALIDATION_LANGUAGE` | Используйте символы кириллического алфавита |
| `VALIDATION_EMAIL` | Введенное значение не соответствует формату email |
| `VALIDATION_PASSWORD_UNMATCH` | Пароли не совпадают |
| `EMPTY_AVATAR` | Выберите фото для профиля |
| `VALIDATION_PATTERN` | Введите корректную ссылку, начинающуюся с http:// или https:// |
| `USER_NOT_EXISTING` | По данной ссылке пользователь не найден |
| `USER_IS_LEADER` | Пользователь является лидером проекта |
| `USER_IS_MEMBER` | Пользователь уже является участником проекта |
| `VALIDATION_PROFILE_LINK` | Введенное значение не соответствует формату ссылки на профиль |
| `VALIDATION_UNFILLED_CRITERIA` | Не все критерии заполнены |
Loading