@shophost/rest-api 2.0.34 → 2.0.35

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 (148) hide show
  1. package/package.json +1 -1
  2. package/scripts/minify-dist.mjs +45 -0
  3. package/src/app.js +1 -53
  4. package/src/core/auth/auth.schema.js +1 -41
  5. package/src/core/auth/auth.util.js +1 -44
  6. package/src/core/auth/better-auth.lib.js +1 -100
  7. package/src/core/auth/generate-password-hash.util.js +1 -30
  8. package/src/core/auth/headers.schema.js +1 -22
  9. package/src/core/auth/user.schema.js +1 -30
  10. package/src/core/db/__generated__/client/browser.js +1 -18
  11. package/src/core/db/__generated__/client/client.js +1 -35
  12. package/src/core/db/__generated__/client/commonInputTypes.js +1 -11
  13. package/src/core/db/__generated__/client/enums.js +1 -200
  14. package/src/core/db/__generated__/client/internal/class.js +769 -55
  15. package/src/core/db/__generated__/client/internal/prismaNamespace.js +1 -541
  16. package/src/core/db/__generated__/client/internal/prismaNamespaceBrowser.js +1 -512
  17. package/src/core/db/__generated__/client/models/Account.js +1 -2
  18. package/src/core/db/__generated__/client/models/Address.js +1 -2
  19. package/src/core/db/__generated__/client/models/Campaign.js +1 -2
  20. package/src/core/db/__generated__/client/models/ClosingTimes.js +1 -2
  21. package/src/core/db/__generated__/client/models/File.js +1 -2
  22. package/src/core/db/__generated__/client/models/Invitation.js +1 -2
  23. package/src/core/db/__generated__/client/models/LegalEntity.js +1 -2
  24. package/src/core/db/__generated__/client/models/Manufacturer.js +1 -2
  25. package/src/core/db/__generated__/client/models/ManufacturerTranslation.js +1 -2
  26. package/src/core/db/__generated__/client/models/Member.js +1 -2
  27. package/src/core/db/__generated__/client/models/Modifier.js +1 -2
  28. package/src/core/db/__generated__/client/models/ModifierGroup.js +1 -2
  29. package/src/core/db/__generated__/client/models/ModifierGroupTranslation.js +1 -2
  30. package/src/core/db/__generated__/client/models/OpeningTimes.js +1 -2
  31. package/src/core/db/__generated__/client/models/Order.js +1 -2
  32. package/src/core/db/__generated__/client/models/OrderItem.js +1 -2
  33. package/src/core/db/__generated__/client/models/OrderItemTranslation.js +1 -2
  34. package/src/core/db/__generated__/client/models/Organization.js +1 -2
  35. package/src/core/db/__generated__/client/models/OrganizationConfiguration.js +1 -2
  36. package/src/core/db/__generated__/client/models/Payment.js +1 -2
  37. package/src/core/db/__generated__/client/models/PaymentSession.js +1 -2
  38. package/src/core/db/__generated__/client/models/Product.js +1 -2
  39. package/src/core/db/__generated__/client/models/ProductCategory.js +1 -2
  40. package/src/core/db/__generated__/client/models/ProductCategoryTranslation.js +1 -2
  41. package/src/core/db/__generated__/client/models/ProductSnapshot.js +1 -2
  42. package/src/core/db/__generated__/client/models/ProductTranslation.js +1 -2
  43. package/src/core/db/__generated__/client/models/Reservation.js +1 -2
  44. package/src/core/db/__generated__/client/models/Session.js +1 -2
  45. package/src/core/db/__generated__/client/models/ShippingMethod.js +1 -2
  46. package/src/core/db/__generated__/client/models/ShippingZone.js +1 -2
  47. package/src/core/db/__generated__/client/models/User.js +1 -2
  48. package/src/core/db/__generated__/client/models/Verification.js +1 -2
  49. package/src/core/db/__generated__/client/models.js +1 -2
  50. package/src/core/db/index.js +1 -2
  51. package/src/core/exceptions/http-exception.js +1 -9
  52. package/src/core/hono/hono.js +1 -123
  53. package/src/core/lib/prisma.js +1 -11
  54. package/src/core/logging/pino.js +1 -5
  55. package/src/core/notifications/email.service.js +1 -116
  56. package/src/core/openapi/openapi.lib.js +1 -26
  57. package/src/core/types/google-maps.types.js +1 -2
  58. package/src/core/utils/currency.util.js +1 -11
  59. package/src/core/utils/env.util.js +1 -8
  60. package/src/core/utils/object.util.js +1 -39
  61. package/src/core/utils/translations.util.js +0 -1
  62. package/src/core/utils/zod.util.js +1 -85
  63. package/src/db.js +1 -3
  64. package/src/features/access/access.handler.js +1 -91
  65. package/src/features/access/access.route.js +1 -220
  66. package/src/features/access/access.schema.js +1 -108
  67. package/src/features/access/access.service.js +1 -294
  68. package/src/features/cart/cart.handler.js +1 -17
  69. package/src/features/cart/cart.route.js +1 -32
  70. package/src/features/cart/cart.schema.js +1 -39
  71. package/src/features/cart/cart.service.js +1 -97
  72. package/src/features/cart/cart.util.js +1 -76
  73. package/src/features/file/file.handler.js +1 -23
  74. package/src/features/file/file.route.js +1 -34
  75. package/src/features/file/file.schema.js +1 -77
  76. package/src/features/file/file.service.js +1 -66
  77. package/src/features/health/health.handler.js +1 -10
  78. package/src/features/health/health.route.js +1 -25
  79. package/src/features/index.js +1 -16
  80. package/src/features/location/location.handler.js +1 -25
  81. package/src/features/location/location.route.js +1 -56
  82. package/src/features/location/location.schema.js +1 -50
  83. package/src/features/location/location.service.js +1 -141
  84. package/src/features/manufacturer/manufacturer.handler.js +1 -53
  85. package/src/features/manufacturer/manufacturer.route.js +1 -97
  86. package/src/features/manufacturer/manufacturer.schema.js +1 -125
  87. package/src/features/manufacturer/manufacturer.service.js +1 -190
  88. package/src/features/order/emails/order-confirmation.email.js +1 -229
  89. package/src/features/order/emails/order-notification.email.js +1 -229
  90. package/src/features/order/fulfilment.schema.js +1 -3
  91. package/src/features/order/order.handler.js +1 -54
  92. package/src/features/order/order.route.js +1 -111
  93. package/src/features/order/order.schema.js +1 -158
  94. package/src/features/order/order.service.js +1 -306
  95. package/src/features/order/recipient.schema.js +1 -38
  96. package/src/features/organization/legal-entity.schema.js +1 -83
  97. package/src/features/organization/organization-configuration.schema.js +1 -115
  98. package/src/features/organization/organization.handler.js +1 -48
  99. package/src/features/organization/organization.route.js +1 -84
  100. package/src/features/organization/organization.schema.js +1 -64
  101. package/src/features/organization/organization.service.js +1 -334
  102. package/src/features/payment/payment.handler.js +1 -16
  103. package/src/features/payment/payment.route.js +1 -22
  104. package/src/features/payment/payment.schema.js +1 -46
  105. package/src/features/payment/payment.service.js +1 -100
  106. package/src/features/payment/stripe.service.js +1 -164
  107. package/src/features/product/product-modifier.schema.js +1 -84
  108. package/src/features/product/product.handler.js +1 -87
  109. package/src/features/product/product.route.js +1 -179
  110. package/src/features/product/product.schema.js +1 -143
  111. package/src/features/product/product.service.js +1 -440
  112. package/src/features/product-category/product-category.handler.js +1 -59
  113. package/src/features/product-category/product-category.route.js +1 -139
  114. package/src/features/product-category/product-category.schema.js +1 -86
  115. package/src/features/product-category/product-category.service.js +1 -220
  116. package/src/features/reservation/emails/reservation-cancellation.email.js +1 -82
  117. package/src/features/reservation/emails/reservation-confirmation.email.js +1 -82
  118. package/src/features/reservation/emails/reservation-notification.email.js +1 -93
  119. package/src/features/reservation/reservation.handler.js +1 -65
  120. package/src/features/reservation/reservation.route.js +1 -167
  121. package/src/features/reservation/reservation.schema.js +1 -51
  122. package/src/features/reservation/reservation.service.js +1 -231
  123. package/src/features/shipping/shipping.handler.js +1 -32
  124. package/src/features/shipping/shipping.route.js +1 -51
  125. package/src/features/shipping/shipping.service.js +1 -96
  126. package/src/features/shipping-method/shipping-method.handler.js +1 -60
  127. package/src/features/shipping-method/shipping-method.route.js +1 -144
  128. package/src/features/shipping-method/shipping-method.schema.js +1 -48
  129. package/src/features/shipping-method/shipping-method.service.js +1 -229
  130. package/src/features/shipping-method/shipping-zone.schema.js +1 -31
  131. package/src/features/webhook/webhook.handler.js +1 -50
  132. package/src/features/webhook/webhook.route.js +1 -33
  133. package/src/index.js +1 -6
  134. package/src/integrations/next.js +1 -82
  135. package/src/schemas/address.schema.js +1 -112
  136. package/src/schemas/currency.schema.js +1 -118
  137. package/src/schemas/error.schema.js +1 -12
  138. package/src/schemas/index.js +1 -29
  139. package/src/schemas/locales.schema.js +1 -238
  140. package/src/schemas/number.schema.js +1 -29
  141. package/src/schemas/pagination.schema.js +1 -54
  142. package/src/schemas/params.schema.js +1 -20
  143. package/src/schemas/queries.schema.js +1 -6
  144. package/src/test/global-setup.js +1 -37
  145. package/src/test/integration/api-fixtures.js +1 -160
  146. package/src/test/integration/seed.js +1 -368
  147. package/src/test/integration/test-helpers.js +1 -154
  148. package/src/test/setup-test-env.js +1 -7
