@passly-nl/data 1.4.0 → 1.4.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@passly-nl/data",
3
3
  "description": "API implementation for Passly.",
4
- "version": "1.4.0",
4
+ "version": "1.4.3",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "funding": "https://github.com/sponsors/basmilius",
@@ -50,16 +50,16 @@
50
50
  "./*": "./*"
51
51
  },
52
52
  "devDependencies": {
53
- "@basmilius/http-client": "^3.49.0",
54
- "@flux-ui/types": "^3.1.12",
53
+ "@basmilius/http-client": "^3.50.0",
54
+ "@flux-ui/types": "^3.2.0",
55
55
  "@types/luxon": "^3.7.2",
56
- "@typescript/native-preview": "^7.0.0-dev.20260702.3",
56
+ "@typescript/native-preview": "^7.0.0-dev.20260704.1",
57
57
  "luxon": "^3.7.2",
58
58
  "tsdown": "^0.22.3"
59
59
  },
60
60
  "peerDependencies": {
61
- "@basmilius/http-client": "^3.49.0",
62
- "@flux-ui/types": "^3.1.12",
61
+ "@basmilius/http-client": "^3.50.0",
62
+ "@flux-ui/types": "^3.2.0",
63
63
  "luxon": "^3.7.2"
64
64
  }
65
65
  }
@@ -14,7 +14,8 @@ export class EventAdapter {
14
14
  data.checkout_count,
15
15
  optional(data.creator, AuthAdapter.parseUser),
16
16
  optional(data.event, EventAdapter.parseEvent),
17
- optional(data.merchant, MerchantAdapter.parseMerchant)
17
+ optional(data.merchant, MerchantAdapter.parseMerchant),
18
+ (data.products ?? []).map((product: { id: string }) => product.id)
18
19
  );
19
20
  }
20
21
 
@@ -76,7 +77,9 @@ export class EventAdapter {
76
77
  return new ShopDesignDto(
77
78
  data.background_color,
78
79
  data.foreground_color,
79
- data.primary_color
80
+ data.primary_color,
81
+ optional(data.background, FileSystemAdapter.parsePicture),
82
+ data.background_scrim ?? 0
80
83
  );
81
84
  }
82
85
 
@@ -23,7 +23,12 @@ export class ProductAdapter {
23
23
  data.has_sales,
24
24
  optional(data.image, FileSystemAdapter.parsePicture),
25
25
  optionalArray(data.images, FileSystemAdapter.parsePicture)!,
26
- optional(data.tickets_released_on, DateTimeAdapter.parseDateTime)
26
+ optional(data.tickets_released_on, DateTimeAdapter.parseDateTime),
27
+ data.show_when_unavailable,
28
+ optional(data.sale_starts_on, DateTimeAdapter.parseDateTime),
29
+ optional(data.sale_ends_on, DateTimeAdapter.parseDateTime),
30
+ data.availability,
31
+ data.sold
27
32
  );
28
33
  }
29
34
  }
@@ -27,7 +27,9 @@ export class PublicShopAdapter {
27
27
  return new PublicShopDesignDto(
28
28
  data.background_color,
29
29
  data.foreground_color,
30
- data.primary_color
30
+ data.primary_color,
31
+ optional(data.background, FileSystemAdapter.parsePicture),
32
+ data.background_scrim ?? 0
31
33
  );
32
34
  }
33
35
 
@@ -118,7 +120,10 @@ export class PublicShopAdapter {
118
120
  data.is_timeslotted,
119
121
  optionalArray(data.time_slots, PublicShopAdapter.parsePublicShopTimeSlot)!,
120
122
  optional(data.image, FileSystemAdapter.parsePicture),
121
- optionalArray(data.images, FileSystemAdapter.parsePicture)!
123
+ optionalArray(data.images, FileSystemAdapter.parsePicture)!,
124
+ data.availability,
125
+ optional(data.sale_starts_on, DateTimeAdapter.parseDateTime),
126
+ optional(data.sale_ends_on, DateTimeAdapter.parseDateTime)
122
127
  );
