ad2app-lib 1.1.0 → 1.3.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.
@@ -0,0 +1,253 @@
1
+ import type { LegalSection } from './types';
2
+
3
+ export const TERMS_SECTIONS: LegalSection[] = [
4
+ {
5
+ id: 's1',
6
+ title: '1. Parties and Agreement',
7
+ blocks: [
8
+ { kind: 'p', text: 'These Terms of Service ("Terms") constitute a legally binding agreement between **Ad2app sp. z o.o.**, with its registered office at ul. Juliana Smulikowskiego 4A/21, 00-389 Warszawa, Poland, NIP: 5253042936, KRS: 0001168159 ("ad2app", "we", "us"), and the individual or legal entity accessing or using the ad2app platform ("you", "User").' },
9
+ { kind: 'p', text: 'By creating an account or using the Service, you confirm that you have read, understood, and agree to be bound by these Terms and our {PRIVACY}, which is incorporated by reference.' },
10
+ ],
11
+ },
12
+ {
13
+ id: 's2',
14
+ title: '2. Service Description',
15
+ blocks: [
16
+ { kind: 'p', text: 'ad2app is a B2B influencer marketing platform that enables brands and agencies ("Advertisers") to discover, manage, and collaborate with content creators and influencers ("Influencers") on marketing campaigns. The Service includes:' },
17
+ {
18
+ kind: 'ul',
19
+ items: [
20
+ { text: 'Campaign creation, management, and tracking tools.' },
21
+ { text: 'Influencer discovery and profile management.' },
22
+ { text: 'Collaboration and offer management workflows.' },
23
+ { text: 'Messaging between Advertisers and Influencers.' },
24
+ { text: 'Social media inbox management (DMs and comments from connected platforms).' },
25
+ { text: 'Analytics and reporting features.' },
26
+ { text: 'Media and content file management.' },
27
+ ],
28
+ },
29
+ { kind: 'p', text: 'We reserve the right to modify, suspend, or discontinue any part of the Service at any time, with reasonable prior notice where technically or commercially practicable.' },
30
+ ],
31
+ },
32
+ {
33
+ id: 's3',
34
+ title: '3. Eligibility and Account Registration',
35
+ blocks: [
36
+ {
37
+ kind: 'ul',
38
+ items: [
39
+ { text: 'You must be at least 18 years old and have full legal capacity to enter into binding contracts to use the Service.' },
40
+ { text: 'If you register on behalf of a legal entity, you represent and warrant that you have authority to bind that entity to these Terms.' },
41
+ { text: 'You are responsible for maintaining the confidentiality of your account credentials and for all activities that occur under your account.' },
42
+ { text: 'You must provide accurate, current, and complete registration information and keep it updated.' },
43
+ { text: 'You may not create more than one account per legal entity without our prior written consent.' },
44
+ ],
45
+ },
46
+ ],
47
+ },
48
+ {
49
+ id: 's4',
50
+ title: '4. Acceptable Use',
51
+ blocks: [
52
+ { kind: 'p', text: 'You agree not to use the Service to:' },
53
+ {
54
+ kind: 'ul',
55
+ items: [
56
+ { text: 'Violate any applicable law or regulation, including EU and Polish data protection, advertising, and consumer protection laws.' },
57
+ { text: 'Upload, transmit, or distribute content that is unlawful, harmful, defamatory, obscene, or that infringes third-party intellectual property rights.' },
58
+ { text: 'Impersonate any person or entity or misrepresent your affiliation with any person or entity.' },
59
+ { text: 'Attempt to gain unauthorised access to any part of the Service or its related systems.' },
60
+ { text: 'Use automated means (bots, scrapers, crawlers) to access or collect data from the Service without our express prior written consent.' },
61
+ { text: 'Send unsolicited communications (spam) to other platform users.' },
62
+ { text: 'Engage in any activity that disrupts or interferes with the integrity or performance of the Service.' },
63
+ { text: 'Circumvent or disable any security or access control features of the Service.' },
64
+ ],
65
+ },
66
+ { kind: 'p', text: 'We reserve the right to suspend or terminate accounts that violate this section without prior notice.' },
67
+ ],
68
+ },
69
+ {
70
+ id: 's5',
71
+ title: '5. User Content',
72
+ blocks: [
73
+ { kind: 'p', text: '"User Content" means any data, text, images, video, or other material you upload, post, or otherwise transmit through the Service.' },
74
+ {
75
+ kind: 'ul',
76
+ items: [
77
+ { text: 'You retain all intellectual property rights in your User Content. By submitting User Content, you grant ad2app a non-exclusive, worldwide, royalty-free licence to host, store, display, and reproduce it solely to the extent necessary to provide the Service.' },
78
+ { text: 'You represent and warrant that you own or have the necessary rights to your User Content and that it does not infringe any third-party rights.' },
79
+ { text: 'We may remove User Content that violates these Terms or applicable law.' },
80
+ ],
81
+ },
82
+ { kind: 'subheading', text: 'Platform non-liability for User Content' },
83
+ { kind: 'p', text: '**ad2app does not create, edit, endorse, or control User Content.** We act solely as a hosting intermediary within the meaning of Article 6 of the EU Digital Services Act (Regulation (EU) 2022/2065) and are not liable for User Content unless we have actual knowledge of its illegal nature and fail to act expeditiously to remove or disable access to it.' },
84
+ { kind: 'p', text: 'You are **solely and exclusively responsible** for any content you create, publish, share, or distribute through the Service, including — but not limited to — campaign materials, promotional posts, sponsored content, images, videos, captions, hashtags, and any other material posted on third-party platforms (such as TikTok, Instagram, Facebook, or YouTube) using ad2app as a tool or workflow. ad2app assumes no liability for such content regardless of whether it was planned, briefed, or tracked through the platform.' },
85
+ { kind: 'p', text: 'In particular, you are responsible for ensuring that all published content complies with: (a) applicable advertising and marketing laws; (b) platform-specific community guidelines and terms of service of any third-party social media platform; (c) intellectual property rights of third parties; and (d) all applicable laws of the jurisdiction(s) where the content is distributed or viewed.' },
86
+ { kind: 'subheading', text: 'Digital Services Act — Points of Contact (Art. 11 DSA)' },
87
+ { kind: 'p', text: 'In accordance with Art. 11 of Regulation (EU) 2022/2065 (Digital Services Act), ad2app designates the following single point of contact for direct communication with Member State authorities, the European Commission, and the European Board for Digital Services: kontakt@ad2.app. Communications may be conducted in Polish or English.' },
88
+ { kind: 'subheading', text: 'Notice-and-action procedure (Art. 16 DSA)' },
89
+ { kind: 'p', text: 'Any person or entity may submit a notice of alleged illegal content hosted on the ad2app platform to kontakt@ad2.app. To be effective under Art. 16(2) DSA, a notice should include:' },
90
+ {
91
+ kind: 'ul',
92
+ items: [
93
+ { text: 'an explanation of why the content is considered illegal under EU or applicable national law;' },
94
+ { text: 'the precise location (URL or sufficient description) of the content;' },
95
+ { text: 'the name and contact details of the notifier, unless the notice concerns content constituting a criminal offence involving the notifier; and' },
96
+ { text: 'a statement that the notifier believes in good faith that the information and allegations are accurate and complete.' },
97
+ ],
98
+ },
99
+ { kind: 'p', text: 'We will acknowledge receipt without undue delay and act expeditiously upon sufficiently substantiated notices. Notifiers will receive our decision and information about available redress mechanisms. Manifestly unfounded repeated notices may be deprioritised.' },
100
+ ],
101
+ },
102
+ {
103
+ id: 's6',
104
+ title: '6. Intellectual Property',
105
+ blocks: [
106
+ { kind: 'p', text: 'The Service, including its software, design, logos, trademarks, and documentation, is owned by or licensed to ad2app and is protected by intellectual property laws. You are granted a limited, non-exclusive, non-transferable, revocable licence to access and use the Service solely for your internal business purposes in accordance with these Terms. You must not:' },
107
+ {
108
+ kind: 'ul',
109
+ items: [
110
+ { text: 'copy, modify, or create derivative works of the Service;' },
111
+ { text: 'reverse engineer, decompile, or disassemble any part of the Service (except as permitted by applicable law);' },
112
+ { text: 'use our trademarks or branding without our prior written consent.' },
113
+ ],
114
+ },
115
+ ],
116
+ },
117
+ {
118
+ id: 's7',
119
+ title: '7. Campaigns and Collaborations Between Users',
120
+ blocks: [
121
+ { kind: 'p', text: 'The Service facilitates agreements between Advertisers and Influencers. ad2app is not a party to any agreement reached between Users through the platform and has no control over the performance, quality, legality, or accuracy of campaigns or content produced. **ad2app is not responsible for any content that Users publish, broadcast, or distribute on any platform — including third-party social media platforms — whether or not that content was planned, briefed, approved, or tracked through the Service.**' },
122
+ { kind: 'p', text: 'Each User is solely responsible for:' },
123
+ {
124
+ kind: 'ul',
125
+ items: [
126
+ { text: 'ensuring that all published campaign content complies with applicable advertising laws and disclosure obligations, including the Polish Act on Combating Unfair Commercial Practices (including the obligation to clearly mark sponsored posts as "reklama" or "#ad"), the EU Digital Services Act, and any platform-specific rules of the social media platform on which the content is distributed;' },
127
+ { text: 'obtaining all necessary licences, consents, and permissions for any creative materials (music, images, trademarks, likeness) used in published content;' },
128
+ { text: 'fulfilling the obligations agreed upon with the counterparty;' },
129
+ { text: 'any tax obligations arising from payments made or received through the platform.' },
130
+ ],
131
+ },
132
+ { kind: 'p', text: 'ad2app shall have no liability arising from claims by third parties — including other Users, consumers, regulators, or rights-holders — that relate to the content, accuracy, legality, or effects of any material posted by Users in connection with a campaign, regardless of whether ad2app was involved in the planning or delivery of that campaign.' },
133
+ { kind: 'p', text: '**DSA disclosure tools:** ad2app provides campaign management tools that include disclosure labelling features to assist Advertisers and Influencers in meeting their obligations under Regulation (EU) 2022/2065 and applicable national advertising law. ad2app is not an advertising intermediary within the meaning of DSA Art. 26 with respect to content published on third-party social media platforms; however, we cooperate with users to ensure our platform tools support compliant disclosure practices.' },
134
+ ],
135
+ },
136
+ {
137
+ id: 's8',
138
+ title: '8. Fees and Payment',
139
+ blocks: [
140
+ { kind: 'p', text: 'Certain features of the Service may require payment of fees as set out in the applicable subscription plan or order form ("Fees"). Fees are stated in EUR or PLN and are exclusive of VAT unless otherwise indicated.' },
141
+ {
142
+ kind: 'ul',
143
+ items: [
144
+ { text: 'Fees are non-refundable except where expressly stated or required by applicable law.' },
145
+ { text: 'We reserve the right to change Fees with at least 30 days\' notice before the change takes effect.' },
146
+ { text: 'Failure to pay Fees may result in suspension of your access to paid features.' },
147
+ ],
148
+ },
149
+ { kind: 'p', text: '**Consumer right of withdrawal:** if you are acting as a natural person outside your professional or business capacity (consumer), you have a right of withdrawal from a service contract within 14 days under the Polish Consumer Rights Act (Ustawa o prawach konsumenta) and EU Consumer Rights Directive 2011/83/EU. By expressly requesting immediate access to the Service at the point of purchase and acknowledging this notice, you agree that the right of withdrawal is lost upon full performance of a digital service, in accordance with Art. 38(1)(a) of the Directive.' },
150
+ { kind: 'p', text: 'If you wish to exercise the right of withdrawal before performance is complete, you may use the standard form below or any unambiguous statement:' },
151
+ {
152
+ kind: 'box',
153
+ label: 'Standard Withdrawal Form',
154
+ lines: [
155
+ 'To: Ad2app sp. z o.o., ul. Juliana Smulikowskiego 4A/21, 00-389 Warszawa, Poland, kontakt@ad2.app',
156
+ 'I/We (*) hereby give notice that I/We (*) withdraw from my/our (*) contract for the provision of the following service: ___________',
157
+ 'Ordered on (*) / service commenced on (*): ___________',
158
+ 'Name of consumer(s): ___________',
159
+ 'Address of consumer(s): ___________',
160
+ 'Signature of consumer(s) (only if this form is submitted on paper): ___________',
161
+ 'Date: ___________',
162
+ '(*) Delete as appropriate.',
163
+ ],
164
+ },
165
+ ],
166
+ },
167
+ {
168
+ id: 's9',
169
+ title: '9. Disclaimer of Warranties',
170
+ blocks: [
171
+ { kind: 'p', text: 'The Service is provided "as is" and "as available" without any warranty of any kind, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, or non-infringement, to the fullest extent permitted by applicable law.' },
172
+ { kind: 'p', text: 'We do not warrant that the Service will be uninterrupted, error-free, or free of viruses or other harmful components.' },
173
+ ],
174
+ },
175
+ {
176
+ id: 's10',
177
+ title: '10. Limitation of Liability',
178
+ blocks: [
179
+ { kind: 'p', text: 'To the maximum extent permitted by applicable law, ad2app shall not be liable for any indirect, incidental, special, consequential, or punitive damages, including loss of profits, data, or goodwill, arising from your use of or inability to use the Service.' },
180
+ { kind: 'p', text: 'In any case, our total aggregate liability to you for any claim arising from these Terms shall not exceed the greater of: (a) the Fees paid by you to ad2app in the 12 months preceding the claim, or (b) EUR 100.' },
181
+ { kind: 'p', text: 'Nothing in these Terms limits liability for death or personal injury caused by negligence, fraud, or any other liability that cannot be excluded by Polish or EU law.' },
182
+ ],
183
+ },
184
+ {
185
+ id: 's11',
186
+ title: '11. Indemnification',
187
+ blocks: [
188
+ { kind: 'p', text: 'You agree to indemnify, defend, and hold harmless ad2app and its officers, directors, employees, and agents from any claims, liabilities, damages, losses, and expenses (including reasonable legal fees) arising out of or relating to: (a) your use of the Service in violation of these Terms; (b) your User Content; or (c) your violation of any third-party rights.' },
189
+ ],
190
+ },
191
+ {
192
+ id: 's12',
193
+ title: '12. Termination',
194
+ blocks: [
195
+ {
196
+ kind: 'ul',
197
+ items: [
198
+ { text: 'You may close your account at any time by contacting us at kontakt@ad2.app.' },
199
+ { text: 'We may suspend or terminate your account immediately if you materially breach these Terms, or with 30 days\' notice for any other reason.' },
200
+ { text: 'Upon termination, your licence to use the Service ceases. Sections 5, 6, 10, 11, 13, 14, and 15 survive termination.' },
201
+ ],
202
+ },
203
+ ],
204
+ },
205
+ {
206
+ id: 's13',
207
+ title: '13. Data Protection',
208
+ blocks: [
209
+ { kind: 'p', text: 'Our collection and use of personal data is governed by our {PRIVACY}, which forms part of these Terms. By accepting these Terms, you acknowledge that you have read and understood our Privacy Policy.' },
210
+ { kind: 'p', text: 'Where you, as an Advertiser, use the Service to access, communicate with, or manage Influencer personal data through the platform, ad2app acts as a **data processor** on your behalf under Article 28 GDPR, and you act as the **data controller** for that processing. Our Data Processing Agreement (available on request at kontakt@ad2.app) governs that relationship. You remain solely responsible for ensuring you have a valid legal basis for any personal data processing you direct through the platform and for your own compliance with GDPR in your capacity as controller.' },
211
+ ],
212
+ },
213
+ {
214
+ id: 's14',
215
+ title: '14. Governing Law and Dispute Resolution',
216
+ blocks: [
217
+ { kind: 'p', text: 'These Terms are governed by and construed in accordance with the laws of Poland, without regard to its conflict-of-law provisions. EU mandatory consumer protection laws apply where you are a consumer within the EU.' },
218
+ { kind: 'p', text: 'Any dispute arising from or in connection with these Terms shall be subject to the exclusive jurisdiction of the courts competent for the registered office of ad2app, unless mandatory law provides otherwise.' },
219
+ { kind: 'p', text: 'If you are a consumer resident in the EU, you may seek alternative dispute resolution through a certified ADR body. In Poland, the relevant body is the Inspekcja Handlowa (Trade Inspection Authority). ad2app is willing to participate in ADR proceedings where required by applicable law. Our contact address for dispute resolution purposes is kontakt@ad2.app.' },
220
+ ],
221
+ },
222
+ {
223
+ id: 's15',
224
+ title: '15. Changes to These Terms',
225
+ blocks: [
226
+ { kind: 'p', text: 'We may update these Terms at any time. Where changes are material, we will notify you by email or via a prominent notice within the Service at least 14 days before the changes take effect. Your continued use of the Service after that date constitutes your acceptance of the revised Terms. If you do not agree to the revised Terms, you must stop using the Service and close your account.' },
227
+ { kind: 'p', text: 'For Users acting as consumers, material changes that affect your rights will require your explicit re-acceptance before they take effect — we will provide a clear accept/decline mechanism in such cases.' },
228
+ ],
229
+ },
230
+ {
231
+ id: 's16',
232
+ title: '16. General Provisions',
233
+ blocks: [
234
+ {
235
+ kind: 'ul',
236
+ items: [
237
+ { text: '**Entire agreement:** These Terms and the Privacy Policy constitute the entire agreement between you and ad2app regarding the Service and supersede all prior agreements.' },
238
+ { text: '**Severability:** If any provision of these Terms is found unenforceable, the remaining provisions shall continue in full force and effect.' },
239
+ { text: '**No waiver:** Failure to enforce any provision of these Terms shall not constitute a waiver of our right to enforce it in the future.' },
240
+ { text: '**Assignment:** You may not assign your rights or obligations under these Terms without our prior written consent. We may assign our rights without restriction.' },
241
+ ],
242
+ },
243
+ ],
244
+ },
245
+ {
246
+ id: 's17',
247
+ title: '17. Contact',
248
+ blocks: [
249
+ { kind: 'p', text: 'For questions about these Terms, please contact us at:' },
250
+ { kind: 'address', lines: ['**Ad2app sp. z o.o.**', 'ul. Juliana Smulikowskiego 4A/21, 00-389 Warszawa, Poland', 'NIP: 5253042936', 'KRS: 0001168159', 'Email: kontakt@ad2.app'] },
251
+ ],
252
+ },
253
+ ];
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Inline markup conventions used in all legal text strings:
3
+ * **text** → bold
4
+ * `text` → inline code
5
+ * {EMAIL} → contact email hyperlink
6
+ * {UODO} → UODO supervisory authority URL
7
+ * {PRIVACY} → link to the Privacy Policy page (used in TOS)
8
+ */
9
+ export type InlineText = string;
10
+
11
+ export interface ListItem {
12
+ text: InlineText;
13
+ sub?: ListItem[];
14
+ }
15
+
16
+ export type Block =
17
+ | { kind: 'p'; text: InlineText }
18
+ | { kind: 'ul'; items: ListItem[] }
19
+ | { kind: 'table'; headers: [string, string]; rows: [string, string][] }
20
+ | { kind: 'address'; lines: InlineText[] }
21
+ | { kind: 'subheading'; text: string }
22
+ | { kind: 'box'; label: string; lines: InlineText[] }
23
+ | { kind: 'note'; label: string; text: InlineText };
24
+
25
+ export interface LegalSection {
26
+ id: string;
27
+ title: string;
28
+ blocks: Block[];
29
+ }
@@ -1,4 +1,4 @@
1
- import { IsNotEmpty } from 'class-validator';
1
+ import { IsBoolean, IsNotEmpty } from 'class-validator';
2
2
  import { I_Influencer } from './I_Influencer';
