@86d-store/memberships 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +193 -0
  2. package/dist/admin/components/_shared.d.ts +13 -0
  3. package/dist/admin/components/_shared.d.ts.map +1 -0
  4. package/dist/admin/components/_shared.js +17 -0
  5. package/dist/admin/components/membership-admin.d.ts +2 -0
  6. package/dist/admin/components/membership-admin.d.ts.map +1 -0
  7. package/dist/admin/components/membership-admin.js +47 -0
  8. package/dist/admin/components/membership-plans.d.ts +2 -0
  9. package/dist/admin/components/membership-plans.d.ts.map +1 -0
  10. package/dist/admin/components/membership-plans.js +153 -0
  11. package/dist/admin/endpoints/add-benefit.d.ts +28 -0
  12. package/dist/admin/endpoints/add-benefit.d.ts.map +1 -0
  13. package/dist/admin/endpoints/add-benefit.js +37 -0
  14. package/dist/admin/endpoints/cancel-membership.d.ts +16 -0
  15. package/dist/admin/endpoints/cancel-membership.d.ts.map +1 -0
  16. package/dist/admin/endpoints/cancel-membership.js +19 -0
  17. package/dist/admin/endpoints/create-plan.d.ts +29 -0
  18. package/dist/admin/endpoints/create-plan.d.ts.map +1 -0
  19. package/dist/admin/endpoints/create-plan.js +48 -0
  20. package/dist/admin/endpoints/delete-plan.d.ts +16 -0
  21. package/dist/admin/endpoints/delete-plan.d.ts.map +1 -0
  22. package/dist/admin/endpoints/delete-plan.js +14 -0
  23. package/dist/admin/endpoints/gate-product.d.ts +19 -0
  24. package/dist/admin/endpoints/gate-product.d.ts.map +1 -0
  25. package/dist/admin/endpoints/gate-product.js +25 -0
  26. package/dist/admin/endpoints/get-membership.d.ts +18 -0
  27. package/dist/admin/endpoints/get-membership.d.ts.map +1 -0
  28. package/dist/admin/endpoints/get-membership.js +15 -0
  29. package/dist/admin/endpoints/get-stats.d.ts +6 -0
  30. package/dist/admin/endpoints/get-stats.d.ts.map +1 -0
  31. package/dist/admin/endpoints/get-stats.js +7 -0
  32. package/dist/admin/endpoints/list-memberships.d.ts +20 -0
  33. package/dist/admin/endpoints/list-memberships.d.ts.map +1 -0
  34. package/dist/admin/endpoints/list-memberships.js +32 -0
  35. package/dist/admin/endpoints/list-plans.d.ts +16 -0
  36. package/dist/admin/endpoints/list-plans.d.ts.map +1 -0
  37. package/dist/admin/endpoints/list-plans.js +29 -0
  38. package/dist/admin/endpoints/pause-membership.d.ts +16 -0
  39. package/dist/admin/endpoints/pause-membership.d.ts.map +1 -0
  40. package/dist/admin/endpoints/pause-membership.js +19 -0
  41. package/dist/admin/endpoints/remove-benefit.d.ts +16 -0
  42. package/dist/admin/endpoints/remove-benefit.d.ts.map +1 -0
  43. package/dist/admin/endpoints/remove-benefit.js +14 -0
  44. package/dist/admin/endpoints/resume-membership.d.ts +16 -0
  45. package/dist/admin/endpoints/resume-membership.d.ts.map +1 -0
  46. package/dist/admin/endpoints/resume-membership.js +19 -0
  47. package/dist/admin/endpoints/routes.d.ts +237 -0
  48. package/dist/admin/endpoints/routes.d.ts.map +1 -0
  49. package/dist/admin/endpoints/routes.js +30 -0
  50. package/dist/admin/endpoints/ungate-product.d.ts +13 -0
  51. package/dist/admin/endpoints/ungate-product.d.ts.map +1 -0
  52. package/dist/admin/endpoints/ungate-product.js +22 -0
  53. package/dist/admin/endpoints/update-plan.d.ts +32 -0
  54. package/dist/admin/endpoints/update-plan.d.ts.map +1 -0
  55. package/dist/admin/endpoints/update-plan.js +62 -0
  56. package/dist/index.d.ts +10 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +75 -0
  59. package/dist/schema.d.ts +102 -0
  60. package/dist/schema.d.ts.map +1 -0
  61. package/dist/schema.js +63 -0
  62. package/dist/service-impl.d.ts +4 -0
  63. package/dist/service-impl.d.ts.map +1 -0
  64. package/dist/service-impl.js +414 -0
  65. package/dist/service.d.ts +145 -0
  66. package/dist/service.d.ts.map +1 -0
  67. package/dist/service.js +1 -0
  68. package/dist/store/components/_hooks.d.ts +9 -0
  69. package/dist/store/components/_hooks.d.ts.map +1 -0
  70. package/dist/store/components/_hooks.js +13 -0
  71. package/dist/store/components/_utils.d.ts +11 -0
  72. package/dist/store/components/_utils.d.ts.map +1 -0
  73. package/dist/store/components/_utils.js +98 -0
  74. package/dist/store/components/mdx.d.ts +10 -0
  75. package/dist/store/components/mdx.d.ts.map +1 -0
  76. package/dist/store/components/mdx.js +9 -0
  77. package/dist/store/components/my-membership.d.ts +2 -0
  78. package/dist/store/components/my-membership.d.ts.map +1 -0
  79. package/dist/store/components/my-membership.js +42 -0
  80. package/dist/store/components/my-membership.mdx +13 -0
  81. package/dist/store/components/plan-detail.d.ts +5 -0
  82. package/dist/store/components/plan-detail.d.ts.map +1 -0
  83. package/dist/store/components/plan-detail.js +50 -0
  84. package/dist/store/components/plan-detail.mdx +15 -0
  85. package/dist/store/components/plan-listing.d.ts +2 -0
  86. package/dist/store/components/plan-listing.d.ts.map +1 -0
  87. package/dist/store/components/plan-listing.js +21 -0
  88. package/dist/store/components/plan-listing.mdx +13 -0
  89. package/dist/store/endpoints/cancel.d.ts +16 -0
  90. package/dist/store/endpoints/cancel.d.ts.map +1 -0
  91. package/dist/store/endpoints/cancel.js +25 -0
  92. package/dist/store/endpoints/check-access.d.ts +10 -0
  93. package/dist/store/endpoints/check-access.d.ts.map +1 -0
  94. package/dist/store/endpoints/check-access.js +20 -0
  95. package/dist/store/endpoints/get-membership.d.ts +19 -0
  96. package/dist/store/endpoints/get-membership.d.ts.map +1 -0
  97. package/dist/store/endpoints/get-membership.js +18 -0
  98. package/dist/store/endpoints/get-plan.d.ts +18 -0
  99. package/dist/store/endpoints/get-plan.d.ts.map +1 -0
  100. package/dist/store/endpoints/get-plan.js +17 -0
  101. package/dist/store/endpoints/list-plans.d.ts +11 -0
  102. package/dist/store/endpoints/list-plans.d.ts.map +1 -0
  103. package/dist/store/endpoints/list-plans.js +18 -0
  104. package/dist/store/endpoints/routes.d.ts +82 -0
  105. package/dist/store/endpoints/routes.d.ts.map +1 -0
  106. package/dist/store/endpoints/routes.js +14 -0
  107. package/dist/store/endpoints/subscribe.d.ts +16 -0
  108. package/dist/store/endpoints/subscribe.d.ts.map +1 -0
  109. package/dist/store/endpoints/subscribe.js +30 -0
  110. package/package.json +93 -0