123
128
  }
124
129
 
@@ -67,6 +67,14 @@ export class AppTeamDto {
67
67
  this.#merchant = value;
68
68
  }
69
69
 
70
+ get productIds(): string[] {
71
+ return this.#productIds;
72
+ }
73
+
74
+ set productIds(value: string[]) {
75
+ this.#productIds = value;
76
+ }
77
+
70
78
  #id: string;
71
79
  #name: string;
72
80
  #secret: string;
@@ -75,8 +83,9 @@ export class AppTeamDto {
75
83
  #creator: UserDto;
76
84
  #event: EventDto;
77
85
  #merchant: MerchantDto;
86
+ #productIds: string[];
78
87
 
79
- constructor(id: string, name: string, secret: string, checkinCount: number, checkoutCount: number, creator: UserDto, event: EventDto, merchant: MerchantDto) {
88
+ constructor(id: string, name: string, secret: string, checkinCount: number, checkoutCount: number, creator: UserDto, event: EventDto, merchant: MerchantDto, productIds: string[]) {
80
89
  this.#id = id;
81
90
  this.#name = name;
82
91
  this.#secret = secret;
@@ -85,5 +94,6 @@ export class AppTeamDto {
85
94
  this.#creator = creator;
86
95
  this.#event = event;
87
96
  this.#merchant = merchant;
97
+ this.#productIds = productIds;
88
98
  }
89
99
  }
@@ -1,4 +1,5 @@
1
1
  import { dto } from '@basmilius/http-client';
2
+ import type { PictureDto } from '#data/dto';
2
3
 
3
4
  @dto
4
5
  export class ShopDesignDto {
@@ -26,13 +27,33 @@ export class ShopDesignDto {
26
27
  this.#primaryColor = value;
27
28
  }
28
29
 
30
+ get background(): PictureDto | null {
31
+ return this.#background;
32
+ }
33
+
34
+ set background(value: PictureDto | null) {
35
+ this.#background = value;
36
+ }
37
+
38
+ get backgroundScrim(): number {
39
+ return this.#backgroundScrim;
40
+ }
41
+
42
+ set backgroundScrim(value: number) {
43
+ this.#backgroundScrim = value;
44
+ }
45
+
29
46
  #backgroundColor: string;
30
47
  #foregroundColor: string;
31
48
  #primaryColor: string;
49
+ #background: PictureDto | null;
50
+ #backgroundScrim: number;
32
51
 
33
- constructor(backgroundColor: string, foregroundColor: string, primaryColor: string) {
52
+ constructor(backgroundColor: string, foregroundColor: string, primaryColor: string, background: PictureDto | null, backgroundScrim: number) {
34
53
  this.#backgroundColor = backgroundColor;
35
54
  this.#foregroundColor = foregroundColor;
36
55
  this.#primaryColor = primaryColor;
56
+ this.#background = background;
57
+ this.#backgroundScrim = backgroundScrim;
37
58
  }
38
59
  }
@@ -1,7 +1,7 @@
1
1
  import { dto } from '@basmilius/http-client';
2
2
  import type { DateTime } from 'luxon';
3
3
  import type { CostDto, PictureDto, StockPoolDto, TimeSlotDto } from '#data/dto';
4
- import type { ProductType } from '#data/types';
4
+ import type { ProductAvailability, ProductType } from '#data/types';
5
5
 
6
6
  @dto
7
7
  export class ProductDto {
@@ -141,6 +141,46 @@ export class ProductDto {
141
141
  this.#ticketsReleasedOn = value;
142
142
  }
143
143
 
144
+ get showWhenUnavailable(): boolean {
145
+ return this.#showWhenUnavailable;
146
+ }
147
+
148
+ set showWhenUnavailable(value: boolean) {
149
+ this.#showWhenUnavailable = value;
150
+ }
151
+
152
+ get saleStartsOn(): DateTime | null {
153
+ return this.#saleStartsOn;
154
+ }
155
+
156
+ set saleStartsOn(value: DateTime | null) {
157
+ this.#saleStartsOn = value;
158
+ }
159
+
160
+ get saleEndsOn(): DateTime | null {
161
+ return this.#saleEndsOn;
162
+ }
163
+
164
+ set saleEndsOn(value: DateTime | null) {
165
+ this.#saleEndsOn = value;
166
+ }
167
+
168
+ get availability(): ProductAvailability {
169
+ return this.#availability;
170
+ }
171
+
172
+ set availability(value: ProductAvailability) {
173
+ this.#availability = value;
174
+ }
175
+
176
+ get sold(): number {
177
+ return this.#sold;
178
+ }
179
+
180
+ set sold(value: number) {
181
+ this.#sold = value;
182
+ }
183
+
144
184
  #id: string;
145
185
  #type: ProductType;
146
186
  #name: string;
@@ -158,8 +198,13 @@ export class ProductDto {
158
198
  #image: PictureDto;
159
199
  #images: PictureDto[];
160
200
  #ticketsReleasedOn: DateTime | null;
201
+ #showWhenUnavailable: boolean;
202
+ #saleStartsOn: DateTime | null;
203
+ #saleEndsOn: DateTime | null;
204
+ #availability: ProductAvailability;
205
+ #sold: number;
161
206
 
162
- constructor(id: string, type: ProductType, name: string, description: string, price: CostDto, maxQuantity: number, isActive: boolean, isPersonalizationRequired: boolean, isSwappable: boolean, isTimeslotted: boolean, timeSlots: TimeSlotDto[], remainingStock: number, stock: StockPoolDto, hasSales: boolean, image: PictureDto, images: PictureDto[], ticketsReleasedOn: DateTime | null) {
207
+ constructor(id: string, type: ProductType, name: string, description: string, price: CostDto, maxQuantity: number, isActive: boolean, isPersonalizationRequired: boolean, isSwappable: boolean, isTimeslotted: boolean, timeSlots: TimeSlotDto[], remainingStock: number, stock: StockPoolDto, hasSales: boolean, image: PictureDto, images: PictureDto[], ticketsReleasedOn: DateTime | null, showWhenUnavailable: boolean, saleStartsOn: DateTime | null, saleEndsOn: DateTime | null, availability: ProductAvailability, sold: number) {
163
208
  this.#id = id;
164
209
  this.#type = type;
165
210
  this.#name = name;
@@ -177,5 +222,10 @@ export class ProductDto {
177
222
  this.#image = image;
178
223
  this.#images = images;
179
224
  this.#ticketsReleasedOn = ticketsReleasedOn;
225
+ this.#showWhenUnavailable = showWhenUnavailable;
226
+ this.#saleStartsOn = saleStartsOn;
227
+ this.#saleEndsOn = saleEndsOn;
228
+ this.#availability = availability;
229
+ this.#sold = sold;
180
230
  }
181
231
  }
@@ -1,4 +1,5 @@
1
1
  import { dto } from '@basmilius/http-client';
2
+ import type { PictureDto } from '#data/dto';
2
3
 
3
4
  @dto
4
5
  export class PublicShopDesignDto {
@@ -26,13 +27,33 @@ export class PublicShopDesignDto {
26
27
  this.#primaryColor = value;
27
28
  }
28
29
 
30
+ get background(): PictureDto | null {
31
+ return this.#background;
32
+ }
33
+
34
+ set background(value: PictureDto | null) {
35
+ this.#background = value;
36
+ }
37
+
38
+ get backgroundScrim(): number {
39
+ return this.#backgroundScrim;
40
+ }
41
+
42
+ set backgroundScrim(value: number) {
43
+ this.#backgroundScrim = value;
44
+ }
45
+
29
46
  #backgroundColor: string;
30
47
  #foregroundColor: string;
31
48
  #primaryColor: string;
49
+ #background: PictureDto | null;
50
+ #backgroundScrim: number;
32
51
 
33
- constructor(backgroundColor: string, foregroundColor: string, primaryColor: string) {
52
+ constructor(backgroundColor: string, foregroundColor: string, primaryColor: string, background: PictureDto | null, backgroundScrim: number) {
34
53
  this.#backgroundColor = backgroundColor;
35
54
  this.#foregroundColor = foregroundColor;
36
55
  this.#primaryColor = primaryColor;
56
+ this.#background = background;
57
+ this.#backgroundScrim = backgroundScrim;
37
58
  }
38
59
  }
@@ -1,6 +1,7 @@
1
1
  import { dto } from '@basmilius/http-client';
2
+ import type { DateTime } from 'luxon';
2
3
  import type { CostDto, PictureDto, PublicShopTimeSlotDto } from '#data/dto';
3
- import type { ProductType } from '#data/types';
4
+ import type { ProductAvailability, ProductType } from '#data/types';
4
5
 
5
6
  @dto
6
7
  export class PublicShopProductDto {
@@ -92,6 +93,30 @@ export class PublicShopProductDto {
92
93
  this.#images = value;
93
94
  }
94
95
 
96
+ get availability(): ProductAvailability {
97
+ return this.#availability;
98
+ }
99
+
100
+ set availability(value: ProductAvailability) {
101
+ this.#availability = value;
102
+ }
103
+
104
+ get saleStartsOn(): DateTime | null {
105
+ return this.#saleStartsOn;
106
+ }
107
+
108
+ set saleStartsOn(value: DateTime | null) {
109
+ this.#saleStartsOn = value;
110
+ }
111
+
112
+ get saleEndsOn(): DateTime | null {
113
+ return this.#saleEndsOn;
114
+ }
115
+
116
+ set saleEndsOn(value: DateTime | null) {
117
+ this.#saleEndsOn = value;
118
+ }
119
+
95
120
  #id: string;
96
121
  #type: ProductType;
97
122
  #name: string;
@@ -103,8 +128,11 @@ export class PublicShopProductDto {
103
128
  #timeSlots: PublicShopTimeSlotDto[];
104
129
  #image: PictureDto | null;
105
130
  #images: PictureDto[];
131
+ #availability: ProductAvailability;
132
+ #saleStartsOn: DateTime | null;
133
+ #saleEndsOn: DateTime | null;
106
134
 
107
- constructor(id: string, type: ProductType, name: string, description: string, price: CostDto, maxQuantity: number, isActive: boolean, isTimeslotted: boolean, timeSlots: PublicShopTimeSlotDto[], image: PictureDto | null, images: PictureDto[]) {
135
+ constructor(id: string, type: ProductType, name: string, description: string, price: CostDto, maxQuantity: number, isActive: boolean, isTimeslotted: boolean, timeSlots: PublicShopTimeSlotDto[], image: PictureDto | null, images: PictureDto[], availability: ProductAvailability, saleStartsOn: DateTime | null, saleEndsOn: DateTime | null) {
108
136
  this.#id = id;
109
137
  this.#type = type;
110
138
  this.#name = name;
@@ -116,5 +144,8 @@ export class PublicShopProductDto {
116
144
  this.#timeSlots = timeSlots;
117
145
  this.#image = image;
118
146
  this.#images = images;
147
+ this.#availability = availability;
148
+ this.#saleStartsOn = saleStartsOn;
149
+ this.#saleEndsOn = saleEndsOn;
119
150
  }
120
151
  }
@@ -31,7 +31,8 @@ export class MerchantEventAppTeamService extends BaseService {
31
31
  .queryString(QueryString.builder()
32
32
  .append('language', 'nl'))
33
33
  .body({
34
- name: appTeam.name
34
+ name: appTeam.name,
35
+ product_ids: appTeam.productIds
35
36
  })
36
37
  .runAdapter(EventAdapter.parseAppTeam);
37
38
  }
@@ -14,7 +14,7 @@ export class MerchantEventAppTeamsService extends BaseService {
14
14
  .runPaginatedAdapter(EventAdapter.parseAppTeam);
15
15
  }
16
16
 
17
- async post(merchantId: string, eventId: string, name: string): Promise<BaseResponse<AppTeamDto>> {
17
+ async post(merchantId: string, eventId: string, name: string, productIds: string[] = []): Promise<BaseResponse<AppTeamDto>> {
18
18
  return await this
19
19
  .request(`/merchants/${merchantId}/events/${eventId}/app-teams`)
20
20
  .method('post')
@@ -22,7 +22,8 @@ export class MerchantEventAppTeamsService extends BaseService {
22
22
  .queryString(QueryString.builder()
23
23
  .append('language', 'nl'))
24
24
  .body({
25
- name
25
+ name,
26
+ product_ids: productIds
26
27
  })
27
28
  .runAdapter(EventAdapter.parseAppTeam);
28
29
  }
@@ -42,7 +42,7 @@ export class MerchantEventProductService extends BaseService {
42
42
  .runAdapter(ProductAdapter.parseProduct);
43
43
  }
44
44
 
45
- async patchSales(merchantId: string, eventId: string, productId: string, price: number, maxQuantity: number, isSwappable: boolean, ticketsReleasedOn: DateTime | null): Promise<BaseResponse<ProductDto>> {
45
+ async patchSales(merchantId: string, eventId: string, productId: string, price: number, maxQuantity: number, isSwappable: boolean, ticketsReleasedOn: DateTime | null, showWhenUnavailable: boolean, saleStartsOn: DateTime | null, saleEndsOn: DateTime | null): Promise<BaseResponse<ProductDto>> {
46
46
  return await this
47
47
  .request(`/merchants/${merchantId}/events/${eventId}/products/${productId}/sales`)
48
48
  .method('patch')
@@ -53,7 +53,10 @@ export class MerchantEventProductService extends BaseService {
53
53
  price,
54
54
  max_quantity: maxQuantity,
55
55
  is_swappable: isSwappable,
56
- tickets_released_on: ticketsReleasedOn?.toISO() ?? null
56
+ tickets_released_on: ticketsReleasedOn?.toISO() ?? null,
57
+ show_when_unavailable: showWhenUnavailable,
58
+ sale_starts_on: saleStartsOn?.toISO() ?? null,
59
+ sale_ends_on: saleEndsOn?.toISO() ?? null
57
60
  })
58
61
  .runAdapter(ProductAdapter.parseProduct);
59
62
  }
@@ -1,6 +1,6 @@
1
1
  import { BaseResponse, BaseService, QueryString } from '@basmilius/http-client';
2
- import { EventAdapter, ShortlinkAdapter } from '#data/adapter';
3
- import type { ShopDesignDto, ShopDto, ShopElementDto, ShortlinkDto } from '#data/dto';
2
+ import { CommonAdapter, EventAdapter, ShortlinkAdapter } from '#data/adapter';
3
+ import type { ShopDesignDto, ShopDto, ShopElementDto, ShortlinkDto, StatusResponseDto } from '#data/dto';
4
4
 
5
5
  export class MerchantEventShopService extends BaseService {
6
6
  async get(merchantId: string, eventId: string, shopId: string): Promise<BaseResponse<ShopDto>> {
@@ -60,7 +60,8 @@ export class MerchantEventShopService extends BaseService {
60
60
  .body({
61
61
  background_color: design.backgroundColor,
62
62
  foreground_color: design.foregroundColor,
63
- primary_color: design.primaryColor
63
+ primary_color: design.primaryColor,
64
+ background_scrim: design.backgroundScrim
64
65
  })
65
66
  .runAdapter(EventAdapter.parseShopDesign);
66
67
  }
@@ -95,6 +96,20 @@ export class MerchantEventShopService extends BaseService {
95
96
  .runAdapter(EventAdapter.parseShop);
96
97
  }
97
98
 
99
+ async postBackground(merchantId: string, eventId: string, shopId: string, picture: File): Promise<BaseResponse<StatusResponseDto>> {
100
+ const data = new FormData();
101
+ data.append('file', picture);
102
+
103
+ return await this
104
+ .request(`/merchants/${merchantId}/events/${eventId}/shops/${shopId}/design/background`)
105
+ .method('post')
106
+ .queryString(QueryString.builder()
107
+ .append('language', 'nl'))
108
+ .bearerToken()
109
+ .body(data)
110
+ .runAdapter(CommonAdapter.parseStatusResponse);
111
+ }
112
+
98
113
  async postShortlink(merchantId: string, eventId: string, shopId: string): Promise<BaseResponse<ShortlinkDto>> {
99
114
  return await this
100
115
  .request(`/merchants/${merchantId}/events/${eventId}/shops/${shopId}/shortlink`)
@@ -104,4 +119,14 @@ export class MerchantEventShopService extends BaseService {
104
119
  .bearerToken()
105
120
  .runAdapter(ShortlinkAdapter.parse);
106
121
  }
122
+
123
+ async deleteBackground(merchantId: string, eventId: string, shopId: string): Promise<BaseResponse<StatusResponseDto>> {
124
+ return await this
125
+ .request(`/merchants/${merchantId}/events/${eventId}/shops/${shopId}/design/background`)
126
+ .method('delete')
127
+ .queryString(QueryString.builder()
128
+ .append('language', 'nl'))
129
+ .bearerToken()
130
+ .runAdapter(CommonAdapter.parseStatusResponse);
131
+ }
107
132
  }
@@ -37,6 +37,29 @@ export class MerchantEventStockPoolsService extends BaseService {
37
37
  .runArrayAdapter(FluxAdapter.parseFluxFormSelectEntry);
38
38
  }
39
39
 
40
+ async getSingle(merchantId: string, eventId: string, stockPoolId: string): Promise<BaseResponse<StockPoolDto>> {
41
+ return await this
42
+ .request(`/merchants/${merchantId}/events/${eventId}/stock-pools/${stockPoolId}`)
43
+ .method('get')
44
+ .queryString(QueryString.builder()
45
+ .append('language', 'nl'))
46
+ .bearerToken()
47
+ .runAdapter(EventAdapter.parseStockPool);
48
+ }
49
+
50
+ async patch(merchantId: string, eventId: string, stockPoolId: string, stock: number): Promise<BaseResponse<StockPoolDto>> {
51
+ return await this
52
+ .request(`/merchants/${merchantId}/events/${eventId}/stock-pools/${stockPoolId}`)
53
+ .method('patch')
54
+ .bearerToken()
55
+ .queryString(QueryString.builder()
56
+ .append('language', 'nl'))
57
+ .body({
58
+ stock
59
+ })
60
+ .runAdapter(EventAdapter.parseStockPool);
61
+ }
62
+
40
63
  async post(merchantId: string, eventId: string, name: string, stock: number): Promise<BaseResponse<StockPoolDto>> {
41
64
  return await this
42
65
  .request(`/merchants/${merchantId}/events/${eventId}/stock-pools`)
@@ -1,2 +1,9 @@
1
1
  export type ProductType =
2
2
  | 'ticket'
3
+
4
+ export type ProductAvailability =
5
+ | 'available'
6
+ | 'paused'
7
+ | 'upcoming'
8
+ | 'ended'
9
+ | 'sold_out';