Skip to content
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ jobs:
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v2
- name: Use Node.js 16.x
uses: actions/setup-node@v2
- uses: actions/checkout@v4
- name: Use Node.js 18.x
uses: actions/setup-node@v4
with:
node-version: 18.13
cache: "npm"
Expand Down
233 changes: 220 additions & 13 deletions projects/core/README.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,234 @@
<!-- @format -->

# Core
# Core Library Documentation

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.0.0.
Основная библиотека Angular приложения, содержащая общие сервисы, модели, пайпы, интерцепторы и константы.

## Code scaffolding
## Структура проекта

Run `ng generate component component-name --project core` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project core`.
src/
├── consts/ # Константы и списки данных
├── environments/ # Конфигурация окружения
├── lib/
│ ├── interceptors/ # HTTP интерцепторы
│ ├── models/ # Модели данных
│ ├── pipes/ # Пайпы для трансформации данных
│ ├── providers/ # Провайдеры и токены
│ └── services/ # Сервисы
└── public-api.ts # Публичный API модуля

> Note: Don't forget to add `--project core` or else it will be added to the default project in your `angular.json` file.
## Основные компоненты

## Build
### 🔧 Сервисы (Services)

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

## Publishing
Базовый сервис для работы с HTTP API.

After building your library with `ng build core`, go to the dist folder `cd dist/core` and run `npm publish`.
**Методы:**

## Running unit tests
- `get<T>(path, params?, options?)` - GET запрос
- `post<T>(path, body)` - POST запрос
- `put<T>(path, body)` - PUT запрос
- `patch<T>(path, body)` - PATCH запрос
- `delete<T>(path, params?)` - DELETE запрос

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

## Further help
Расширенный API сервис для работы с Skills API.

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.
#### TokenService

Управление JWT токенами аутентификации.

**Методы:**

- `getTokens()` - Получить токены из cookies
- `memTokens(tokens)` - Сохранить токены в cookies
- `clearTokens()` - Очистить токены
- `refreshTokens()` - Обновить токены

#### ValidationService

Сервис для валидации форм.

**Валидаторы:**

- `useMatchValidator(left, right)` - Проверка совпадения полей
- `useDateFormatValidator()` - Валидация формата даты
- `useAgeValidator(age)` - Проверка возраста
- `useLanguageValidator()` - Проверка русского языка
- `getFormValidation(form)` - Валидация всей формы

#### YtExtractService

Извлечение и обработка YouTube ссылок.

#### SubscriptionPlansService

Управление подписками пользователей.

### 🔄 Интерцепторы (Interceptors)

#### BearerTokenInterceptor

Автоматически добавляет Bearer токен к HTTP запросам и обрабатывает обновление токенов при 401 ошибке.

#### CamelcaseInterceptor

Преобразует snake_case в camelCase для запросов и ответов API.

### 🔧 Пайпы (Pipes)

#### Валидация форм

- `ControlErrorPipe` - Проверка ошибок в контролах форм
- `FormControlPipe` - Приведение AbstractControl к FormControl

#### Работа с датами

- `DayjsPipe` - Форматирование дат с помощью dayjs
- `YearsFromBirthdayPipe` - Вычисление возраста по дате рождения

#### Форматирование текста

- `ParseBreaksPipe` - Замена \n на <br>
- `ParseLinksPipe` - Преобразование ссылок в кликабельные
- `CapitalizePipe` - Капитализация первой буквы
- `PluralizePipe` - Склонение слов по числам (русский язык)

#### Трансформация данных

- `SalaryTransformPipe` - Форматирование зарплаты
- `LinkTransformPipe` - Извлечение домена из ссылки

### 🎯 Провайдеры (Providers)

#### API_URL

Токен для инъекции базового URL API.

#### SKILLS_API_URL

Токен для инъекции URL Skills API.

#### PRODUCTION

Токен для определения production окружения.

### 📋 Константы (Constants)

#### Навигация

- `navProjectItems` - Элементы навигации для проектов
- `navProfileItems` - Элементы навигации для профиля

#### Списки данных

- `directionProjectList` - Направления проектов
- `trackProjectList` - Треки проектов
- `experienceList` - Уровни опыта
- `formatList` - Форматы работы
- `scheludeList` - Графики работы
- `rolesMembersList` - Роли участников
- `languageNamesList` - Названия языков
- `languageLevelsList` - Уровни языков
- `educationUserType` - Типы образования
- `educationUserLevel` - Уровни образования
- `yearList` - Список годов
- `ratingFiltersList` - Фильтры рейтинга
- `filterTags` - Теги фильтров

#### Профиль

- `fieldsProfile` - Поля профиля пользователя
- `trajectoryMore` - Дополнительная информация о траектории

## Использование

### Настройка провайдеров

\`\`\`typescript
providers: [
{ provide: API_URL, useValue: 'https://api.example.com' },
{ provide: SKILLS_API_URL, useValue: 'https://skills-api.example.com' },
{ provide: PRODUCTION, useValue: environment.production }
]
\`\`\`

### Примеры использования

#### Работа с API

\`\`\`typescript
constructor(private apiService: ApiService) {}

loadData() {
return this.apiService.get<User[]>('/users');
}
\`\`\`

#### Валидация форм

\`\`\`typescript
constructor(private validationService: ValidationService) {}

createForm() {
return this.fb.group({
password: ['', Validators.required],
confirmPassword: ['', Validators.required]
}, {
validators: this.validationService.useMatchValidator('password', 'confirmPassword')
});
}
\`\`\`

#### Использование пайпов в шаблонах

\`\`\`html

<!-- Проверка ошибок -->
<div *ngIf="form.get('email') | controlError">
Поле обязательно для заполнения
</div>

<!-- Форматирование даты -->

<span>{{ user.createdAt | dayjs:'format':'DD.MM.YYYY' }}</span>

<!-- Склонение слов -->

<span>{{ count }} {{ count | pluralize:['проект', 'проекта', 'проектов'] }}</span>
\`\`\`

## Зависимости

- `@angular/core`
- `@angular/common/http`
- `@angular/forms`
- `dayjs` - Работа с датами
- `js-cookie` - Управление cookies
- `class-transformer` - Трансформация объектов
- `linkify-string` - Обработка ссылок
- `snakecase-keys` - Преобразование ключей в snake_case
- `camelcase-keys` - Преобразование ключей в camelCase

## Тестирование

Все сервисы и пайпы покрыты unit тестами с использованием Jasmine и Karma.

Запуск тестов:
\`\`\`bash
ng test core
\`\`\`

## Сборка

Для сборки библиотеки:
\`\`\`bash
ng build core
\`\`\`

Для production сборки:
\`\`\`bash
ng build core --configuration production
34 changes: 21 additions & 13 deletions projects/core/src/consts/fieldsProfile.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,25 @@
/** @format */

/**
* Конфигурация полей профиля пользователя
* Определяет какие поля являются массивами, а какие строками
* Используется для валидации и обработки данных профиля
*/
export const fieldsProfile = [
{ key: "education", type: "array" },
{ key: "workExperience", type: "array" },
{ key: "userLanguages", type: "array" },
{ key: "achievements", type: "array" },
{ key: "skills", type: "array" },
{ key: "birthday", type: "string" },
{ key: "phoneNumber", type: "string" },
{ key: "speciality", type: "string" },
{ key: "aboutMe", type: "string" },
{ key: "avatar", type: "string" },
{ key: "city", type: "string" },
{ key: "firstName", type: "string" },
{ key: "lastName", type: "string" },
// Поля-массивы (содержат несколько элементов)
{ key: "education", type: "array" }, // Образование
{ key: "workExperience", type: "array" }, // Опыт работы
{ key: "userLanguages", type: "array" }, // Языки пользователя
{ key: "achievements", type: "array" }, // Достижения
{ key: "skills", type: "array" }, // Навыки

// Строковые поля (одиночные значения)
{ key: "birthday", type: "string" }, // Дата рождения
{ key: "phoneNumber", type: "string" }, // Номер телефона
{ key: "speciality", type: "string" }, // Специальность
{ key: "aboutMe", type: "string" }, // О себе
{ key: "avatar", type: "string" }, // Аватар (URL)
{ key: "city", type: "string" }, // Город
{ key: "firstName", type: "string" }, // Имя
{ key: "lastName", type: "string" }, // Фамилия
];
8 changes: 8 additions & 0 deletions projects/core/src/consts/filter-experience.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/** @format */

export const filterExperience = [
{ label: "Без опыта", value: "no_experience" },
{ label: "До 1 года", value: "up_to_a_year" },
{ label: "От 1 года до 3 лет", value: "from_one_to_three_years" },
{ label: "От 3 лет и более", value: "from_three_years" },
];
7 changes: 7 additions & 0 deletions projects/core/src/consts/filter-work-format.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/** @format */

export const filterWorkFormat = [
{ label: "Удаленная работа", value: "remote" },
{ label: "Работа в офисе", value: "office" },
{ label: "Смешанный формат", value: "hybrid" },
];
9 changes: 9 additions & 0 deletions projects/core/src/consts/filter-work-schedule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/** @format */

export const filterWorkSchedule = [
{ label: "Полный рабочий день", value: "full_time" },
{ label: "Сменный график", value: "shift_work" },
{ label: "Гибкий график", value: "flexible_schedule" },
{ label: "Частичная занятость", value: "part_time" },
{ label: "Стажировка", value: "internship" },
];
10 changes: 7 additions & 3 deletions projects/core/src/consts/list-direction-project.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
/** @format */

/**
* Список направлений проектов
* Используется в формах создания и редактирования проектов
*/
export const directionProjectList = [
{
id: 0,
value: "Технология",
label: "Технология",
value: "Технология", // Значение для отправки на сервер
label: "Технология", // Отображаемый текст
},
{
id: 1,
Expand All @@ -18,7 +22,7 @@ export const directionProjectList = [
},
{
id: 3,
value: "им Био",
value: "им Био", // Возможно опечатка, должно быть "Хим Био"
label: "Хим Био",
},
{
Expand Down
2 changes: 1 addition & 1 deletion projects/core/src/consts/list-years.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,6 @@ export const yearList = [
{
value: 2025,
id: 25,
label: "н.в",
label: "настоящее время",
},
];
Loading
Loading