@@ -0,0 +1,48 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { sanitizeText } from "@86d-store/core/sanitize";
3
+ import { z } from "zod";
4
+ export const createPlan = createAdminEndpoint("/admin/memberships/plans/create", {
5
+ method: "POST",
6
+ body: z.object({
7
+ name: z.string().min(1).max(200).transform(sanitizeText),
8
+ slug: z.string().min(1).max(200),
9
+ description: z.string().max(5000).transform(sanitizeText).optional(),
10
+ price: z.number().min(0),
11
+ billingInterval: z.enum(["monthly", "yearly", "lifetime"]),
12
+ trialDays: z.number().int().min(0).max(365).optional(),
13
+ features: z.array(z.string().max(500)).max(50).optional(),
14
+ isActive: z.boolean().optional(),
15
+ maxMembers: z.number().int().min(1).optional(),
16
+ sortOrder: z.number().int().min(0).max(10000).optional(),
17
+ }),
18
+ }, async (ctx) => {
19
+ const controller = ctx.context.controllers
20
+ .memberships;
21
+ const existing = await controller.getPlanBySlug(ctx.body.slug);
22
+ if (existing) {
23
+ return {
24
+ error: "A plan with this slug already exists",
25
+ status: 400,
26
+ };
27
+ }
28
+ const params = {
29
+ name: ctx.body.name,
30
+ slug: ctx.body.slug,
31
+ price: ctx.body.price,
32
+ billingInterval: ctx.body.billingInterval,
33
+ };
34
+ if (ctx.body.description != null)
35
+ params.description = ctx.body.description;
36
+ if (ctx.body.trialDays != null)
37
+ params.trialDays = ctx.body.trialDays;
38
+ if (ctx.body.features != null)
39
+ params.features = ctx.body.features;
40
+ if (ctx.body.isActive != null)
41
+ params.isActive = ctx.body.isActive;
42
+ if (ctx.body.maxMembers != null)
43
+ params.maxMembers = ctx.body.maxMembers;
44
+ if (ctx.body.sortOrder != null)
45
+ params.sortOrder = ctx.body.sortOrder;
46
+ const plan = await controller.createPlan(params);
47
+ return { plan };
48
+ });
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ export declare const deletePlan: import("better-call").StrictEndpoint<"/admin/memberships/plans/:id/delete", {
3
+ method: "POST";
4
+ params: z.ZodObject<{
5
+ id: z.ZodString;
6
+ }, z.core.$strip>;
7
+ }, {
8
+ error: string;
9
+ status: number;
10
+ success?: never;
11
+ } | {
12
+ success: boolean;
13
+ error?: never;
14
+ status?: never;
15
+ }>;
16
+ //# sourceMappingURL=delete-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-plan.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/delete-plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;EAiBtB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { z } from "zod";
3
+ export const deletePlan = createAdminEndpoint("/admin/memberships/plans/:id/delete", {
4
+ method: "POST",
5
+ params: z.object({ id: z.string().min(1) }),
6
+ }, async (ctx) => {
7
+ const controller = ctx.context.controllers
8
+ .memberships;
9
+ const deleted = await controller.deletePlan(ctx.params.id);
10
+ if (!deleted) {
11
+ return { error: "Plan not found", status: 404 };
12
+ }
13
+ return { success: true };
14
+ });
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ export declare const gateProduct: import("better-call").StrictEndpoint<"/admin/memberships/plans/:planId/products/gate", {
3
+ method: "POST";
4
+ params: z.ZodObject<{
5
+ planId: z.ZodString;
6
+ }, z.core.$strip>;
7
+ body: z.ZodObject<{
8
+ productIds: z.ZodArray<z.ZodString>;
9
+ }, z.core.$strip>;
10
+ }, {
11
+ error: string;
12
+ status: number;
13
+ gated?: never;
14
+ } | {
15
+ gated: number;
16
+ error?: never;
17
+ status?: never;
18
+ }>;
19
+ //# sourceMappingURL=gate-product.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-product.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/gate-product.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;EA6BvB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { z } from "zod";
3
+ export const gateProduct = createAdminEndpoint("/admin/memberships/plans/:planId/products/gate", {
4
+ method: "POST",
5
+ params: z.object({ planId: z.string().min(1) }),
6
+ body: z.object({
7
+ productIds: z.array(z.string().min(1)).min(1).max(100),
8
+ }),
9
+ }, async (ctx) => {
10
+ const controller = ctx.context.controllers
11
+ .memberships;
12
+ const plan = await controller.getPlan(ctx.params.planId);
13
+ if (!plan) {
14
+ return { error: "Plan not found", status: 404 };
15
+ }
16
+ let gated = 0;
17
+ for (const productId of ctx.body.productIds) {
18
+ await controller.gateProduct({
19
+ planId: ctx.params.planId,
20
+ productId,
21
+ });
22
+ gated++;
23
+ }
24
+ return { gated };
25
+ });
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ export declare const getMembership: import("better-call").StrictEndpoint<"/admin/memberships/:id", {
3
+ method: "GET";
4
+ params: z.ZodObject<{
5
+ id: z.ZodString;
6
+ }, z.core.$strip>;
7
+ }, {
8
+ error: string;
9
+ status: number;
10
+ membership?: never;
11
+ plan?: never;
12
+ } | {
13
+ membership: import("../..").Membership;
14
+ plan: import("../..").MembershipPlan | null;
15
+ error?: never;
16
+ status?: never;
17
+ }>;
18
+ //# sourceMappingURL=get-membership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-membership.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/get-membership.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;EAmBzB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { z } from "zod";
3
+ export const getMembership = createAdminEndpoint("/admin/memberships/:id", {
4
+ method: "GET",
5
+ params: z.object({ id: z.string().min(1) }),
6
+ }, async (ctx) => {
7
+ const controller = ctx.context.controllers
8
+ .memberships;
9
+ const membership = await controller.getMembership(ctx.params.id);
10
+ if (!membership) {
11
+ return { error: "Membership not found", status: 404 };
12
+ }
13
+ const plan = await controller.getPlan(membership.planId);
14
+ return { membership, plan };
15
+ });
@@ -0,0 +1,6 @@
1
+ export declare const getStats: import("better-call").StrictEndpoint<"/admin/memberships/stats", {
2
+ method: "GET";
3
+ }, {
4
+ stats: import("../..").MembershipStats;
5
+ }>;
6
+ //# sourceMappingURL=get-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-stats.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/get-stats.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ;;;;EAWpB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ export const getStats = createAdminEndpoint("/admin/memberships/stats", { method: "GET" }, async (ctx) => {
3
+ const controller = ctx.context.controllers
4
+ .memberships;
5
+ const stats = await controller.getStats();
6
+ return { stats };
7
+ });
@@ -0,0 +1,20 @@
1
+ import { z } from "zod";
2
+ export declare const listMemberships: import("better-call").StrictEndpoint<"/admin/memberships", {
3
+ method: "GET";
4
+ query: z.ZodObject<{
5
+ planId: z.ZodOptional<z.ZodString>;
6
+ status: z.ZodOptional<z.ZodEnum<{
7
+ active: "active";
8
+ trial: "trial";
9
+ expired: "expired";
10
+ cancelled: "cancelled";
11
+ paused: "paused";
12
+ }>>;
13
+ take: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
14
+ skip: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
15
+ }, z.core.$strip>;
16
+ }, {
17
+ memberships: import("../..").Membership[];
18
+ total: number;
19
+ }>;
20
+ //# sourceMappingURL=list-memberships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-memberships.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/list-memberships.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;EAiC3B,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { z } from "zod";
3
+ export const listMemberships = createAdminEndpoint("/admin/memberships", {
4
+ method: "GET",
5
+ query: z.object({
6
+ planId: z.string().optional(),
7
+ status: z
8
+ .enum(["active", "trial", "expired", "cancelled", "paused"])
9
+ .optional(),
10
+ take: z.coerce.number().int().min(1).max(100).optional(),
11
+ skip: z.coerce.number().int().min(0).optional(),
12
+ }),
13
+ }, async (ctx) => {
14
+ const controller = ctx.context.controllers
15
+ .memberships;
16
+ const params = {
17
+ take: ctx.query.take ?? 50,
18
+ skip: ctx.query.skip ?? 0,
19
+ };
20
+ if (ctx.query.planId != null)
21
+ params.planId = ctx.query.planId;
22
+ if (ctx.query.status != null)
23
+ params.status = ctx.query.status;
24
+ const memberships = await controller.listMemberships(params);
25
+ const countParams = {};
26
+ if (ctx.query.planId != null)
27
+ countParams.planId = ctx.query.planId;
28
+ if (ctx.query.status != null)
29
+ countParams.status = ctx.query.status;
30
+ const total = await controller.countMemberships(countParams);
31
+ return { memberships, total };
32
+ });
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ export declare const listPlans: import("better-call").StrictEndpoint<"/admin/memberships/plans", {
3
+ method: "GET";
4
+ query: z.ZodObject<{
5
+ active: z.ZodOptional<z.ZodEnum<{
6
+ true: "true";
7
+ false: "false";
8
+ }>>;
9
+ take: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
10
+ skip: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
11
+ }, z.core.$strip>;
12
+ }, {
13
+ plans: import("../..").MembershipPlan[];
14
+ total: number;
15
+ }>;
16
+ //# sourceMappingURL=list-plans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-plans.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/list-plans.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,SAAS;;;;;;;;;;;;;EA8BrB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { z } from "zod";
3
+ export const listPlans = createAdminEndpoint("/admin/memberships/plans", {
4
+ method: "GET",
5
+ query: z.object({
6
+ active: z.enum(["true", "false"]).optional(),
7
+ take: z.coerce.number().int().min(1).max(100).optional(),
8
+ skip: z.coerce.number().int().min(0).optional(),
9
+ }),
10
+ }, async (ctx) => {
11
+ const controller = ctx.context.controllers
12
+ .memberships;
13
+ const params = {
14
+ take: ctx.query.take ?? 50,
15
+ skip: ctx.query.skip ?? 0,
16
+ };
17
+ if (ctx.query.active === "true")
18
+ params.isActive = true;
19
+ else if (ctx.query.active === "false")
20
+ params.isActive = false;
21
+ const plans = await controller.listPlans(params);
22
+ const countParams = {};
23
+ if (ctx.query.active === "true")
24
+ countParams.isActive = true;
25
+ else if (ctx.query.active === "false")
26
+ countParams.isActive = false;
27
+ const total = await controller.countPlans(countParams);
28
+ return { plans, total };
29
+ });
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ export declare const pauseMembership: import("better-call").StrictEndpoint<"/admin/memberships/:id/pause", {
3
+ method: "POST";
4
+ params: z.ZodObject<{
5
+ id: z.ZodString;
6
+ }, z.core.$strip>;
7
+ }, {
8
+ error: string;
9
+ status: number;
10
+ membership?: never;
11
+ } | {
12
+ membership: import("../..").Membership;
13
+ error?: never;
14
+ status?: never;
15
+ }>;
16
+ //# sourceMappingURL=pause-membership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause-membership.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/pause-membership.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;EAqB3B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { z } from "zod";
3
+ export const pauseMembership = createAdminEndpoint("/admin/memberships/:id/pause", {
4
+ method: "POST",
5
+ params: z.object({ id: z.string().min(1) }),
6
+ }, async (ctx) => {
7
+ const controller = ctx.context.controllers
8
+ .memberships;
9
+ const membership = await controller.pauseMembership(ctx.params.id);
10
+ if (!membership) {
11
+ return { error: "Membership not found", status: 404 };
12
+ }
13
+ void ctx.context.events?.emit("membership.paused", {
14
+ membershipId: membership.id,
15
+ customerId: membership.customerId,
16
+ planId: membership.planId,
17
+ });
18
+ return { membership };
19
+ });
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ export declare const removeBenefit: import("better-call").StrictEndpoint<"/admin/memberships/benefits/:id/remove", {
3
+ method: "POST";
4
+ params: z.ZodObject<{
5
+ id: z.ZodString;
6
+ }, z.core.$strip>;
7
+ }, {
8
+ error: string;
9
+ status: number;
10
+ success?: never;
11
+ } | {
12
+ success: boolean;
13
+ error?: never;
14
+ status?: never;
15
+ }>;
16
+ //# sourceMappingURL=remove-benefit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-benefit.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/remove-benefit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;EAiBzB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { z } from "zod";
3
+ export const removeBenefit = createAdminEndpoint("/admin/memberships/benefits/:id/remove", {
4
+ method: "POST",
5
+ params: z.object({ id: z.string().min(1) }),
6
+ }, async (ctx) => {
7
+ const controller = ctx.context.controllers
8
+ .memberships;
9
+ const removed = await controller.removeBenefit(ctx.params.id);
10
+ if (!removed) {
11
+ return { error: "Benefit not found", status: 404 };
12
+ }
13
+ return { success: true };
14
+ });
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ export declare const resumeMembership: import("better-call").StrictEndpoint<"/admin/memberships/:id/resume", {
3
+ method: "POST";
4
+ params: z.ZodObject<{
5
+ id: z.ZodString;
6
+ }, z.core.$strip>;
7
+ }, {
8
+ error: string;
9
+ status: number;
10
+ membership?: never;
11
+ } | {
12
+ membership: import("../..").Membership;
13
+ error?: never;
14
+ status?: never;
15
+ }>;
16
+ //# sourceMappingURL=resume-membership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-membership.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/resume-membership.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;EAqB5B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { z } from "zod";
3
+ export const resumeMembership = createAdminEndpoint("/admin/memberships/:id/resume", {
4
+ method: "POST",
5
+ params: z.object({ id: z.string().min(1) }),
6
+ }, async (ctx) => {
7
+ const controller = ctx.context.controllers
8
+ .memberships;
9
+ const membership = await controller.resumeMembership(ctx.params.id);
10
+ if (!membership) {
11
+ return { error: "Membership not found", status: 404 };
12
+ }
13
+ void ctx.context.events?.emit("membership.resumed", {
14
+ membershipId: membership.id,
15
+ customerId: membership.customerId,
16
+ planId: membership.planId,
17
+ });
18
+ return { membership };
19
+ });