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.
- package/README.md +37 -0
- package/dist/api/apiDriver.d.ts +16 -0
- package/dist/api/apiDriver.js +40 -0
- package/dist/api/apiUtils.d.ts +0 -0
- package/dist/api/apiUtils.js +31 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +18 -0
- package/dist/api/utils.d.ts +7 -0
- package/dist/api/utils.js +34 -0
- package/dist/types/I_Agency.d.ts +9 -0
- package/dist/types/I_Agency.js +12 -0
- package/dist/types/I_Campaign.d.ts +76 -0
- package/dist/types/I_Campaign.js +176 -0
- package/dist/types/I_CampaignCollaborationMethod.d.ts +11 -0
- package/dist/types/I_CampaignCollaborationMethod.js +30 -0
- package/dist/types/I_CampaignDeadline.d.ts +29 -0
- package/dist/types/I_CampaignDeadline.js +80 -0
- package/dist/types/I_CampaignGoal.d.ts +11 -0
- package/dist/types/I_CampaignGoal.js +30 -0
- package/dist/types/I_Influencer.d.ts +37 -0
- package/dist/types/I_Influencer.js +87 -0
- package/dist/types/I_InfluencersCategories.d.ts +26 -0
- package/dist/types/I_InfluencersCategories.js +72 -0
- package/dist/types/I_InfluencersLists.d.ts +68 -0
- package/dist/types/I_InfluencersLists.js +95 -0
- package/dist/types/I_InfluencersProperties.d.ts +40 -0
- package/dist/types/I_InfluencersProperties.js +95 -0
- package/dist/types/I_Item.d.ts +11 -0
- package/dist/types/I_Item.js +17 -0
- package/dist/types/I_List.d.ts +8 -0
- package/dist/types/I_List.js +11 -0
- package/dist/types/I_Offer.d.ts +63 -0
- package/dist/types/I_Offer.js +79 -0
- package/dist/types/I_PaginatedList.d.ts +10 -0
- package/dist/types/I_PaginatedList.js +13 -0
- package/dist/types/I_Pagination.d.ts +7 -0
- package/dist/types/I_Pagination.js +12 -0
- package/dist/types/I_Queue.d.ts +25 -0
- package/dist/types/I_Queue.js +54 -0
- package/dist/types/I_Report.d.ts +11 -0
- package/dist/types/I_Report.js +14 -0
- package/dist/types/I_ResponseMessage.d.ts +6 -0
- package/dist/types/I_ResponseMessage.js +10 -0
- package/dist/types/I_SM_Platform.d.ts +4 -0
- package/dist/types/I_SM_Platform.js +8 -0
- package/dist/types/I_ScrapperLog.d.ts +15 -0
- package/dist/types/I_ScrapperLog.js +9 -0
- package/dist/types/I_Scrappers.d.ts +35 -0
- package/dist/types/I_Scrappers.js +11 -0
- package/dist/types/I_ScrappingAccount.d.ts +10 -0
- package/dist/types/I_ScrappingAccount.js +6 -0
- package/dist/types/I_ScrappingMachine.d.ts +29 -0
- package/dist/types/I_ScrappingMachine.js +46 -0
- package/dist/types/I_ScrappingMachineProcess.d.ts +22 -0
- package/dist/types/I_ScrappingMachineProcess.js +46 -0
- package/dist/types/I_ScrappingServiceMessages.d.ts +31 -0
- package/dist/types/I_ScrappingServiceMessages.js +2 -0
- package/dist/types/I_TIkTokRaports.d.ts +8 -0
- package/dist/types/I_TIkTokRaports.js +38 -0
- package/dist/types/I_Tag.d.ts +10 -0
- package/dist/types/I_Tag.js +12 -0
- package/dist/types/I_TikTokPost.d.ts +45 -0
- package/dist/types/I_TikTokPost.js +47 -0
- package/dist/types/I_TikTokReport.d.ts +11 -0
- package/dist/types/I_TikTokReport.js +14 -0
- package/dist/types/I_TikTokUser.d.ts +53 -0
- package/dist/types/I_TikTokUser.js +97 -0
- package/dist/types/I_User.d.ts +35 -0
- package/dist/types/I_User.js +76 -0
- package/dist/types/I_UserTikTokStatistic.d.ts +13 -0
- package/dist/types/I_UserTikTokStatistic.js +16 -0
- package/dist/types/T_FetchStatus.d.ts +1 -0
- package/dist/types/T_FetchStatus.js +2 -0
- package/dist/types/global.d.ts +9 -0
- package/dist/types/global.js +2 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.js +47 -0
- package/dist/utils/array.d.ts +3 -0
- package/dist/utils/array.js +12 -0
- package/dist/utils/cookies.d.ts +0 -0
- package/dist/utils/cookies.js +13 -0
- package/dist/utils/date.d.ts +5 -0
- package/dist/utils/date.js +19 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/promise.d.ts +1 -0
- package/dist/utils/promise.js +6 -0
- package/dist/utils/string.d.ts +1 -0
- package/dist/utils/string.js +5 -0
- package/dist/utils/types.d.ts +5 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/variable.d.ts +2 -0
- package/dist/utils/variable.js +11 -0
- package/index.ts +5 -0
- package/package.json +41 -0
- package/src/api/apiDriver.ts +65 -0
- package/src/api/index.ts +2 -0
- package/src/api/utils.ts +38 -0
- package/src/types/I_Agency.ts +16 -0
- package/src/types/I_Campaign.ts +171 -0
- package/src/types/I_CampaignCollaborationMethod.ts +20 -0
- package/src/types/I_CampaignDeadline.ts +65 -0
- package/src/types/I_CampaignGoal.ts +20 -0
- package/src/types/I_Influencer.ts +93 -0
- package/src/types/I_InfluencersCategories.ts +52 -0
- package/src/types/I_InfluencersLists.ts +104 -0
- package/src/types/I_InfluencersProperties.ts +83 -0
- package/src/types/I_Item.ts +19 -0
- package/src/types/I_List.ts +14 -0
- package/src/types/I_Offer.ts +105 -0
- package/src/types/I_PaginatedList.ts +17 -0
- package/src/types/I_Pagination.ts +13 -0
- package/src/types/I_Queue.ts +40 -0
- package/src/types/I_ResponseMessage.ts +11 -0
- package/src/types/I_SM_Platform.ts +4 -0
- package/src/types/I_ScrapperLog.ts +17 -0
- package/src/types/I_Scrappers.ts +34 -0
- package/src/types/I_ScrappingAccount.ts +11 -0
- package/src/types/I_ScrappingMachine.ts +47 -0
- package/src/types/I_ScrappingMachineProcess.ts +36 -0
- package/src/types/I_ScrappingServiceMessages.ts +38 -0
- package/src/types/I_TIkTokRaports.ts +20 -0
- package/src/types/I_Tag.ts +12 -0
- package/src/types/I_TikTokPost.ts +64 -0
- package/src/types/I_TikTokReport.ts +20 -0
- package/src/types/I_TikTokUser.ts +108 -0
- package/src/types/I_User.ts +57 -0
- package/src/types/I_UserTikTokStatistic.ts +25 -0
- package/src/types/T_FetchStatus.ts +1 -0
- package/src/types/global.ts +10 -0
- package/src/types/index.ts +31 -0
- package/src/utils/array.ts +15 -0
- package/src/utils/cookies.ts +16 -0
- package/src/utils/date.ts +14 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/promise.ts +3 -0
- package/src/utils/string.ts +1 -0
- package/src/utils/types.ts +9 -0
- package/src/utils/variable.ts +7 -0
- 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
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
|
+
}
|
package/src/api/index.ts
ADDED
package/src/api/utils.ts
ADDED
|
@@ -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
|
+
}
|