itube-specs 0.0.780 → 0.0.781
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -1
- package/services/__tests__/site-data.service.test.ts +61 -0
- package/services/api/authorization.service.ts +172 -0
- package/services/api/categories.service.ts +239 -0
- package/services/api/channels.service.ts +101 -0
- package/services/api/contacts.service.ts +22 -0
- package/services/api/dictionaries.service.ts +34 -0
- package/services/api/models.service.ts +315 -0
- package/services/api/playlists.service.ts +250 -0
- package/services/api/search.service.ts +63 -0
- package/services/api/videos.service.ts +558 -0
- package/services/site-data.service.ts +72 -0
- package/utils/__tests__/get-sorted-filter-groups.test.ts +28 -0
- package/utils/__tests__/parse-filter-categories.test.ts +21 -0
- package/utils/__tests__/sort-filter-radio-options.test.ts +23 -0
- package/utils/category-letter-groups/__tests__/group-by-first-letter.test.ts +42 -0
- package/utils/category-letter-groups/group-by-first-letter.ts +25 -0
- package/utils/filter-main/__tests__/build-filter-query.test.ts +56 -0
- package/utils/filter-main/__tests__/get-active-filter-values.test.ts +22 -0
- package/utils/filter-main/__tests__/parse-category-filter-values.test.ts +20 -0
- package/utils/filter-main/build-filter-query.ts +42 -0
- package/utils/filter-main/get-active-filter-values.ts +33 -0
- package/utils/filter-main/parse-category-filter-values.ts +15 -0
- package/utils/filter-slider/__tests__/build-range-filter-query.test.ts +39 -0
- package/utils/filter-slider/__tests__/get-slider-range-info.test.ts +28 -0
- package/utils/filter-slider/build-range-filter-query.ts +32 -0
- package/utils/filter-slider/get-slider-range-info.ts +28 -0
- package/utils/get-sorted-filter-groups.ts +13 -0
- package/utils/info-main/__tests__/group-parameters-by-group.test.ts +42 -0
- package/utils/info-main/group-parameters-by-group.ts +37 -0
- package/utils/iso-code-map.ts +2 -0
- package/utils/parse-filter-categories.ts +14 -0
- package/utils/player-channel/__tests__/get-name-initials.test.ts +24 -0
- package/utils/player-channel/get-name-initials.ts +11 -0
- package/utils/player-like/__tests__/apply-reaction.test.ts +28 -0
- package/utils/player-like/__tests__/get-reaction-percents.test.ts +16 -0
- package/utils/player-like/apply-reaction.ts +23 -0
- package/utils/player-like/get-reaction-percents.ts +19 -0
- package/utils/search-result/__tests__/build-search-tabs.test.ts +28 -0
- package/utils/search-result/build-search-tabs.ts +19 -0
- package/utils/section-seo-text/__tests__/split-text-by-keyword-links.test.ts +46 -0
- package/utils/section-seo-text/split-text-by-keyword-links.ts +60 -0
- package/utils/sort-filter-radio-options.ts +18 -0
- package/utils/ui-full-descr/__tests__/split-paragraphs.test.ts +24 -0
- package/utils/ui-full-descr/split-paragraphs.ts +12 -0
- package/utils/ui-pagination/__tests__/get-pagination-link.test.ts +24 -0
- package/utils/ui-pagination/__tests__/get-pagination-numbers.test.ts +18 -0
- package/utils/ui-pagination/get-pagination-link.ts +34 -0
- package/utils/ui-pagination/get-pagination-numbers.ts +14 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "itube-specs",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.781",
|
|
5
5
|
"main": "./nuxt.config.ts",
|
|
6
6
|
"types": "./types/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
@@ -39,12 +39,17 @@
|
|
|
39
39
|
"import": "./lib/index.ts",
|
|
40
40
|
"default": "./lib/index.ts"
|
|
41
41
|
},
|
|
42
|
+
"./services/*": "./services/*.ts",
|
|
43
|
+
"./composables/*": "./composables/*.ts",
|
|
44
|
+
"./utils/*": "./utils/*.ts",
|
|
42
45
|
"./*": "./*"
|
|
43
46
|
},
|
|
44
47
|
"files": [
|
|
45
48
|
"runtime/",
|
|
46
49
|
"components/",
|
|
47
50
|
"composables/",
|
|
51
|
+
"services/",
|
|
52
|
+
"utils/",
|
|
48
53
|
"types/",
|
|
49
54
|
"lib/",
|
|
50
55
|
"nuxt.config.ts"
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { SiteDataService } from '../site-data.service';
|
|
3
|
+
|
|
4
|
+
describe('SiteDataService', () => {
|
|
5
|
+
it('возвращает имя сервиса', () => {
|
|
6
|
+
expect(SiteDataService.getServiceName()).toBe('SiteDataService');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
it('пустые геттеры коллекций отдают [] до загрузки данных', () => {
|
|
10
|
+
expect(SiteDataService.getAntiAdblokDomains()).toEqual([]);
|
|
11
|
+
expect(SiteDataService.getSiteLanguages()).toEqual([]);
|
|
12
|
+
expect(SiteDataService.getSiteNiches()).toEqual([]);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('fetchSiteData', () => {
|
|
16
|
+
const fetchMock = vi.fn();
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
vi.stubGlobal('$fetch', fetchMock);
|
|
20
|
+
fetchMock.mockReset();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
vi.unstubAllGlobals();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('раскладывает ответы трёх эндпоинтов по геттерам', async () => {
|
|
28
|
+
fetchMock.mockImplementation((url: string) => {
|
|
29
|
+
if (url.endsWith('/v1/site')) {
|
|
30
|
+
return Promise.resolve({
|
|
31
|
+
data: { antiAdblockDomains: ['ads.example'], debugMode: false, enabled: true, recaptchaPublicKey: 'key' },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (url.endsWith('/v1/site/languages')) {
|
|
35
|
+
return Promise.resolve({ data: { items: [{ guid: 'l1', title: 'English' }] } });
|
|
36
|
+
}
|
|
37
|
+
if (url.endsWith('/v1/site/niches')) {
|
|
38
|
+
return Promise.resolve({ data: { items: [{ guid: 'n1', title: 'Gay' }] } });
|
|
39
|
+
}
|
|
40
|
+
return Promise.resolve({ data: {} });
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
await SiteDataService.fetchSiteData();
|
|
44
|
+
|
|
45
|
+
expect(SiteDataService.getAntiAdblokDomains()).toEqual(['ads.example']);
|
|
46
|
+
expect(SiteDataService.isSiteEnabled()).toBe(true);
|
|
47
|
+
expect(SiteDataService.getSiteLanguages()).toEqual([{ guid: 'l1', title: 'English' }]);
|
|
48
|
+
expect(SiteDataService.getSiteNiches()).toEqual([{ guid: 'n1', title: 'Gay' }]);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('ошибка запроса не пробрасывается наружу', async () => {
|
|
52
|
+
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
53
|
+
fetchMock.mockRejectedValue(new Error('network'));
|
|
54
|
+
|
|
55
|
+
await expect(SiteDataService.fetchSiteData()).resolves.toBeUndefined();
|
|
56
|
+
expect(consoleSpy).toHaveBeenCalled();
|
|
57
|
+
|
|
58
|
+
consoleSpy.mockRestore();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
IRecoveryPasswordForm,
|
|
3
|
+
IProfileData,
|
|
4
|
+
IChangePasswordForm,
|
|
5
|
+
ILoginForm,
|
|
6
|
+
IPasswordForm,
|
|
7
|
+
IRegistrateForm,
|
|
8
|
+
IChangeEmail
|
|
9
|
+
} from '../../types';
|
|
10
|
+
import { ApiHelper } from '../../runtime';
|
|
11
|
+
|
|
12
|
+
/** Сервис для работы с API авторизации */
|
|
13
|
+
export class AuthorizationApiService {
|
|
14
|
+
static async recoveryPassword(data: IRecoveryPasswordForm): Promise<any> {
|
|
15
|
+
return await ApiHelper.fetch('/authorization/recovery-password', {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
headers: {
|
|
18
|
+
'X-Cache-Time': 259200,
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
body: data,
|
|
22
|
+
},
|
|
23
|
+
useRuntimeConfig(),
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
static async changePassword(data: IChangePasswordForm): Promise<any> {
|
|
27
|
+
return await ApiHelper.fetch('/authorization/change-password', {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers: {
|
|
30
|
+
'X-Cache-Time': 259200,
|
|
31
|
+
'Content-Type': 'application/json',
|
|
32
|
+
},
|
|
33
|
+
body: data,
|
|
34
|
+
},
|
|
35
|
+
useRuntimeConfig(),
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
static async changeEmail(data: IChangeEmail): Promise<any> {
|
|
39
|
+
return await ApiHelper.fetch('/authorization/change-email', {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
headers: {
|
|
42
|
+
'X-Cache-Time': 259200,
|
|
43
|
+
'Content-Type': 'application/json',
|
|
44
|
+
},
|
|
45
|
+
body: data,
|
|
46
|
+
},
|
|
47
|
+
useRuntimeConfig(),
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
static async postProfile(data: FormData): Promise<any> {
|
|
51
|
+
return await ApiHelper.fetch('/authorization/post-profile', {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
headers: {
|
|
54
|
+
'X-Cache-Time': 259200,
|
|
55
|
+
},
|
|
56
|
+
body: data,
|
|
57
|
+
},
|
|
58
|
+
useRuntimeConfig(),
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static async getProfile(): Promise<IProfileData | null> {
|
|
63
|
+
return await ApiHelper.fetch(
|
|
64
|
+
'/authorization/get-profile',
|
|
65
|
+
{
|
|
66
|
+
method: 'GET',
|
|
67
|
+
headers: {
|
|
68
|
+
'X-Cache-Time': 259200,
|
|
69
|
+
'Content-Type': 'application/json',
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
useRuntimeConfig(),
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static async password(
|
|
77
|
+
data: IPasswordForm,
|
|
78
|
+
): Promise<any> {
|
|
79
|
+
return await ApiHelper.fetch(
|
|
80
|
+
'/authorization/password',
|
|
81
|
+
{
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers: {
|
|
84
|
+
'X-Cache-Time': 259200,
|
|
85
|
+
'Content-Type': 'application/json',
|
|
86
|
+
},
|
|
87
|
+
body: data,
|
|
88
|
+
},
|
|
89
|
+
useRuntimeConfig(),
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
static async deleteProfile(): Promise<any> {
|
|
94
|
+
return await ApiHelper.fetch(
|
|
95
|
+
'/authorization/delete-profile',
|
|
96
|
+
{
|
|
97
|
+
method: 'DELETE',
|
|
98
|
+
headers: {
|
|
99
|
+
'X-Cache-Time': 259200,
|
|
100
|
+
'Content-Type': 'application/json',
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
useRuntimeConfig(),
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static async deleteAvatar(): Promise<any> {
|
|
108
|
+
return await ApiHelper.fetch(
|
|
109
|
+
'/authorization/profile-avatar',
|
|
110
|
+
{
|
|
111
|
+
method: 'DELETE',
|
|
112
|
+
headers: {
|
|
113
|
+
'X-Cache-Time': 259200,
|
|
114
|
+
'Content-Type': 'application/json',
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
useRuntimeConfig(),
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static async login(
|
|
122
|
+
data: ILoginForm,
|
|
123
|
+
): Promise<any> {
|
|
124
|
+
return await ApiHelper.fetch(
|
|
125
|
+
'/authorization/login',
|
|
126
|
+
{
|
|
127
|
+
method: 'POST',
|
|
128
|
+
headers: {
|
|
129
|
+
'X-Cache-Time': 259200,
|
|
130
|
+
'Content-Type': 'application/json',
|
|
131
|
+
},
|
|
132
|
+
body: data,
|
|
133
|
+
},
|
|
134
|
+
useRuntimeConfig(),
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
static async register(
|
|
139
|
+
data: IRegistrateForm,
|
|
140
|
+
): Promise<any> {
|
|
141
|
+
return await ApiHelper.fetch(
|
|
142
|
+
'/authorization/register',
|
|
143
|
+
{
|
|
144
|
+
method: 'POST',
|
|
145
|
+
headers: {
|
|
146
|
+
'X-Cache-Time': 259200,
|
|
147
|
+
'Content-Type': 'application/json',
|
|
148
|
+
},
|
|
149
|
+
body: data
|
|
150
|
+
},
|
|
151
|
+
useRuntimeConfig(),
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
static async confirmRegistration(token: string): Promise<any> {
|
|
156
|
+
return await ApiHelper.fetch(
|
|
157
|
+
'/authorization/confirm',
|
|
158
|
+
{
|
|
159
|
+
method: 'GET',
|
|
160
|
+
headers: {
|
|
161
|
+
'X-Cache-Time': 259200,
|
|
162
|
+
'X-Domain': useRuntimeConfig()?.public?.xDomain || useAppConfig().xDomain,
|
|
163
|
+
'Content-Type': 'application/json',
|
|
164
|
+
},
|
|
165
|
+
params: {
|
|
166
|
+
token,
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
useRuntimeConfig(),
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import type { Language } from '../../runtime';
|
|
2
|
+
import { ApiHelper, toHeaderLanguage } from '../../runtime';
|
|
3
|
+
import type {
|
|
4
|
+
IRelatedPhrases,
|
|
5
|
+
ICategoryCard,
|
|
6
|
+
IGroupCategories,
|
|
7
|
+
ICardInfo, IChipsItem,
|
|
8
|
+
} from '../../types';
|
|
9
|
+
|
|
10
|
+
/** Сервис для работы с API категорий */
|
|
11
|
+
export class CategoriesApiService {
|
|
12
|
+
static async getCategoriesByName(
|
|
13
|
+
lang: Language,
|
|
14
|
+
name: string,
|
|
15
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
16
|
+
): Promise<ICardInfo> {
|
|
17
|
+
return await ApiHelper.fetch(
|
|
18
|
+
'/categories/get-categories-by-name',
|
|
19
|
+
{
|
|
20
|
+
method: 'GET',
|
|
21
|
+
headers: {
|
|
22
|
+
'X-Niche': niche,
|
|
23
|
+
'X-Language': toHeaderLanguage(lang),
|
|
24
|
+
'X-Cache-Time': 259200,
|
|
25
|
+
'Content-Type': 'application/json',
|
|
26
|
+
},
|
|
27
|
+
params: {
|
|
28
|
+
name: name,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
useRuntimeConfig(),
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static async getCategoriesByPhrase(
|
|
36
|
+
lang: Language,
|
|
37
|
+
phrase: string,
|
|
38
|
+
phrasesLimit: number,
|
|
39
|
+
modelsLimit: number,
|
|
40
|
+
categoriesLimit: number,
|
|
41
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
42
|
+
): Promise<Array<ICategoryCard>> {
|
|
43
|
+
return await ApiHelper.fetch(
|
|
44
|
+
'/categories/get-categories-by-phrase',
|
|
45
|
+
{
|
|
46
|
+
method: 'GET',
|
|
47
|
+
headers: {
|
|
48
|
+
'X-Niche': niche,
|
|
49
|
+
'X-Language': toHeaderLanguage(lang),
|
|
50
|
+
'X-Cache-Time': 259200,
|
|
51
|
+
'Content-Type': 'application/json',
|
|
52
|
+
},
|
|
53
|
+
params: {
|
|
54
|
+
query: phrase,
|
|
55
|
+
'phrases-limit': phrasesLimit,
|
|
56
|
+
'models-limit': modelsLimit,
|
|
57
|
+
'categories-limit': categoriesLimit,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
useRuntimeConfig(),
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static async getTopRandomFooter(
|
|
65
|
+
lang: Language,
|
|
66
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
67
|
+
limit? = 29, // выводим максимально возможное колличество, из расчета 6 колонок по 5 рядов, и минус 1 это All categories
|
|
68
|
+
): Promise<Array<IChipsItem>> {
|
|
69
|
+
return await ApiHelper.fetch(
|
|
70
|
+
'/categories/get-top-random-footer',
|
|
71
|
+
{
|
|
72
|
+
method: 'GET',
|
|
73
|
+
headers: {
|
|
74
|
+
'X-Niche': niche,
|
|
75
|
+
'X-Language': toHeaderLanguage(lang),
|
|
76
|
+
'X-Cache-Time': 259200,
|
|
77
|
+
'Content-Type': 'application/json',
|
|
78
|
+
},
|
|
79
|
+
params: {
|
|
80
|
+
limit: limit,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
useRuntimeConfig(),
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
static async getTopRandomFull(
|
|
88
|
+
lang: Language,
|
|
89
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
90
|
+
limit? = 128,
|
|
91
|
+
): Promise<Array<ICategoryCard>> {
|
|
92
|
+
return await ApiHelper.fetch(
|
|
93
|
+
'/categories/get-top-random-full',
|
|
94
|
+
{
|
|
95
|
+
method: 'GET',
|
|
96
|
+
headers: {
|
|
97
|
+
'X-Niche': niche,
|
|
98
|
+
'X-Language': toHeaderLanguage(lang),
|
|
99
|
+
'X-Cache-Time': 259200,
|
|
100
|
+
'Content-Type': 'application/json',
|
|
101
|
+
},
|
|
102
|
+
params: {
|
|
103
|
+
limit: limit,
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
useRuntimeConfig(),
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
static async getRelatedCategories(
|
|
111
|
+
lang: Language,
|
|
112
|
+
name: string,
|
|
113
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
114
|
+
limit? = 50,
|
|
115
|
+
): Promise<IRelatedPhrases> {
|
|
116
|
+
return await ApiHelper.fetch(
|
|
117
|
+
'/categories/related-phrases-by-name',
|
|
118
|
+
{
|
|
119
|
+
method: 'GET',
|
|
120
|
+
headers: {
|
|
121
|
+
'X-Niche': niche,
|
|
122
|
+
'X-Language': toHeaderLanguage(lang),
|
|
123
|
+
'X-Cache-Time': 259200,
|
|
124
|
+
'Content-Type': 'application/json',
|
|
125
|
+
},
|
|
126
|
+
params: {
|
|
127
|
+
limit: limit,
|
|
128
|
+
name: name,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
useRuntimeConfig(),
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
static async getTopRandom(
|
|
136
|
+
lang: Language,
|
|
137
|
+
cacheId = 'default',
|
|
138
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
139
|
+
limit? = 20,
|
|
140
|
+
): Promise<Array<IChipsItem>> {
|
|
141
|
+
return await ApiHelper.fetch(
|
|
142
|
+
'/categories/get-top-random',
|
|
143
|
+
{
|
|
144
|
+
method: 'GET',
|
|
145
|
+
headers: {
|
|
146
|
+
'X-Niche': niche,
|
|
147
|
+
'X-Cache-Extra': cacheId,
|
|
148
|
+
'X-Language': toHeaderLanguage(lang),
|
|
149
|
+
'X-Cache-Time': 604800,
|
|
150
|
+
'Content-Type': 'application/json',
|
|
151
|
+
},
|
|
152
|
+
params: {
|
|
153
|
+
limit: limit,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
useRuntimeConfig(),
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
static async getListGroupedByLetter(
|
|
161
|
+
lang: Language,
|
|
162
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
163
|
+
): Promise<Record<string, Array<ICategoryCard>>> {
|
|
164
|
+
return await ApiHelper.fetch(
|
|
165
|
+
'/categories/list-grouped-by-letter',
|
|
166
|
+
{
|
|
167
|
+
method: 'GET',
|
|
168
|
+
headers: {
|
|
169
|
+
'X-Niche': niche,
|
|
170
|
+
'X-Language': toHeaderLanguage(lang),
|
|
171
|
+
'X-Cache-Time': 259200,
|
|
172
|
+
'Content-Type': 'application/json',
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
useRuntimeConfig(),
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static async getListGroupedByLetterChips(
|
|
180
|
+
lang: Language,
|
|
181
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
182
|
+
): Promise<Record<string, Array<ICategoryCard>>> {
|
|
183
|
+
return await ApiHelper.fetch(
|
|
184
|
+
'/categories/list-grouped-by-letter-chips',
|
|
185
|
+
{
|
|
186
|
+
method: 'GET',
|
|
187
|
+
headers: {
|
|
188
|
+
'X-Niche': niche,
|
|
189
|
+
'X-Language': toHeaderLanguage(lang),
|
|
190
|
+
'X-Cache-Time': 259200,
|
|
191
|
+
'Content-Type': 'application/json',
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
useRuntimeConfig(),
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
static async getCategoriesByLetter(
|
|
199
|
+
lang: Language,
|
|
200
|
+
letter: string,
|
|
201
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
202
|
+
): Promise<Array<ICategoryCard>> {
|
|
203
|
+
return await ApiHelper.fetch(
|
|
204
|
+
'/categories/list-by-letter',
|
|
205
|
+
{
|
|
206
|
+
method: 'POST',
|
|
207
|
+
headers: {
|
|
208
|
+
'X-Niche': niche,
|
|
209
|
+
'X-Language': toHeaderLanguage(lang),
|
|
210
|
+
'X-Cache-Time': 259200,
|
|
211
|
+
'Content-Type': 'application/json',
|
|
212
|
+
},
|
|
213
|
+
params: {
|
|
214
|
+
letter,
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
useRuntimeConfig(),
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
static async getGroupsCategories(
|
|
222
|
+
lang: Language,
|
|
223
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
224
|
+
): Promise<IGroupCategories[]> {
|
|
225
|
+
return await ApiHelper.fetch(
|
|
226
|
+
'/categories/group-categories',
|
|
227
|
+
{
|
|
228
|
+
method: 'GET',
|
|
229
|
+
headers: {
|
|
230
|
+
'X-Niche': niche,
|
|
231
|
+
'X-Language': toHeaderLanguage(lang),
|
|
232
|
+
'X-Cache-Time': 259200,
|
|
233
|
+
'Content-Type': 'application/json',
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
useRuntimeConfig(),
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { RequestPagination, PaginatedResponse, IChannelCard, ICardInfo } from '../../types';
|
|
2
|
+
import type { Language } from '../../runtime';
|
|
3
|
+
import { ApiHelper, toHeaderLanguage } from '../../runtime';
|
|
4
|
+
|
|
5
|
+
/** Сервис для работы с API каналов */
|
|
6
|
+
export class ChannelsApiService {
|
|
7
|
+
static async getChannelsByNetworkName(
|
|
8
|
+
lang: Language,
|
|
9
|
+
pagination: RequestPagination,
|
|
10
|
+
slug: string,
|
|
11
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
12
|
+
): Promise<PaginatedResponse<IChannelCard>> {
|
|
13
|
+
return await ApiHelper.fetch(
|
|
14
|
+
`/channels/channels-by-network-name/${slug}`,
|
|
15
|
+
{
|
|
16
|
+
method: 'GET',
|
|
17
|
+
headers: {
|
|
18
|
+
'X-Niche': niche,
|
|
19
|
+
'X-Language': toHeaderLanguage(lang),
|
|
20
|
+
'X-Cache-Time': 259200,
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
'Access-Control-Allow-Origin': '*',
|
|
23
|
+
},
|
|
24
|
+
params: {
|
|
25
|
+
...pagination,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
useRuntimeConfig(),
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
static async getChannelsByModel(
|
|
32
|
+
lang: Language,
|
|
33
|
+
pagination: RequestPagination,
|
|
34
|
+
slug: string,
|
|
35
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
36
|
+
): Promise<PaginatedResponse<IChannelCard>> {
|
|
37
|
+
return await ApiHelper.fetch(
|
|
38
|
+
`/channels/channels-by-model/${slug}`,
|
|
39
|
+
{
|
|
40
|
+
method: 'GET',
|
|
41
|
+
headers: {
|
|
42
|
+
'X-Niche': niche,
|
|
43
|
+
'X-Language': toHeaderLanguage(lang),
|
|
44
|
+
'X-Cache-Time': 259200,
|
|
45
|
+
'Content-Type': 'application/json',
|
|
46
|
+
'Access-Control-Allow-Origin': '*',
|
|
47
|
+
},
|
|
48
|
+
params: {
|
|
49
|
+
...pagination,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
useRuntimeConfig(),
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
static async getChannelsByName(
|
|
56
|
+
lang: Language,
|
|
57
|
+
slug: string,
|
|
58
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
59
|
+
): Promise<ICardInfo> {
|
|
60
|
+
return await ApiHelper.fetch(
|
|
61
|
+
`/channels/channels-by-name/${slug}`,
|
|
62
|
+
{
|
|
63
|
+
method: 'GET',
|
|
64
|
+
headers: {
|
|
65
|
+
'X-Niche': niche,
|
|
66
|
+
'X-Language': toHeaderLanguage(lang),
|
|
67
|
+
'X-Cache-Time': 259200,
|
|
68
|
+
'Content-Type': 'application/json',
|
|
69
|
+
'Access-Control-Allow-Origin': '*',
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
useRuntimeConfig(),
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static async getChannels(
|
|
77
|
+
lang: Language,
|
|
78
|
+
pagination: RequestPagination,
|
|
79
|
+
order: string,
|
|
80
|
+
niche? = NicheHelper.getSiteDefaultNiche(),
|
|
81
|
+
): Promise<PaginatedResponse<IChannelCard>> {
|
|
82
|
+
return await ApiHelper.fetch(
|
|
83
|
+
'/channels/channels',
|
|
84
|
+
{
|
|
85
|
+
method: 'GET',
|
|
86
|
+
headers: {
|
|
87
|
+
'X-Niche': niche,
|
|
88
|
+
'X-Language': toHeaderLanguage(lang),
|
|
89
|
+
'X-Cache-Time': 259200,
|
|
90
|
+
'Content-Type': 'application/json',
|
|
91
|
+
'Access-Control-Allow-Origin': '*',
|
|
92
|
+
},
|
|
93
|
+
params: {
|
|
94
|
+
...pagination,
|
|
95
|
+
order,
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
useRuntimeConfig(),
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { IContactsForm } from '../../types';
|
|
2
|
+
import { ApiHelper } from '../../runtime';
|
|
3
|
+
|
|
4
|
+
/** Сервис для работы с API контакты */
|
|
5
|
+
export class ContactsApiService {
|
|
6
|
+
static async email(
|
|
7
|
+
data: IContactsForm,
|
|
8
|
+
): Promise<any> {
|
|
9
|
+
return await ApiHelper.fetch(
|
|
10
|
+
'/contacts/email',
|
|
11
|
+
{
|
|
12
|
+
method: 'POST',
|
|
13
|
+
headers: {
|
|
14
|
+
'X-Cache-Time': 259200,
|
|
15
|
+
'Content-Type': 'application/json',
|
|
16
|
+
},
|
|
17
|
+
body: data
|
|
18
|
+
},
|
|
19
|
+
useRuntimeConfig(),
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ICountries, IGenders } from '../../types';
|
|
2
|
+
import { ApiHelper } from '../../runtime';
|
|
3
|
+
|
|
4
|
+
/** Сервис для работы с API справочников (страны, гендеры) */
|
|
5
|
+
export class DictionariesApiService {
|
|
6
|
+
static async getCountries(): Promise<ICountries> {
|
|
7
|
+
return await ApiHelper.fetch(
|
|
8
|
+
'/dictionaries/countries',
|
|
9
|
+
{
|
|
10
|
+
method: 'GET',
|
|
11
|
+
headers: {
|
|
12
|
+
'X-Cache-Time': 259200,
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
'Access-Control-Allow-Origin': '*',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
useRuntimeConfig(),
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
static async getGenders(): Promise<IGenders> {
|
|
21
|
+
return await ApiHelper.fetch(
|
|
22
|
+
'/dictionaries/genders',
|
|
23
|
+
{
|
|
24
|
+
method: 'GET',
|
|
25
|
+
headers: {
|
|
26
|
+
'X-Cache-Time': 259200,
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
'Access-Control-Allow-Origin': '*',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
useRuntimeConfig(),
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
}
|