@@ -1,48 +1 @@
1
- import { z } from "@hono/zod-openapi";
2
- import { FileSchema } from "../file/file.schema";
3
- import { ShippingZoneSchema } from "./shipping-zone.schema";
4
- export const ShippingMethodSchema = z
5
- .object({
6
- id: z.string().openapi({
7
- example: "clf9876543210abcdef",
8
- description: "ID of the shipping method",
9
- }),
10
- title: z.string().min(1, "Title is required").openapi({
11
- example: "Standard Shipping",
12
- description: "Title of the shipping method",
13
- }),
14
- providerName: z.string().min(1, "Provider name is required").openapi({
15
- example: "FedEx",
16
- description: "Name of the shipping provider",
17
- }),
18
- providerLogo: FileSchema.nullable().optional().openapi({
19
- description: "Logo of the shipping provider",
20
- }),
21
- requireDateOfDelivery: z.coerce.boolean().optional().openapi({
22
- example: true,
23
- description: "Whether the delivery time should be selected",
24
- }),
25
- shippingZones: z.array(ShippingZoneSchema).openapi({
26
- description: "List of shipping zones for this shipping method",
27
- }),
28
- eligibleShippingZone: ShippingZoneSchema.optional(),
29
- createdAt: z.date(),
30
- updatedAt: z.date(),
31
- })
32
- .openapi("ShippingMethod");
33
- export const CreateShippingMethodSchema = ShippingMethodSchema.pick({
34
- title: true,
35
- providerName: true,
36
- providerLogo: true,
37
- requireDateOfDelivery: true,
38
- shippingZones: true,
39
- })
40
- .extend({
41
- providerLogoId: z.string().cuid().optional().openapi({
42
- example: "clf9876543210abcdef",
43
- description: "ID reference to the provider logo file",
44
- }),
45
- })
46
- .openapi("CreateShippingMethod");
47
- export const UpdateShippingMethodSchema = CreateShippingMethodSchema.partial().openapi("UpdateShippingMethod");
48
- //# sourceMappingURL=shipping-method.schema.js.map
1
+ import{z as e}from"@hono/zod-openapi";import{FileSchema as p}from"../file/file.schema";import{ShippingZoneSchema as i}from"./shipping-zone.schema";export const ShippingMethodSchema=e.object({id:e.string().openapi({example:"clf9876543210abcdef",description:"ID of the shipping method"}),title:e.string().min(1,"Title is required").openapi({example:"Standard Shipping",description:"Title of the shipping method"}),providerName:e.string().min(1,"Provider name is required").openapi({example:"FedEx",description:"Name of the shipping provider"}),providerLogo:p.nullable().optional().openapi({description:"Logo of the shipping provider"}),requireDateOfDelivery:e.coerce.boolean().optional().openapi({example:!0,description:"Whether the delivery time should be selected"}),shippingZones:e.array(i).openapi({description:"List of shipping zones for this shipping method"}),eligibleShippingZone:i.optional(),createdAt:e.date(),updatedAt:e.date()}).openapi("ShippingMethod"),CreateShippingMethodSchema=ShippingMethodSchema.pick({title:!0,providerName:!0,providerLogo:!0,requireDateOfDelivery:!0,shippingZones:!0}).extend({providerLogoId:e.string().cuid().optional().openapi({example:"clf9876543210abcdef",description:"ID reference to the provider logo file"})}).openapi("CreateShippingMethod"),UpdateShippingMethodSchema=CreateShippingMethodSchema.partial().openapi("UpdateShippingMethod");
@@ -1,229 +1 @@
1
- import { __awaiter } from "tslib";
2
- import { z } from "@hono/zod-openapi";
3
- import { HttpException } from "../../core/exceptions/http-exception";
4
- import { PaginationMetaSchema, ShippingMethodSchema, } from "../../schemas";
5
- class ShippingMethodService {
6
- constructor(prisma) {
7
- this.prisma = prisma;
8
- }
9
- /**
10
- * Find a shipping method by ID and organization ID
11
- * @throws HttpException with 404 status if shipping method is not found
12
- */
13
- findShippingMethod(id, organizationId, options) {
14
- return __awaiter(this, void 0, void 0, function* () {
15
- const shippingMethod = yield this.prisma.shippingMethod.findUnique({
16
- where: {
17
- id,
18
- organizationId,
19
- },
20
- include: options === null || options === void 0 ? void 0 : options.include,
21
- });
22
- if (!shippingMethod) {
23
- throw new HttpException(404, "Shipping method not found");
24
- }
25
- return shippingMethod;
26
- });
27
- }
28
- /**
29
- * Find the distance between two coordinates
30
- */
31
- findDistanceBetweenCoordinates(from, to) {
32
- // Helper function to convert degrees to radians
33
- const toRadians = (degrees) => degrees * (Math.PI / 180);
34
- // Earth's radius in kilometers
35
- const earthRadiusKm = 6371;
36
- // Convert latitude and longitude differences to radians
37
- const dLat = toRadians(to.latitude - from.latitude);
38
- const dLon = toRadians(to.longitude - from.longitude);
39
- // Convert starting coordinates to radians
40
- const lat1 = toRadians(from.latitude);
41
- const lat2 = toRadians(to.latitude);
42
- // Haversine formula
43
- const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
44
- Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon / 2) * Math.sin(dLon / 2);
45
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
46
- // Calculate the distance
47
- const distance = earthRadiusKm * c;
48
- return distance;
49
- }
50
- /**
51
- * Get a list of eligible shipping methods for a user
52
- */
53
- accessEligibility(user, organizationId) {
54
- return __awaiter(this, void 0, void 0, function* () {
55
- const organization = yield this.prisma.organization.findUnique({
56
- where: {
57
- id: organizationId,
58
- },
59
- include: {
60
- address: true,
61
- },
62
- });
63
- if (!organization) {
64
- throw new HttpException(404, "Organization not found");
65
- }
66
- const userShippingAddress = yield this.prisma.address.findFirst({
67
- where: {
68
- users: {
69
- some: { id: user.id },
70
- },
71
- isDefault: true,
72
- },
73
- });
74
- if (!userShippingAddress) {
75
- throw new HttpException(404, "User shipping address not found");
76
- }
77
- const shippingMethods = yield this.prisma.shippingMethod.findMany({
78
- where: {
79
- organizationId,
80
- },
81
- include: {
82
- shippingZones: true,
83
- },
84
- });
85
- return shippingMethods.map((shippingMethod) => {
86
- const distance = this.findDistanceBetweenCoordinates({
87
- latitude: organization.address.latitude,
88
- longitude: organization.address.longitude,
89
- }, {
90
- latitude: userShippingAddress.latitude,
91
- longitude: userShippingAddress.longitude,
92
- });
93
- const eligibleShippingZone = shippingMethod.shippingZones.find(({ distanceUpto }) => {
94
- return distance <= distanceUpto;
95
- });
96
- return ShippingMethodSchema.parse(Object.assign(Object.assign({}, shippingMethod), { eligibleShippingZone }));
97
- });
98
- });
99
- }
100
- /**
101
- * Create a new shipping method
102
- */
103
- createShippingMethod(organizationId, userId, body) {
104
- return __awaiter(this, void 0, void 0, function* () {
105
- const shippingMethod = yield this.prisma.shippingMethod.create({
106
- data: {
107
- title: body.title,
108
- providerName: body.providerName,
109
- providerLogoId: body.providerLogoId,
110
- requireDateOfDelivery: body.requireDateOfDelivery,
111
- organizationId,
112
- shippingZones: {
113
- create: body.shippingZones,
114
- },
115
- createdBy: userId,
116
- },
117
- include: {
118
- shippingZones: true,
119
- providerLogo: true,
120
- },
121
- });
122
- return ShippingMethodSchema.parse(shippingMethod);
123
- });
124
- }
125
- /**
126
- * Get a shipping method by ID
127
- */
128
- getShippingMethod(organizationId, id) {
129
- return __awaiter(this, void 0, void 0, function* () {
130
- const shippingMethod = yield this.findShippingMethod(id, organizationId, {
131
- include: {
132
- providerLogo: true,
133
- shippingZones: true,
134
- },
135
- });
136
- return ShippingMethodSchema.parse(shippingMethod);
137
- });
138
- }
139
- /**
140
- * Get a paginated list of shipping methods
141
- */
142
- getShippingMethods(organizationId, query) {
143
- return __awaiter(this, void 0, void 0, function* () {
144
- const { page = 1, limit = 10, search } = query;
145
- const [list, meta] = yield this.prisma.shippingMethod
146
- .paginate({
147
- orderBy: {
148
- createdAt: "desc",
149
- },
150
- where: Object.assign({ organizationId }, (search && {
151
- title: {
152
- contains: search,
153
- mode: "insensitive",
154
- },
155
- })),
156
- include: {
157
- shippingZones: true,
158
- providerLogo: true,
159
- },
160
- })
161
- .withPages({
162
- page,
163
- limit,
164
- });
165
- return z
166
- .object({
167
- meta: PaginationMetaSchema,
168
- list: z.array(ShippingMethodSchema),
169
- })
170
- .parse({
171
- meta,
172
- list,
173
- });
174
- });
175
- }
176
- /**
177
- * Update a shipping method
178
- */
179
- updateShippingMethod(organizationId, id, userId, body) {
180
- return __awaiter(this, void 0, void 0, function* () {
181
- // Ensure the shipping method exists
182
- yield this.findShippingMethod(id, organizationId);
183
- const updatedShippingMethod = yield this.prisma.shippingMethod.update({
184
- where: {
185
- id,
186
- organizationId,
187
- },
188
- data: {
189
- title: body.title,
190
- providerName: body.providerName,
191
- providerLogoId: body.providerLogoId,
192
- requireDateOfDelivery: body.requireDateOfDelivery,
193
- shippingZones: {
194
- deleteMany: {},
195
- create: body.shippingZones,
196
- },
197
- updatedBy: userId,
198
- },
199
- include: {
200
- providerLogo: true,
201
- shippingZones: true,
202
- },
203
- });
204
- return ShippingMethodSchema.parse(updatedShippingMethod);
205
- });
206
- }
207
- /**
208
- * Delete a shipping method (soft delete)
209
- */
210
- deleteShippingMethod(organizationId, id, userId) {
211
- return __awaiter(this, void 0, void 0, function* () {
212
- // Ensure the shipping method exists
213
- yield this.findShippingMethod(id, organizationId);
214
- yield this.prisma.shippingMethod.update({
215
- where: {
216
- id,
217
- organizationId,
218
- },
219
- data: {
220
- archivedAt: new Date(),
221
- archivedBy: userId,
222
- },
223
- });
224
- return;
225
- });
226
- }
227
- }
228
- export { ShippingMethodService };
229
- //# sourceMappingURL=shipping-method.service.js.map
1
+ import{__awaiter as d}from"tslib";import{z as c}from"@hono/zod-openapi";import{HttpException as u}from"../../core/exceptions/http-exception";import{PaginationMetaSchema as l,ShippingMethodSchema as p}from"../../schemas";class v{constructor(e){this.prisma=e}findShippingMethod(e,t,i){return d(this,void 0,void 0,function*(){const n=yield this.prisma.shippingMethod.findUnique({where:{id:e,organizationId:t},include:i?.include});if(!n)throw new u(404,"Shipping method not found");return n})}findDistanceBetweenCoordinates(e,t){const i=g=>g*(Math.PI/180),r=i(t.latitude-e.latitude),s=i(t.longitude-e.longitude),o=i(e.latitude),h=i(t.latitude),a=Math.sin(r/2)*Math.sin(r/2)+Math.cos(o)*Math.cos(h)*Math.sin(s/2)*Math.sin(s/2);return 6371*(2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a)))}accessEligibility(e,t){return d(this,void 0,void 0,function*(){const i=yield this.prisma.organization.findUnique({where:{id:t},include:{address:!0}});if(!i)throw new u(404,"Organization not found");const n=yield this.prisma.address.findFirst({where:{users:{some:{id:e.id}},isDefault:!0}});if(!n)throw new u(404,"User shipping address not found");return(yield this.prisma.shippingMethod.findMany({where:{organizationId:t},include:{shippingZones:!0}})).map(s=>{const o=this.findDistanceBetweenCoordinates({latitude:i.address.latitude,longitude:i.address.longitude},{latitude:n.latitude,longitude:n.longitude}),h=s.shippingZones.find(({distanceUpto:a})=>o<=a);return p.parse(Object.assign(Object.assign({},s),{eligibleShippingZone:h}))})})}createShippingMethod(e,t,i){return d(this,void 0,void 0,function*(){const n=yield this.prisma.shippingMethod.create({data:{title:i.title,providerName:i.providerName,providerLogoId:i.providerLogoId,requireDateOfDelivery:i.requireDateOfDelivery,organizationId:e,shippingZones:{create:i.shippingZones},createdBy:t},include:{shippingZones:!0,providerLogo:!0}});return p.parse(n)})}getShippingMethod(e,t){return d(this,void 0,void 0,function*(){const i=yield this.findShippingMethod(t,e,{include:{providerLogo:!0,shippingZones:!0}});return p.parse(i)})}getShippingMethods(e,t){return d(this,void 0,void 0,function*(){const{page:i=1,limit:n=10,search:r}=t,[s,o]=yield this.prisma.shippingMethod.paginate({orderBy:{createdAt:"desc"},where:Object.assign({organizationId:e},r&&{title:{contains:r,mode:"insensitive"}}),include:{shippingZones:!0,providerLogo:!0}}).withPages({page:i,limit:n});return c.object({meta:l,list:c.array(p)}).parse({meta:o,list:s})})}updateShippingMethod(e,t,i,n){return d(this,void 0,void 0,function*(){yield this.findShippingMethod(t,e);const r=yield this.prisma.shippingMethod.update({where:{id:t,organizationId:e},data:{title:n.title,providerName:n.providerName,providerLogoId:n.providerLogoId,requireDateOfDelivery:n.requireDateOfDelivery,shippingZones:{deleteMany:{},create:n.shippingZones},updatedBy:i},include:{providerLogo:!0,shippingZones:!0}});return p.parse(r)})}deleteShippingMethod(e,t,i){return d(this,void 0,void 0,function*(){yield this.findShippingMethod(t,e),yield this.prisma.shippingMethod.update({where:{id:t,organizationId:e},data:{archivedAt:new Date,archivedBy:i}})})}}export{v as ShippingMethodService};
@@ -1,31 +1 @@
1
- import { z } from "@hono/zod-openapi";
2
- import { optionalNumber, requiredNumber } from "../../schemas/number.schema";
3
- export const ShippingZoneSchema = z
4
- .object({
5
- id: z.string().optional().openapi({
6
- example: "clf9876543210abcdef",
7
- description: "ID of the shipping zone",
8
- }),
9
- title: z.string().min(1, "Title is required").openapi({
10
- example: "Zone 1",
11
- description: "Title of the shipping zone",
12
- }),
13
- distanceUpto: requiredNumber.openapi({
14
- example: 10,
15
- description: "Ending distance for the shipping zone",
16
- }),
17
- price: requiredNumber.openapi({
18
- example: 5.99,
19
- description: "Price for shipping in this zone",
20
- }),
21
- minimumOrderAmount: optionalNumber.openapi({
22
- example: 50,
23
- description: "Minimum order amount for this shipping zone",
24
- }),
25
- eta: z.string().min(1, "ETA is required").openapi({
26
- example: "2-3 days",
27
- description: "Estimated time of arrival for this shipping zone",
28
- }),
29
- })
30
- .openapi("ShippingZone");
31
- //# sourceMappingURL=shipping-zone.schema.js.map
1
+ import{z as i}from"@hono/zod-openapi";import{optionalNumber as p,requiredNumber as e}from"../../schemas/number.schema";export const ShippingZoneSchema=i.object({id:i.string().optional().openapi({example:"clf9876543210abcdef",description:"ID of the shipping zone"}),title:i.string().min(1,"Title is required").openapi({example:"Zone 1",description:"Title of the shipping zone"}),distanceUpto:e.openapi({example:10,description:"Ending distance for the shipping zone"}),price:e.openapi({example:5.99,description:"Price for shipping in this zone"}),minimumOrderAmount:p.openapi({example:50,description:"Minimum order amount for this shipping zone"}),eta:i.string().min(1,"ETA is required").openapi({example:"2-3 days",description:"Estimated time of arrival for this shipping zone"})}).openapi("ShippingZone");
@@ -1,50 +1 @@
1
- import { __awaiter } from "tslib";
2
- import { HttpException } from "../../core/exceptions/http-exception";
3
- import { createApiRouter } from "../../core/hono/hono";
4
- import { PaymentService, } from "../payment/payment.service";
5
- import { webhookRoutes } from "./webhook.route";
6
- export const webhookHandler = (request, prisma, options, provider) => __awaiter(void 0, void 0, void 0, function* () {
7
- try {
8
- const signature = request.headers.get("stripe-signature");
9
- const body = yield request.text();
10
- const paymentProvider = provider !== null && provider !== void 0 ? provider : (request.url.includes("stripe")
11
- ? "stripe"
12
- : request.url.includes("revolut")
13
- ? "revolut"
14
- : null);
15
- if (!paymentProvider) {
16
- throw new HttpException(400, "Payment provider not supported");
17
- }
18
- const paymentService = new PaymentService(prisma, options);
19
- yield paymentService.processWebhookEvent(paymentProvider, signature, body);
20
- return Response.json({
21
- received: true,
22
- }, {
23
- status: 200,
24
- });
25
- }
26
- catch (error) {
27
- console.error(error);
28
- if (error instanceof HttpException) {
29
- return Response.json({
30
- error: error.message,
31
- }, {
32
- status: error.status,
33
- });
34
- }
35
- return Response.json({
36
- error: "Internal Server Error",
37
- }, {
38
- status: 500,
39
- });
40
- }
41
- });
42
- export const buildWebhookHandler = (prisma, options) => {
43
- const app = createApiRouter();
44
- app.openapi(webhookRoutes.webhook, (c) => __awaiter(void 0, void 0, void 0, function* () {
45
- const params = c.req.valid("param");
46
- return webhookHandler(c.req.raw, prisma, options, params.provider);
47
- }));
48
- return app;
49
- };
50
- //# sourceMappingURL=webhook.handler.js.map
1
+ import{__awaiter as i}from"tslib";import{HttpException as a}from"../../core/exceptions/http-exception";import{createApiRouter as u}from"../../core/hono/hono";import{PaymentService as c}from"../payment/payment.service";import{webhookRoutes as d}from"./webhook.route";export const webhookHandler=(r,n,t,o)=>i(void 0,void 0,void 0,function*(){try{const e=r.headers.get("stripe-signature"),p=yield r.text(),s=o??(r.url.includes("stripe")?"stripe":r.url.includes("revolut")?"revolut":null);if(!s)throw new a(400,"Payment provider not supported");return yield new c(n,t).processWebhookEvent(s,e,p),Response.json({received:!0},{status:200})}catch(e){return console.error(e),e instanceof a?Response.json({error:e.message},{status:e.status}):Response.json({error:"Internal Server Error"},{status:500})}}),buildWebhookHandler=(r,n)=>{const t=u();return t.openapi(d.webhook,o=>i(void 0,void 0,void 0,function*(){const e=o.req.valid("param");return webhookHandler(o.req.raw,r,n,e.provider)})),t};
@@ -1,33 +1 @@
1
- import { z } from "@hono/zod-openapi";
2
- import { createApiRoute } from "../../core/hono/hono";
3
- import { ErrorSchema } from "../../schemas";
4
- const webhookRoute = createApiRoute({
5
- description: "Receive webhook events from payment providers",
6
- method: "POST",
7
- operationId: "webhook",
8
- path: "/webhook/payment/:provider",
9
- pathParams: z.object({
10
- provider: z.enum(["stripe", "revolut"]).openapi({
11
- description: "Payment provider",
12
- example: "stripe",
13
- param: {
14
- in: "path",
15
- name: "provider",
16
- },
17
- }),
18
- }),
19
- responses: {
20
- 200: z.object({
21
- received: z.boolean(),
22
- }),
23
- 400: ErrorSchema,
24
- 401: ErrorSchema,
25
- 500: ErrorSchema,
26
- },
27
- summary: "Process Event",
28
- tags: ["Webhook"],
29
- });
30
- export const webhookRoutes = {
31
- webhook: webhookRoute,
32
- };
33
- //# sourceMappingURL=webhook.route.js.map
1
+ import{z as e}from"@hono/zod-openapi";import{createApiRoute as r}from"../../core/hono/hono";import{ErrorSchema as o}from"../../schemas";const t=r({description:"Receive webhook events from payment providers",method:"POST",operationId:"webhook",path:"/webhook/payment/:provider",pathParams:e.object({provider:e.enum(["stripe","revolut"]).openapi({description:"Payment provider",example:"stripe",param:{in:"path",name:"provider"}})}),responses:{200:e.object({received:e.boolean()}),400:o,401:o,500:o},summary:"Process Event",tags:["Webhook"]});export const webhookRoutes={webhook:t};
package/src/index.js CHANGED
@@ -1,6 +1 @@
1
- export * from "./schemas";
2
- export * from "./features";
3
- export { buildApiApp } from "./app";
4
- export { generateOpenApiSpec } from "./core/openapi/openapi.lib";
5
- export { CartItemSchema } from "./features/cart/cart.schema";
6
- //# sourceMappingURL=index.js.map
1
+ export*from"./schemas";export*from"./features";export{buildApiApp}from"./app";export{generateOpenApiSpec}from"./core/openapi/openapi.lib";export{CartItemSchema}from"./features/cart/cart.schema";
@@ -1,82 +1 @@
1
- import { PrismaNeon } from "@prisma/adapter-neon";
2
- import { toNextJsHandler } from "better-auth/next-js";
3
- import { buildApiApp } from "../app";
4
- import { createAuthClient } from "../core/auth/better-auth.lib";
5
- import { createPrismaClient, } from "../core/lib/prisma";
6
- import { generateOpenApiSpec } from "../core/openapi/openapi.lib";
7
- export const createNextHandler = (options) => {
8
- var _a;
9
- // Reuse a single client per route module unless a caller injects one.
10
- const prisma = (_a = options.prisma) !== null && _a !== void 0 ? _a : (() => {
11
- if (!options.database) {
12
- throw new Error("createNextHandler requires either a `prisma` client or `database` options.");
13
- }
14
- if ("adapter" in options.database) {
15
- return createPrismaClient(options.database);
16
- }
17
- return createPrismaClient({
18
- adapter: new PrismaNeon({
19
- connectionString: options.database.connectionString,
20
- }),
21
- log: options.database.log,
22
- });
23
- })();
24
- const authClients = new Map();
25
- const getRequestAuthBaseURL = (request) => {
26
- if (options.auth.baseURL) {
27
- return options.auth.baseURL;
28
- }
29
- const url = new URL(request.url);
30
- return `${url.origin}/api/auth`;
31
- };
32
- const getAuth = (baseURL) => {
33
- const cachedAuth = authClients.get(baseURL);
34
- if (cachedAuth) {
35
- return cachedAuth;
36
- }
37
- const auth = createAuthClient(Object.assign(Object.assign({ prisma }, options.auth), { baseURL }));
38
- authClients.set(baseURL, auth);
39
- return auth;
40
- };
41
- const getOrganizationIdFromPath = (path) => {
42
- var _a, _b;
43
- const segments = path.split("/").filter(Boolean);
44
- if (segments[0] === "organizations") {
45
- return (_a = segments[1]) !== null && _a !== void 0 ? _a : "";
46
- }
47
- return (_b = segments[0]) !== null && _b !== void 0 ? _b : "";
48
- };
49
- const app = buildApiApp({
50
- corsOptions: options.corsOptions,
51
- maps: options.maps,
52
- payment: options.payment,
53
- prisma,
54
- resolveAuth: (request, path) => {
55
- const auth = getAuth(getRequestAuthBaseURL(request));
56
- const organizationId = getOrganizationIdFromPath(path);
57
- return {
58
- getCurrentUser: () => auth.getCurrentUser(request.headers),
59
- isGranted: (accessLevel) => auth.isGranted(request.headers, organizationId, accessLevel),
60
- };
61
- },
62
- });
63
- return (request) => {
64
- if (request.url.includes("/api/auth")) {
65
- const auth = getAuth(getRequestAuthBaseURL(request));
66
- const { GET, POST } = toNextJsHandler(auth.auth.handler);
67
- switch (request.method) {
68
- case "GET":
69
- return GET(request);
70
- case "POST":
71
- return POST(request);
72
- }
73
- }
74
- if (request.url.includes("/api/openapi.json")) {
75
- return Response.json(generateOpenApiSpec());
76
- }
77
- const url = new URL(request.url);
78
- url.pathname = url.pathname.replace(/^\/api/, "") || "/";
79
- return app.fetch(new Request(url, request));
80
- };
81
- };
82
- //# sourceMappingURL=next.js.map
1
+ import{PrismaNeon as m}from"@prisma/adapter-neon";import{toNextJsHandler as g}from"better-auth/next-js";import{buildApiApp as f}from"../app";import{createAuthClient as b}from"../core/auth/better-auth.lib";import{createPrismaClient as p}from"../core/lib/prisma";import{generateOpenApiSpec as w}from"../core/openapi/openapi.lib";export const createNextHandler=r=>{var i;const o=(i=r.prisma)!==null&&i!==void 0?i:(()=>{if(!r.database)throw new Error("createNextHandler requires either a `prisma` client or `database` options.");return"adapter"in r.database?p(r.database):p({adapter:new m({connectionString:r.database.connectionString}),log:r.database.log})})(),c=new Map,u=t=>r.auth.baseURL?r.auth.baseURL:`${new URL(t.url).origin}/api/auth`,l=t=>{const e=c.get(t);if(e)return e;const a=b(Object.assign(Object.assign({prisma:o},r.auth),{baseURL:t}));return c.set(t,a),a},h=t=>{var e,a;const n=t.split("/").filter(Boolean);return n[0]==="organizations"?(e=n[1])!==null&&e!==void 0?e:"":(a=n[0])!==null&&a!==void 0?a:""},d=f({corsOptions:r.corsOptions,maps:r.maps,payment:r.payment,prisma:o,resolveAuth:(t,e)=>{const a=l(u(t)),n=h(e);return{getCurrentUser:()=>a.getCurrentUser(t.headers),isGranted:s=>a.isGranted(t.headers,n,s)}}});return t=>{if(t.url.includes("/api/auth")){const a=l(u(t)),{GET:n,POST:s}=g(a.auth.handler);switch(t.method){case"GET":return n(t);case"POST":return s(t)}}if(t.url.includes("/api/openapi.json"))return Response.json(w());const e=new URL(t.url);return e.pathname=e.pathname.replace(/^\/api/,"")||"/",d.fetch(new Request(e,t))}};
@@ -1,112 +1 @@
1
- import { z } from "@hono/zod-openapi";
2
- /**
3
- * Address schema
4
- * Represents a physical address
5
- */
6
- export const AddressSchema = z
7
- .object({
8
- id: z.string().cuid().openapi({
9
- example: "clf9876543210abcdef",
10
- description: "The unique identifier of the address",
11
- }),
12
- firstname: z.string().optional().nullable().openapi({
13
- example: "John",
14
- description: "The first name of the recipient",
15
- }),
16
- lastname: z.string().optional().nullable().openapi({
17
- example: "Doe",
18
- description: "The last name of the recipient",
19
- }),
20
- phone: z.string().optional().nullable().openapi({
21
- example: "+1234567890",
22
- description: "Phone number of the recipient",
23
- }),
24
- addressLineOne: z.string().openapi({
25
- example: "123 Main Street",
26
- description: "The first line of the address",
27
- }),
28
- doorNumber: z.string().nullable().optional().openapi({
29
- description: "The door number of the address",
30
- }),
31
- addressLineTwo: z.string().nullable().optional().openapi({
32
- example: "Suite 100",
33
- description: "The second line of the address",
34
- }),
35
- zipCode: z.string().optional().openapi({
36
- example: "12345",
37
- description: "The postal code of the address",
38
- }),
39
- city: z.string().openapi({
40
- example: "New York",
41
- description: "The city of the address",
42
- }),
43
- country: z.string().openapi({
44
- example: "USA",
45
- description: "The country of the address",
46
- }),
47
- placeId: z.string().openapi({
48
- example: "ChIJN1t_tKlj4AR4GeTYWZ7frY",
49
- description: "The Google Place ID for the address",
50
- }),
51
- deliveryInstructions: z.string().nullable().optional().openapi({
52
- example: "Leave at the door",
53
- description: "Delivery instructions for the address",
54
- }),
55
- })
56
- .openapi("Address");
57
- export const CreateAddressSchema = AddressSchema.pick({
58
- addressLineOne: true,
59
- doorNumber: true,
60
- addressLineTwo: true,
61
- zipCode: true,
62
- city: true,
63
- country: true,
64
- placeId: true,
65
- }).openapi("CreateAddress");
66
- export const UpdateAddressSchema = CreateAddressSchema.partial().openapi("UpdateAddress");
67
- /**
68
- * Shipping address schema
69
- * Extends the address schema with additional fields for shipping
70
- */
71
- export const ShippingAddressSchema = AddressSchema.extend({
72
- firstname: z
73
- .string()
74
- .min(2, "First Name must be at least 2 characters")
75
- .openapi({
76
- example: "John",
77
- description: "The first name of the recipient",
78
- }),
79
- lastname: z
80
- .string()
81
- .min(1, "Last Name must be at least 2 characters")
82
- .openapi({
83
- example: "Doe",
84
- description: "The last name of the recipient",
85
- }),
86
- phone: z.string().min(4).openapi({
87
- example: "+1234567890",
88
- description: "Phone number of the recepient",
89
- }),
90
- });
91
- export const CreateShippingAddressSchema = ShippingAddressSchema.pick({
92
- firstname: true,
93
- lastname: true,
94
- phone: true,
95
- addressLineOne: true,
96
- addressLineTwo: true,
97
- doorNumber: true,
98
- zipCode: true,
99
- city: true,
100
- country: true,
101
- placeId: true,
102
- deliveryInstructions: true,
103
- });
104
- export const UpdateShippingAddressSchema = CreateShippingAddressSchema.partial()
105
- .extend({
106
- placeId: z.string().min(1, "This field is required").openapi({
107
- example: "ChIJN1t_tKlj4AR4GeTYWZ7frY",
108
- description: "The Google Place ID for the address",
109
- }),
110
- })
111
- .openapi("UpdateShippingAddress");
112
- //# sourceMappingURL=address.schema.js.map
1
+ import{z as e}from"@hono/zod-openapi";export const AddressSchema=e.object({id:e.string().cuid().openapi({example:"clf9876543210abcdef",description:"The unique identifier of the address"}),firstname:e.string().optional().nullable().openapi({example:"John",description:"The first name of the recipient"}),lastname:e.string().optional().nullable().openapi({example:"Doe",description:"The last name of the recipient"}),phone:e.string().optional().nullable().openapi({example:"+1234567890",description:"Phone number of the recipient"}),addressLineOne:e.string().openapi({example:"123 Main Street",description:"The first line of the address"}),doorNumber:e.string().nullable().optional().openapi({description:"The door number of the address"}),addressLineTwo:e.string().nullable().optional().openapi({example:"Suite 100",description:"The second line of the address"}),zipCode:e.string().optional().openapi({example:"12345",description:"The postal code of the address"}),city:e.string().openapi({example:"New York",description:"The city of the address"}),country:e.string().openapi({example:"USA",description:"The country of the address"}),placeId:e.string().openapi({example:"ChIJN1t_tKlj4AR4GeTYWZ7frY",description:"The Google Place ID for the address"}),deliveryInstructions:e.string().nullable().optional().openapi({example:"Leave at the door",description:"Delivery instructions for the address"})}).openapi("Address"),CreateAddressSchema=AddressSchema.pick({addressLineOne:!0,doorNumber:!0,addressLineTwo:!0,zipCode:!0,city:!0,country:!0,placeId:!0}).openapi("CreateAddress"),UpdateAddressSchema=CreateAddressSchema.partial().openapi("UpdateAddress"),ShippingAddressSchema=AddressSchema.extend({firstname:e.string().min(2,"First Name must be at least 2 characters").openapi({example:"John",description:"The first name of the recipient"}),lastname:e.string().min(1,"Last Name must be at least 2 characters").openapi({example:"Doe",description:"The last name of the recipient"}),phone:e.string().min(4).openapi({example:"+1234567890",description:"Phone number of the recepient"})}),CreateShippingAddressSchema=ShippingAddressSchema.pick({firstname:!0,lastname:!0,phone:!0,addressLineOne:!0,addressLineTwo:!0,doorNumber:!0,zipCode:!0,city:!0,country:!0,placeId:!0,deliveryInstructions:!0}),UpdateShippingAddressSchema=CreateShippingAddressSchema.partial().extend({placeId:e.string().min(1,"This field is required").openapi({example:"ChIJN1t_tKlj4AR4GeTYWZ7frY",description:"The Google Place ID for the address"})}).openapi("UpdateShippingAddress");