3
3
 
4
4
  export class I_User {
@@ -55,14 +55,15 @@ export class I_UserSignUpDTO {
55
55
  @IsNotEmpty()
56
56
  password: string;
57
57
 
58
- @IsNotEmpty()
59
- first_name: string;
58
+ @IsBoolean()
59
+ termsAccepted: boolean;
60
60
 
61
- @IsNotEmpty()
62
- last_name: string;
61
+ @IsBoolean()
62
+ privacyPolicyAccepted: boolean;
63
63
 
64
- @IsNotEmpty()
65
- display_name: string;
64
+ first_name?: string;
65
+ last_name?: string;
66
+ display_name?: string;
66
67
  }
67
68
 
68
69
  export class I_UserFindOneDTO {
@@ -58,6 +58,7 @@ export class SchedulingCreatePostDTO {
58
58
  publishNow?: boolean;
59
59
  mediaItems?: SchedulingMediaItemDTO[];
60
60
  platformSpecificData?: Record<string, Record<string, unknown>>;
61
+ tiktokSettings?: Record<string, unknown>;
61
62
 
62
63
  constructor(data?: Partial<SchedulingCreatePostDTO>) {
63
64
  if (!data) return;
@@ -67,6 +68,7 @@ export class SchedulingCreatePostDTO {
67
68
  this.publishNow = data.publishNow;
68
69
  this.mediaItems = data.mediaItems;
69
70
  this.platformSpecificData = data.platformSpecificData;
71
+ this.tiktokSettings = data.tiktokSettings;
70
72
  }
71
73
  }
72
74
 
@@ -94,6 +96,8 @@ export class SchedulingPostDTO {
94
96
  platformStatuses: SchedulingPlatformStatusMap;
95
97
  /** Per-platform URLs to the published post (e.g. { instagram: 'https://...' }). */
96
98
  postUrls?: Record<string, string>;
99
+ /** Per-platform error messages for platforms that failed to publish. */
100
+ platformErrors?: Record<string, string>;
97
101
  scheduledAt?: string;
98
102
  publishedAt?: string;
99
103
  status: SchedulingPostStatus;
@@ -107,6 +111,7 @@ export class SchedulingPostDTO {
107
111
  this.platforms = data.platforms;
108
112
  this.platformStatuses = data.platformStatuses;
109
113
  this.postUrls = data.postUrls;
114
+ this.platformErrors = data.platformErrors;
110
115
  this.scheduledAt = data.scheduledAt;
111
116
  this.publishedAt = data.publishedAt;
112
117
  this.status = data.status;