ad2app-lib 1.0.0

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.
Files changed (140) hide show
  1. package/README.md +37 -0
  2. package/dist/api/apiDriver.d.ts +16 -0
  3. package/dist/api/apiDriver.js +40 -0
  4. package/dist/api/apiUtils.d.ts +0 -0
  5. package/dist/api/apiUtils.js +31 -0
  6. package/dist/api/index.d.ts +2 -0
  7. package/dist/api/index.js +18 -0
  8. package/dist/api/utils.d.ts +7 -0
  9. package/dist/api/utils.js +34 -0
  10. package/dist/types/I_Agency.d.ts +9 -0
  11. package/dist/types/I_Agency.js +12 -0
  12. package/dist/types/I_Campaign.d.ts +76 -0
  13. package/dist/types/I_Campaign.js +176 -0
  14. package/dist/types/I_CampaignCollaborationMethod.d.ts +11 -0
  15. package/dist/types/I_CampaignCollaborationMethod.js +30 -0
  16. package/dist/types/I_CampaignDeadline.d.ts +29 -0
  17. package/dist/types/I_CampaignDeadline.js +80 -0
  18. package/dist/types/I_CampaignGoal.d.ts +11 -0
  19. package/dist/types/I_CampaignGoal.js +30 -0
  20. package/dist/types/I_Influencer.d.ts +37 -0
  21. package/dist/types/I_Influencer.js +87 -0
  22. package/dist/types/I_InfluencersCategories.d.ts +26 -0
  23. package/dist/types/I_InfluencersCategories.js +72 -0
  24. package/dist/types/I_InfluencersLists.d.ts +68 -0
  25. package/dist/types/I_InfluencersLists.js +95 -0
  26. package/dist/types/I_InfluencersProperties.d.ts +40 -0
  27. package/dist/types/I_InfluencersProperties.js +95 -0
  28. package/dist/types/I_Item.d.ts +11 -0
  29. package/dist/types/I_Item.js +17 -0
  30. package/dist/types/I_List.d.ts +8 -0
  31. package/dist/types/I_List.js +11 -0
  32. package/dist/types/I_Offer.d.ts +63 -0
  33. package/dist/types/I_Offer.js +79 -0
  34. package/dist/types/I_PaginatedList.d.ts +10 -0
  35. package/dist/types/I_PaginatedList.js +13 -0
  36. package/dist/types/I_Pagination.d.ts +7 -0
  37. package/dist/types/I_Pagination.js +12 -0
  38. package/dist/types/I_Queue.d.ts +25 -0
  39. package/dist/types/I_Queue.js +54 -0
  40. package/dist/types/I_Report.d.ts +11 -0
  41. package/dist/types/I_Report.js +14 -0
  42. package/dist/types/I_ResponseMessage.d.ts +6 -0
  43. package/dist/types/I_ResponseMessage.js +10 -0
  44. package/dist/types/I_SM_Platform.d.ts +4 -0
  45. package/dist/types/I_SM_Platform.js +8 -0
  46. package/dist/types/I_ScrapperLog.d.ts +15 -0
  47. package/dist/types/I_ScrapperLog.js +9 -0
  48. package/dist/types/I_Scrappers.d.ts +35 -0
  49. package/dist/types/I_Scrappers.js +11 -0
  50. package/dist/types/I_ScrappingAccount.d.ts +10 -0
  51. package/dist/types/I_ScrappingAccount.js +6 -0
  52. package/dist/types/I_ScrappingMachine.d.ts +29 -0
  53. package/dist/types/I_ScrappingMachine.js +46 -0
  54. package/dist/types/I_ScrappingMachineProcess.d.ts +22 -0
  55. package/dist/types/I_ScrappingMachineProcess.js +46 -0
  56. package/dist/types/I_ScrappingServiceMessages.d.ts +31 -0
  57. package/dist/types/I_ScrappingServiceMessages.js +2 -0
  58. package/dist/types/I_TIkTokRaports.d.ts +8 -0
  59. package/dist/types/I_TIkTokRaports.js +38 -0
  60. package/dist/types/I_Tag.d.ts +10 -0
  61. package/dist/types/I_Tag.js +12 -0
  62. package/dist/types/I_TikTokPost.d.ts +45 -0
  63. package/dist/types/I_TikTokPost.js +47 -0
  64. package/dist/types/I_TikTokReport.d.ts +11 -0
  65. package/dist/types/I_TikTokReport.js +14 -0
  66. package/dist/types/I_TikTokUser.d.ts +53 -0
  67. package/dist/types/I_TikTokUser.js +97 -0
  68. package/dist/types/I_User.d.ts +35 -0
  69. package/dist/types/I_User.js +76 -0
  70. package/dist/types/I_UserTikTokStatistic.d.ts +13 -0
  71. package/dist/types/I_UserTikTokStatistic.js +16 -0
  72. package/dist/types/T_FetchStatus.d.ts +1 -0
  73. package/dist/types/T_FetchStatus.js +2 -0
  74. package/dist/types/global.d.ts +9 -0
  75. package/dist/types/global.js +2 -0
  76. package/dist/types/index.d.ts +31 -0
  77. package/dist/types/index.js +47 -0
  78. package/dist/utils/array.d.ts +3 -0
  79. package/dist/utils/array.js +12 -0
  80. package/dist/utils/cookies.d.ts +0 -0
  81. package/dist/utils/cookies.js +13 -0
  82. package/dist/utils/date.d.ts +5 -0
  83. package/dist/utils/date.js +19 -0
  84. package/dist/utils/index.d.ts +6 -0
  85. package/dist/utils/index.js +22 -0
  86. package/dist/utils/promise.d.ts +1 -0
  87. package/dist/utils/promise.js +6 -0
  88. package/dist/utils/string.d.ts +1 -0
  89. package/dist/utils/string.js +5 -0
  90. package/dist/utils/types.d.ts +5 -0
  91. package/dist/utils/types.js +2 -0
  92. package/dist/utils/variable.d.ts +2 -0
  93. package/dist/utils/variable.js +11 -0
  94. package/index.ts +5 -0
  95. package/package.json +41 -0
  96. package/src/api/apiDriver.ts +65 -0
  97. package/src/api/index.ts +2 -0
  98. package/src/api/utils.ts +38 -0
  99. package/src/types/I_Agency.ts +16 -0
  100. package/src/types/I_Campaign.ts +171 -0
  101. package/src/types/I_CampaignCollaborationMethod.ts +20 -0
  102. package/src/types/I_CampaignDeadline.ts +65 -0
  103. package/src/types/I_CampaignGoal.ts +20 -0
  104. package/src/types/I_Influencer.ts +93 -0
  105. package/src/types/I_InfluencersCategories.ts +52 -0
  106. package/src/types/I_InfluencersLists.ts +104 -0
  107. package/src/types/I_InfluencersProperties.ts +83 -0
  108. package/src/types/I_Item.ts +19 -0
  109. package/src/types/I_List.ts +14 -0
  110. package/src/types/I_Offer.ts +105 -0
  111. package/src/types/I_PaginatedList.ts +17 -0
  112. package/src/types/I_Pagination.ts +13 -0
  113. package/src/types/I_Queue.ts +40 -0
  114. package/src/types/I_ResponseMessage.ts +11 -0
  115. package/src/types/I_SM_Platform.ts +4 -0
  116. package/src/types/I_ScrapperLog.ts +17 -0
  117. package/src/types/I_Scrappers.ts +34 -0
  118. package/src/types/I_ScrappingAccount.ts +11 -0
  119. package/src/types/I_ScrappingMachine.ts +47 -0
  120. package/src/types/I_ScrappingMachineProcess.ts +36 -0
  121. package/src/types/I_ScrappingServiceMessages.ts +38 -0
  122. package/src/types/I_TIkTokRaports.ts +20 -0
  123. package/src/types/I_Tag.ts +12 -0
  124. package/src/types/I_TikTokPost.ts +64 -0
  125. package/src/types/I_TikTokReport.ts +20 -0
  126. package/src/types/I_TikTokUser.ts +108 -0
  127. package/src/types/I_User.ts +57 -0
  128. package/src/types/I_UserTikTokStatistic.ts +25 -0
  129. package/src/types/T_FetchStatus.ts +1 -0
  130. package/src/types/global.ts +10 -0
  131. package/src/types/index.ts +31 -0
  132. package/src/utils/array.ts +15 -0
  133. package/src/utils/cookies.ts +16 -0
  134. package/src/utils/date.ts +14 -0
  135. package/src/utils/index.ts +6 -0
  136. package/src/utils/promise.ts +3 -0
  137. package/src/utils/string.ts +1 -0
  138. package/src/utils/types.ts +9 -0
  139. package/src/utils/variable.ts +7 -0
  140. package/tsconfig.json +14 -0
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNumberOrUndefined = exports.getTargetValueOrNull = void 0;
4
+ const getTargetValueOrNull = (value, targetValue) => {
5
+ return (!!value && targetValue) || undefined;
6
+ };
7
+ exports.getTargetValueOrNull = getTargetValueOrNull;
8
+ const getNumberOrUndefined = (value) => {
9
+ return value ? Number(value) : undefined;
10
+ };
11
+ exports.getNumberOrUndefined = getNumberOrUndefined;
package/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ import * as types from './src/types';
2
+ import * as utils from './src/utils';
3
+ import * as api from './src/api/apiDriver';
4
+
5
+ export { types, utils, api };
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "ad2app-lib",
3
+ "version": "1.0.0",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "type": "commonjs",
7
+ "exports": {
8
+ "./utils": "./dist/utils/index.js",
9
+ "./types": "./dist/types/index.js",
10
+ "./api": "./dist/api/index.js"
11
+ },
12
+ "typesVersions": {
13
+ "*": {
14
+ "utils": [
15
+ "dist/utils/index.d.ts"
16
+ ],
17
+ "types": [
18
+ "dist/types/index.d.ts"
19
+ ],
20
+ "api": [
21
+ "dist/api/index.d.ts"
22
+ ],
23
+ "*": [
24
+ "dist/index.d.ts"
25
+ ]
26
+ }
27
+ },
28
+ "scripts": {
29
+ "build": "npx tsc"
30
+ },
31
+ "keywords": [],
32
+ "author": "Maciej Górski@ad2.app",
33
+ "license": "ISC",
34
+ "description": "Package to share types and utils across the ad2app projects",
35
+ "dependencies": {
36
+ "class-validator": "^0.14.1",
37
+ "date-fns": "^3.5.0",
38
+ "date-fns-tz": "^3.2.0",
39
+ "typescript": "^5.8.3"
40
+ }
41
+ }
@@ -0,0 +1,65 @@
1
+ import { FetchParams } from '../types';
2
+ import { concatApiPaths, createQueryString, insertParams } from './utils';
3
+
4
+ type HttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete';
5
+
6
+ interface DriverConfig {
7
+ apiUrl: string;
8
+ getHeaders?: () => HeadersInit;
9
+ }
10
+
11
+ let CONFIG: DriverConfig;
12
+
13
+ export function configureApiDriver(config: DriverConfig) {
14
+ CONFIG = config;
15
+ }
16
+
17
+ export async function fetchCall<T, Q>(
18
+ path: string,
19
+ fetchParams?: FetchParams<Q>,
20
+ method: HttpMethod = 'get'
21
+ ): Promise<T> {
22
+ const headers: HeadersInit = CONFIG.getHeaders?.() || {};
23
+
24
+ const query: Q = {} as Q;
25
+ Object.entries(fetchParams?.query || {}).forEach(([key, val]) => {
26
+ query[key] = Array.isArray(val) ? JSON.stringify(val) : val;
27
+ });
28
+
29
+ const queryString = createQueryString({ ...fetchParams, query });
30
+ const fullPath = insertParams(
31
+ concatApiPaths(CONFIG.apiUrl, path) + queryString,
32
+ fetchParams?.params
33
+ );
34
+
35
+ const init: RequestInit = {
36
+ method,
37
+ headers,
38
+ };
39
+
40
+ if (fetchParams?.body) {
41
+ init.body = JSON.stringify(fetchParams.body);
42
+ headers['Content-Type'] = 'application/json';
43
+ }
44
+
45
+ const res = await fetch(fullPath, init);
46
+
47
+ if (!res.ok) throw new Error(JSON.stringify(await res.json()));
48
+
49
+ return res.json() as Promise<T>;
50
+ }
51
+
52
+ export function apiDriver() {
53
+ return {
54
+ get: <T, Q>(path: string, params?: FetchParams<Q>) =>
55
+ fetchCall<T, Q>(path, params, 'get'),
56
+ post: <T, Q>(path: string, params?: FetchParams<Q>) =>
57
+ fetchCall<T, Q>(path, params, 'post'),
58
+ put: <T, Q>(path: string, params?: FetchParams<Q>) =>
59
+ fetchCall<T, Q>(path, params, 'put'),
60
+ patch: <T, Q>(path: string, params?: FetchParams<Q>) =>
61
+ fetchCall<T, Q>(path, params, 'patch'),
62
+ delete: <T, Q>(path: string, params?: FetchParams<Q>) =>
63
+ fetchCall<T, Q>(path, params, 'delete'),
64
+ };
65
+ }
@@ -0,0 +1,2 @@
1
+ export * from './apiDriver';
2
+ export * from './utils';
@@ -0,0 +1,38 @@
1
+ import { FetchParams } from '../types';
2
+
3
+ export const concatApiPaths = (apiUrl: string, endpoint: string) =>
4
+ apiUrl + '/' + endpoint;
5
+
6
+ export const createQueryString = <T>(fetchParams?: FetchParams<T>) => {
7
+ return fetchParams?.query
8
+ ? '?' + new URLSearchParams(fetchParams.query as URLSearchParams).toString()
9
+ : '';
10
+ };
11
+
12
+ export const extractParams = (path: string): string[] => {
13
+ return path
14
+ .split('/')
15
+ .filter((segment) => segment.startsWith(':'))
16
+ .map((segment) => segment.substring(1));
17
+ };
18
+
19
+ export const insertParams = (
20
+ path: string,
21
+ params?: { [key: string]: string | number }
22
+ ): string => {
23
+ if (!params) {
24
+ return path;
25
+ }
26
+
27
+ const paramNames = extractParams(path);
28
+
29
+ paramNames.forEach((paramName) => {
30
+ if (params[paramName] !== undefined) {
31
+ path = path.replace(`:${paramName}`, String(params[paramName]));
32
+ } else {
33
+ throw new Error(`Missing value for parameter: ${paramName}`);
34
+ }
35
+ });
36
+
37
+ return path;
38
+ };
@@ -0,0 +1,16 @@
1
+ import { I_Offer } from "./I_Offer";
2
+ import { I_User } from "./I_User";
3
+
4
+ export class I_Agency {
5
+ id: string;
6
+ name: string;
7
+ offers?: I_Offer[];
8
+ users?: I_User[];
9
+
10
+ constructor(data?: Partial<I_Agency>) {
11
+ this.id = data?.id ?? null;
12
+ this.name = data?.name ?? null;
13
+ this.offers = data?.offers ?? null;
14
+ this.users = data?.users ?? null;
15
+ }
16
+ }
@@ -0,0 +1,171 @@
1
+ import { IsArray, IsNotEmpty, IsNumber, IsString } from "class-validator";
2
+ import { I_CampaignGoal } from "./I_CampaignGoal";
3
+ import { I_CampaignCollaborationMethod } from "./I_CampaignCollaborationMethod";
4
+ import { I_Influencer } from "./I_Influencer";
5
+ import { I_InfluencersList } from "./I_InfluencersLists";
6
+ import { I_CampaignDeadline } from "./I_CampaignDeadline";
7
+
8
+ class I_Brief {
9
+ brand: string;
10
+ campaignTags: string;
11
+ budgetFrom: number;
12
+ budgetTo: number;
13
+ viewsFrom: number;
14
+ viewsTo: number;
15
+ maxInfluencersQuantity: number;
16
+ minInfluencersQuantity: number;
17
+ campaignCollaborationMethods: I_CampaignCollaborationMethod[];
18
+ campaignGoals: I_CampaignGoal[];
19
+
20
+ constructor(data?: Partial<I_Brief>) {
21
+ this.brand = data?.brand ?? null;
22
+ this.campaignTags = data?.campaignTags ?? null;
23
+ this.budgetFrom = data?.budgetFrom ?? null;
24
+ this.budgetTo = data?.budgetTo ?? null;
25
+ this.viewsFrom = data?.viewsFrom ?? null;
26
+ this.viewsTo = data?.viewsTo ?? null;
27
+ this.maxInfluencersQuantity = data?.maxInfluencersQuantity ?? null;
28
+ this.minInfluencersQuantity = data?.minInfluencersQuantity ?? null;
29
+ this.campaignGoals = data?.campaignGoals ?? null;
30
+ this.campaignCollaborationMethods =
31
+ data?.campaignCollaborationMethods ?? null;
32
+ }
33
+ }
34
+
35
+ export class I_Campaign {
36
+ id: string;
37
+ name: string;
38
+ brief: I_Brief;
39
+ influencersList: {
40
+ id: I_InfluencersList["id"];
41
+ name: I_InfluencersList["name"];
42
+ influencers: I_Influencer[];
43
+ };
44
+ deadlines: I_CampaignDeadline[];
45
+ startDate: Date;
46
+ endDate: Date;
47
+ isDraft: boolean;
48
+
49
+ constructor(data?: Partial<I_Campaign>) {
50
+ this.id = data?.id ?? null;
51
+ this.name = data?.name ?? null;
52
+ this.brief = data?.brief ?? null;
53
+ this.influencersList = data?.influencersList ?? null;
54
+ this.deadlines = data?.deadlines ?? [];
55
+ this.startDate = data?.startDate ?? null;
56
+ this.endDate = data?.endDate ?? null;
57
+ this.isDraft = data?.isDraft ?? null;
58
+ }
59
+ }
60
+
61
+ export class I_CreateCampaignDTO {
62
+ name: string;
63
+ }
64
+
65
+ export class I_CreateInfluencersListForCampaignDTO {
66
+ @IsNotEmpty()
67
+ campaignId: string;
68
+
69
+ @IsNotEmpty()
70
+ @IsArray()
71
+ influencers: I_Influencer[];
72
+ }
73
+
74
+ export class I_GetCampaignDTO {
75
+ @IsNotEmpty()
76
+ id: string;
77
+
78
+ constructor(data: Partial<I_GetCampaignDTO>) {
79
+ this.id = data?.id ?? "";
80
+ }
81
+ }
82
+
83
+ export class I_GetAgencyCampaignsDTO {}
84
+
85
+ export class I_FindCampaignsDTO {
86
+ name: string;
87
+ }
88
+
89
+ export class I_EditCampaignDTO {
90
+ @IsNotEmpty()
91
+ id: string;
92
+
93
+ @IsString()
94
+ name: string;
95
+
96
+ @IsNotEmpty()
97
+ brand: string;
98
+
99
+ @IsNotEmpty()
100
+ @IsNumber()
101
+ budgetFrom: number;
102
+
103
+ @IsNotEmpty()
104
+ @IsNumber()
105
+ budgetTo: number;
106
+
107
+ @IsNotEmpty()
108
+ @IsNumber()
109
+ viewsFrom: number;
110
+
111
+ @IsNotEmpty()
112
+ @IsNumber()
113
+ viewsTo: number;
114
+
115
+ @IsNotEmpty()
116
+ @IsString()
117
+ campaignTags: string;
118
+
119
+ @IsArray()
120
+ campaignGoals: I_CampaignGoal[];
121
+
122
+ @IsArray()
123
+ campaignCollaborationMethods: I_CampaignCollaborationMethod[];
124
+
125
+ @IsNotEmpty()
126
+ @IsNumber()
127
+ minInfluencersQuantity: number;
128
+
129
+ @IsNotEmpty()
130
+ @IsNumber()
131
+ maxInfluencersQuantity: number;
132
+
133
+ @IsNotEmpty()
134
+ startDate: Date;
135
+
136
+ @IsNotEmpty()
137
+ endDate: Date;
138
+
139
+ constructor(data?: Partial<I_EditCampaignDTO>) {
140
+ this.id = data?.id ?? null;
141
+ this.name = data?.name ?? null;
142
+ this.campaignGoals = data?.campaignGoals ?? [];
143
+ this.brand = data?.brand ?? null;
144
+ this.budgetFrom = Number(data?.budgetFrom) ?? null;
145
+ this.budgetTo = Number(data?.budgetTo) ?? null;
146
+ this.viewsFrom = Number(data?.viewsFrom) ?? null;
147
+ this.viewsTo = Number(data?.viewsTo) ?? null;
148
+ this.campaignTags = data?.campaignTags ?? null;
149
+ this.campaignCollaborationMethods =
150
+ data?.campaignCollaborationMethods ?? [];
151
+ this.minInfluencersQuantity = Number(data?.minInfluencersQuantity) ?? null;
152
+ this.maxInfluencersQuantity = Number(data?.maxInfluencersQuantity) ?? null;
153
+ this.startDate = data?.startDate ?? null;
154
+ this.endDate = data?.endDate ?? null;
155
+ }
156
+ }
157
+
158
+ export class I_GenerateInfluencersListForCampaignDTO {
159
+ @IsNotEmpty()
160
+ campaignId: string;
161
+ }
162
+
163
+ export class I_RegenerateInfluencersListForCampaignDTO {
164
+ @IsNotEmpty()
165
+ campaignId: string;
166
+ }
167
+
168
+ export class I_MarkCampaignAsReadyDTO {
169
+ @IsNotEmpty()
170
+ campaignId: string;
171
+ }
@@ -0,0 +1,20 @@
1
+ import { IsNotEmpty } from "class-validator";
2
+
3
+ export class I_CampaignCollaborationMethod {
4
+ id: string;
5
+ value: string;
6
+
7
+ constructor(data?: Partial<I_CampaignCollaborationMethod>) {
8
+ this.id = data?.id ?? "";
9
+ this.value = data?.value ?? "";
10
+ }
11
+ }
12
+
13
+ export class I_CreateCampaignCollaborationMethodDTO {
14
+ @IsNotEmpty()
15
+ value: string;
16
+ }
17
+
18
+ export class I_FindCampaignCollaborationMethodDTO {
19
+ value: string;
20
+ }
@@ -0,0 +1,65 @@
1
+ import { IsNotEmpty, IsOptional, IsString } from "class-validator";
2
+ import { I_OfferStatus } from "./I_Offer";
3
+
4
+ export class I_CampaignDeadline {
5
+ id: string;
6
+ name: string;
7
+ date: Date;
8
+ isConfirmed: boolean;
9
+ isReadyToConfirm: boolean;
10
+
11
+ constructor(data?: Partial<I_CampaignDeadline>) {
12
+ this.id = data?.id ?? null;
13
+ this.name = data?.name ?? null;
14
+ this.date = data?.date ?? null;
15
+ this.isConfirmed = data?.isConfirmed ?? null;
16
+ this.isReadyToConfirm = data?.isReadyToConfirm ?? null;
17
+ }
18
+ }
19
+
20
+ export class I_CreateCampaignDeadlineDTO {
21
+ @IsNotEmpty()
22
+ name: string;
23
+
24
+ @IsNotEmpty()
25
+ campaignId: string;
26
+
27
+ @IsOptional()
28
+ ruleType?: I_OfferStatus;
29
+ }
30
+
31
+ export class I_GetCampaignDeadlinesDTO {
32
+ @IsNotEmpty()
33
+ campaignId: string;
34
+ }
35
+
36
+ export class I_GetCampaignDeadlineDTO {
37
+ @IsNotEmpty()
38
+ deadlineId: string;
39
+ }
40
+
41
+ export class I_EditCampaignDeadlineDTO {
42
+ @IsNotEmpty()
43
+ deadlineId: string;
44
+
45
+ @IsNotEmpty()
46
+ date: Date;
47
+ }
48
+
49
+ export class I_EditCampaignDeadlinesDTO {
50
+ [key: string]: Date | string;
51
+
52
+ @IsString()
53
+ @IsNotEmpty()
54
+ campaignId: string;
55
+
56
+ constructor(data?: Partial<I_EditCampaignDeadlinesDTO>) {
57
+ this.campaignId = data?.campaignId ?? null;
58
+
59
+ Object.entries(data || {}).forEach(([key, value]) => {
60
+ if (key !== "startDate" && key !== "endDate") {
61
+ this[key] = value;
62
+ }
63
+ });
64
+ }
65
+ }
@@ -0,0 +1,20 @@
1
+ import { IsNotEmpty } from "class-validator";
2
+
3
+ export class I_CampaignGoal {
4
+ id: string;
5
+ value: string;
6
+
7
+ constructor(data?: Partial<I_CampaignGoal>) {
8
+ this.id = data?.id ?? "";
9
+ this.value = data?.value ?? "";
10
+ }
11
+ }
12
+
13
+ export class I_CreateCampaignGoalDTO {
14
+ @IsNotEmpty()
15
+ value: string;
16
+ }
17
+
18
+ export class I_FindCampaignGoalsDTO {
19
+ value: string;
20
+ }
@@ -0,0 +1,93 @@
1
+ import { IsNotEmpty, IsOptional } from "class-validator";
2
+ import { I_InfluencersCategory } from "./I_InfluencersCategories";
3
+ import { I_InfluencerProperty } from "./I_InfluencersProperties";
4
+
5
+ // TODO: Move to util.
6
+ const getMaxInteger = (value: string | number) => {
7
+ return Number(value) || 10 ** 9;
8
+ };
9
+
10
+ export class I_Influencer {
11
+ id: string;
12
+ handle_tt: string;
13
+ followers_tt: number;
14
+ tt_posts_count: number;
15
+ is_verified_tt: boolean;
16
+ categories: I_InfluencersCategory[];
17
+ properties: I_InfluencerProperty[];
18
+
19
+ constructor(data?: Partial<I_Influencer>) {
20
+ this.id = data?.id ?? null;
21
+ this.handle_tt = data?.handle_tt || "";
22
+ this.followers_tt = data?.followers_tt || 0;
23
+ this.tt_posts_count = data?.tt_posts_count || 0;
24
+ this.is_verified_tt = data?.is_verified_tt || false;
25
+ this.categories = data?.categories || [];
26
+ this.properties = data?.properties || [];
27
+ }
28
+ }
29
+
30
+ export class I_InfluencersSearchParams {
31
+ handle: string;
32
+ followers_from: number;
33
+ followers_to: number;
34
+ verified: boolean;
35
+ languages: string[];
36
+ ad_mean_views_from: number;
37
+ ad_mean_views_to: number;
38
+ id?: number[];
39
+ categories: string[];
40
+
41
+ constructor(data?: Partial<I_InfluencersSearchParams>) {
42
+ this.handle = data?.handle || "";
43
+ this.followers_from = data?.followers_from || 0;
44
+ this.followers_to = getMaxInteger(data?.followers_to);
45
+ this.verified = !!data?.verified;
46
+ this.languages = parseLanguages(this.languages);
47
+ this.ad_mean_views_from = data?.ad_mean_views_from;
48
+ this.ad_mean_views_to = getMaxInteger(data?.ad_mean_views_to);
49
+ this.id = data?.id || [];
50
+ this.categories = data?.categories || [];
51
+ }
52
+ }
53
+
54
+ export class I_InfluencerSearchParams {
55
+ handle?: string;
56
+ ids?: number[];
57
+ }
58
+
59
+ export class I_InfluencersAddParamsDTO {
60
+ @IsOptional()
61
+ followers_from: number;
62
+
63
+ @IsOptional()
64
+ verified: boolean;
65
+
66
+ @IsOptional()
67
+ languages: string[];
68
+
69
+ constructor(data?: Partial<I_InfluencersAddParamsDTO>) {
70
+ this.followers_from = data?.followers_from || 0;
71
+ this.verified = !!data?.verified;
72
+ this.languages = parseLanguages(this.languages);
73
+ }
74
+ }
75
+
76
+ export class I_InfluencerCreateFromSocialMediaUser {
77
+ @IsNotEmpty()
78
+ handle_tt: string;
79
+ }
80
+
81
+ const parseLanguages = (languages: any): string[] => {
82
+ if (Array.isArray(languages)) {
83
+ return languages;
84
+ }
85
+ if (typeof languages === "string") {
86
+ try {
87
+ return JSON.parse(languages);
88
+ } catch {
89
+ return [];
90
+ }
91
+ }
92
+ return [];
93
+ };
@@ -0,0 +1,52 @@
1
+ import { IsString, IsNotEmpty, IsNumber } from "class-validator";
2
+ import { I_Influencer } from "./I_Influencer";
3
+
4
+ export class I_InfluencersCategory {
5
+ name: string;
6
+ id: number;
7
+ influencers: I_Influencer[];
8
+
9
+ constructor(data?: Partial<I_InfluencersCategory>) {
10
+ this.id = data?.id;
11
+ this.name = data?.name || "";
12
+ this.influencers = data?.influencers || [];
13
+ }
14
+ }
15
+
16
+ export class I_InfluencersCategoriesSearchParams {
17
+ @IsString()
18
+ @IsNotEmpty()
19
+ name: string;
20
+ }
21
+
22
+ export class I_InfluencersCategoriesGetDTO {
23
+ @IsString()
24
+ @IsNotEmpty()
25
+ id: number;
26
+ }
27
+
28
+ export class I_GetInfluencerCategoriesDTO {
29
+ @IsString()
30
+ @IsNotEmpty()
31
+ handle: string;
32
+ }
33
+
34
+ export class I_InfluencersCategoriesCreateDTO {
35
+ @IsString()
36
+ @IsNotEmpty()
37
+ name: string;
38
+ }
39
+
40
+ export class I_InfluencersCategoriesAssignDTO {
41
+ @IsString()
42
+ @IsNotEmpty()
43
+ influencerHandle: string;
44
+
45
+ @IsNotEmpty()
46
+ categoryId: number;
47
+ }
48
+
49
+ export class I_InfluencersCategoriesAddToScrappingQueueDTO {
50
+ @IsNotEmpty()
51
+ categoryId: number;
52
+ }