telegram-jobs-contract 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +73 -0
  2. package/dist/contracts/bundles.contract.d.ts +183 -0
  3. package/dist/contracts/bundles.contract.d.ts.map +1 -0
  4. package/dist/contracts/bundles.contract.js +29 -0
  5. package/dist/contracts/channels.contract.d.ts +947 -0
  6. package/dist/contracts/channels.contract.d.ts.map +1 -0
  7. package/dist/contracts/channels.contract.js +114 -0
  8. package/dist/contracts/jobs.contract.d.ts +939 -0
  9. package/dist/contracts/jobs.contract.d.ts.map +1 -0
  10. package/dist/contracts/jobs.contract.js +69 -0
  11. package/dist/contracts/notifications.contract.d.ts +725 -0
  12. package/dist/contracts/notifications.contract.d.ts.map +1 -0
  13. package/dist/contracts/notifications.contract.js +65 -0
  14. package/dist/contracts/resume.contract.d.ts +87 -0
  15. package/dist/contracts/resume.contract.d.ts.map +1 -0
  16. package/dist/contracts/resume.contract.js +26 -0
  17. package/dist/contracts/sniper.contract.d.ts +108 -0
  18. package/dist/contracts/sniper.contract.d.ts.map +1 -0
  19. package/dist/contracts/sniper.contract.js +27 -0
  20. package/dist/contracts/stats.contract.d.ts +148 -0
  21. package/dist/contracts/stats.contract.d.ts.map +1 -0
  22. package/dist/contracts/stats.contract.js +41 -0
  23. package/dist/contracts/user.contract.d.ts +362 -0
  24. package/dist/contracts/user.contract.d.ts.map +1 -0
  25. package/dist/contracts/user.contract.js +31 -0
  26. package/dist/index.d.ts +3504 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +58 -0
  29. package/dist/schemas/bundles.d.ts +33 -0
  30. package/dist/schemas/bundles.d.ts.map +1 -0
  31. package/dist/schemas/bundles.js +15 -0
  32. package/dist/schemas/channels.d.ts +134 -0
  33. package/dist/schemas/channels.d.ts.map +1 -0
  34. package/dist/schemas/channels.js +25 -0
  35. package/dist/schemas/common.d.ts +12 -0
  36. package/dist/schemas/common.d.ts.map +1 -0
  37. package/dist/schemas/common.js +8 -0
  38. package/dist/schemas/errors.d.ts +29 -0
  39. package/dist/schemas/errors.d.ts.map +1 -0
  40. package/dist/schemas/errors.js +17 -0
  41. package/dist/schemas/jobs.d.ts +563 -0
  42. package/dist/schemas/jobs.d.ts.map +1 -0
  43. package/dist/schemas/jobs.js +64 -0
  44. package/dist/schemas/user.d.ts +262 -0
  45. package/dist/schemas/user.d.ts.map +1 -0
  46. package/dist/schemas/user.js +36 -0
  47. package/package.json +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.contract.d.ts","sourceRoot":"","sources":["../../src/contracts/notifications.contract.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEhC,CAAC"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.notificationsContract = void 0;
4
+ const core_1 = require("@ts-rest/core");
5
+ const user_1 = require("../schemas/user");
6
+ const errors_1 = require("../schemas/errors");
7
+ const zod_1 = require("zod");
8
+ const c = (0, core_1.initContract)();
9
+ exports.notificationsContract = c.router({
10
+ getSettings: {
11
+ method: 'GET',
12
+ path: '/api/notifications/settings',
13
+ responses: {
14
+ 200: (0, errors_1.SuccessResponseSchema)(user_1.NotificationSettingsSchema),
15
+ 401: errors_1.ErrorResponseSchema,
16
+ 500: errors_1.ErrorResponseSchema,
17
+ },
18
+ summary: 'Get notification settings',
19
+ },
20
+ updateSettings: {
21
+ method: 'POST',
22
+ path: '/api/notifications/settings',
23
+ body: user_1.NotificationSettingsSchema,
24
+ responses: {
25
+ 200: (0, errors_1.SuccessResponseSchema)(user_1.NotificationSettingsSchema),
26
+ 400: errors_1.ErrorResponseSchema,
27
+ 401: errors_1.ErrorResponseSchema,
28
+ 500: errors_1.ErrorResponseSchema,
29
+ },
30
+ summary: 'Update notification settings',
31
+ },
32
+ sendTestNotification: {
33
+ method: 'POST',
34
+ path: '/api/notifications/test',
35
+ body: zod_1.z.object({}),
36
+ responses: {
37
+ 200: (0, errors_1.SuccessResponseSchema)(zod_1.z.object({ success: zod_1.z.boolean(), message: zod_1.z.string() })),
38
+ 401: errors_1.ErrorResponseSchema,
39
+ 500: errors_1.ErrorResponseSchema,
40
+ },
41
+ summary: 'Send test notification',
42
+ },
43
+ generateSubscriptionLink: {
44
+ method: 'POST',
45
+ path: '/api/notifications/generate-link',
46
+ body: zod_1.z.object({}),
47
+ responses: {
48
+ 200: (0, errors_1.SuccessResponseSchema)(zod_1.z.object({ link: zod_1.z.string(), token: zod_1.z.string() })),
49
+ 401: errors_1.ErrorResponseSchema,
50
+ 500: errors_1.ErrorResponseSchema,
51
+ },
52
+ summary: 'Generate Telegram bot subscription link',
53
+ },
54
+ handleTelegramWebhook: {
55
+ method: 'POST',
56
+ path: '/api/notifications/telegram/webhook',
57
+ body: user_1.TelegramWebhookSchema,
58
+ responses: {
59
+ 200: zod_1.z.object({ ok: zod_1.z.boolean() }),
60
+ 400: errors_1.ErrorResponseSchema,
61
+ 500: errors_1.ErrorResponseSchema,
62
+ },
63
+ summary: 'Telegram bot webhook endpoint (public)',
64
+ },
65
+ });
@@ -0,0 +1,87 @@
1
+ import { z } from 'zod';
2
+ export declare const resumeContract: {
3
+ uploadResume: {
4
+ summary: "Upload master resume (PDF/DOCX)";
5
+ method: "POST";
6
+ contentType: "multipart/form-data";
7
+ body: import("@ts-rest/core").ContractPlainType<{
8
+ resume: File;
9
+ }>;
10
+ path: "/api/resume/upload";
11
+ responses: {
12
+ 200: z.ZodObject<{
13
+ success: z.ZodLiteral<true>;
14
+ message: z.ZodString;
15
+ data: z.ZodObject<{
16
+ message: z.ZodString;
17
+ resumeText: z.ZodString;
18
+ fileUrl: z.ZodString;
19
+ }, "strip", z.ZodTypeAny, {
20
+ message: string;
21
+ resumeText: string;
22
+ fileUrl: string;
23
+ }, {
24
+ message: string;
25
+ resumeText: string;
26
+ fileUrl: string;
27
+ }>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ message: string;
30
+ success: true;
31
+ data: {
32
+ message: string;
33
+ resumeText: string;
34
+ fileUrl: string;
35
+ };
36
+ }, {
37
+ message: string;
38
+ success: true;
39
+ data: {
40
+ message: string;
41
+ resumeText: string;
42
+ fileUrl: string;
43
+ };
44
+ }>;
45
+ 400: z.ZodObject<{
46
+ success: z.ZodLiteral<false>;
47
+ message: z.ZodString;
48
+ errors: z.ZodOptional<z.ZodAny>;
49
+ }, "strip", z.ZodTypeAny, {
50
+ message: string;
51
+ success: false;
52
+ errors?: any;
53
+ }, {
54
+ message: string;
55
+ success: false;
56
+ errors?: any;
57
+ }>;
58
+ 401: z.ZodObject<{
59
+ success: z.ZodLiteral<false>;
60
+ message: z.ZodString;
61
+ errors: z.ZodOptional<z.ZodAny>;
62
+ }, "strip", z.ZodTypeAny, {
63
+ message: string;
64
+ success: false;
65
+ errors?: any;
66
+ }, {
67
+ message: string;
68
+ success: false;
69
+ errors?: any;
70
+ }>;
71
+ 500: z.ZodObject<{
72
+ success: z.ZodLiteral<false>;
73
+ message: z.ZodString;
74
+ errors: z.ZodOptional<z.ZodAny>;
75
+ }, "strip", z.ZodTypeAny, {
76
+ message: string;
77
+ success: false;
78
+ errors?: any;
79
+ }, {
80
+ message: string;
81
+ success: false;
82
+ errors?: any;
83
+ }>;
84
+ };
85
+ };
86
+ };
87
+ //# sourceMappingURL=resume.contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.contract.d.ts","sourceRoot":"","sources":["../../src/contracts/resume.contract.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc;;;;;;oBAKA,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAe7B,CAAC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resumeContract = void 0;
4
+ const core_1 = require("@ts-rest/core");
5
+ const errors_1 = require("../schemas/errors");
6
+ const zod_1 = require("zod");
7
+ const c = (0, core_1.initContract)();
8
+ exports.resumeContract = c.router({
9
+ uploadResume: {
10
+ method: 'POST',
11
+ path: '/api/resume/upload',
12
+ contentType: 'multipart/form-data',
13
+ body: c.type(),
14
+ responses: {
15
+ 200: (0, errors_1.SuccessResponseSchema)(zod_1.z.object({
16
+ message: zod_1.z.string(),
17
+ resumeText: zod_1.z.string(),
18
+ fileUrl: zod_1.z.string(),
19
+ })),
20
+ 400: errors_1.ErrorResponseSchema,
21
+ 401: errors_1.ErrorResponseSchema,
22
+ 500: errors_1.ErrorResponseSchema,
23
+ },
24
+ summary: 'Upload master resume (PDF/DOCX)',
25
+ },
26
+ });
@@ -0,0 +1,108 @@
1
+ import { z } from 'zod';
2
+ export declare const sniperContract: {
3
+ generateTailoredResume: {
4
+ summary: "Generate tailored resume for job";
5
+ method: "POST";
6
+ body: z.ZodObject<{
7
+ jobId: z.ZodString;
8
+ }, "strip", z.ZodTypeAny, {
9
+ jobId: string;
10
+ }, {
11
+ jobId: string;
12
+ }>;
13
+ path: "/api/sniper/generate";
14
+ responses: {
15
+ 200: z.ZodObject<{
16
+ success: z.ZodLiteral<true>;
17
+ message: z.ZodString;
18
+ data: z.ZodObject<{
19
+ pdfUrl: z.ZodString;
20
+ docxUrl: z.ZodString;
21
+ telegramMessage: z.ZodString;
22
+ coverLetter: z.ZodString;
23
+ }, "strip", z.ZodTypeAny, {
24
+ pdfUrl: string;
25
+ docxUrl: string;
26
+ telegramMessage: string;
27
+ coverLetter: string;
28
+ }, {
29
+ pdfUrl: string;
30
+ docxUrl: string;
31
+ telegramMessage: string;
32
+ coverLetter: string;
33
+ }>;
34
+ }, "strip", z.ZodTypeAny, {
35
+ message: string;
36
+ success: true;
37
+ data: {
38
+ pdfUrl: string;
39
+ docxUrl: string;
40
+ telegramMessage: string;
41
+ coverLetter: string;
42
+ };
43
+ }, {
44
+ message: string;
45
+ success: true;
46
+ data: {
47
+ pdfUrl: string;
48
+ docxUrl: string;
49
+ telegramMessage: string;
50
+ coverLetter: string;
51
+ };
52
+ }>;
53
+ 400: z.ZodObject<{
54
+ success: z.ZodLiteral<false>;
55
+ message: z.ZodString;
56
+ errors: z.ZodOptional<z.ZodAny>;
57
+ }, "strip", z.ZodTypeAny, {
58
+ message: string;
59
+ success: false;
60
+ errors?: any;
61
+ }, {
62
+ message: string;
63
+ success: false;
64
+ errors?: any;
65
+ }>;
66
+ 401: z.ZodObject<{
67
+ success: z.ZodLiteral<false>;
68
+ message: z.ZodString;
69
+ errors: z.ZodOptional<z.ZodAny>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ message: string;
72
+ success: false;
73
+ errors?: any;
74
+ }, {
75
+ message: string;
76
+ success: false;
77
+ errors?: any;
78
+ }>;
79
+ 404: z.ZodObject<{
80
+ success: z.ZodLiteral<false>;
81
+ message: z.ZodString;
82
+ errors: z.ZodOptional<z.ZodAny>;
83
+ }, "strip", z.ZodTypeAny, {
84
+ message: string;
85
+ success: false;
86
+ errors?: any;
87
+ }, {
88
+ message: string;
89
+ success: false;
90
+ errors?: any;
91
+ }>;
92
+ 500: z.ZodObject<{
93
+ success: z.ZodLiteral<false>;
94
+ message: z.ZodString;
95
+ errors: z.ZodOptional<z.ZodAny>;
96
+ }, "strip", z.ZodTypeAny, {
97
+ message: string;
98
+ success: false;
99
+ errors?: any;
100
+ }, {
101
+ message: string;
102
+ success: false;
103
+ errors?: any;
104
+ }>;
105
+ };
106
+ };
107
+ };
108
+ //# sourceMappingURL=sniper.contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sniper.contract.d.ts","sourceRoot":"","sources":["../../src/contracts/sniper.contract.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBzB,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sniperContract = void 0;
4
+ const core_1 = require("@ts-rest/core");
5
+ const errors_1 = require("../schemas/errors");
6
+ const zod_1 = require("zod");
7
+ const c = (0, core_1.initContract)();
8
+ exports.sniperContract = c.router({
9
+ generateTailoredResume: {
10
+ method: 'POST',
11
+ path: '/api/sniper/generate',
12
+ body: zod_1.z.object({ jobId: zod_1.z.string() }),
13
+ responses: {
14
+ 200: (0, errors_1.SuccessResponseSchema)(zod_1.z.object({
15
+ pdfUrl: zod_1.z.string(),
16
+ docxUrl: zod_1.z.string(),
17
+ telegramMessage: zod_1.z.string(),
18
+ coverLetter: zod_1.z.string(),
19
+ })),
20
+ 400: errors_1.ErrorResponseSchema,
21
+ 401: errors_1.ErrorResponseSchema,
22
+ 404: errors_1.ErrorResponseSchema,
23
+ 500: errors_1.ErrorResponseSchema,
24
+ },
25
+ summary: 'Generate tailored resume for job',
26
+ },
27
+ });
@@ -0,0 +1,148 @@
1
+ import { z } from 'zod';
2
+ export declare const statsContract: {
3
+ getPlatformStats: {
4
+ summary: "Get platform statistics";
5
+ method: "GET";
6
+ path: "/api/stats/platform";
7
+ responses: {
8
+ 200: z.ZodObject<{
9
+ success: z.ZodLiteral<true>;
10
+ message: z.ZodString;
11
+ data: z.ZodObject<{
12
+ totalJobs: z.ZodNumber;
13
+ totalChannels: z.ZodNumber;
14
+ totalUsers: z.ZodNumber;
15
+ activeUsers: z.ZodNumber;
16
+ jobsLast24h: z.ZodNumber;
17
+ }, "strip", z.ZodTypeAny, {
18
+ totalJobs: number;
19
+ totalChannels: number;
20
+ totalUsers: number;
21
+ activeUsers: number;
22
+ jobsLast24h: number;
23
+ }, {
24
+ totalJobs: number;
25
+ totalChannels: number;
26
+ totalUsers: number;
27
+ activeUsers: number;
28
+ jobsLast24h: number;
29
+ }>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ message: string;
32
+ success: true;
33
+ data: {
34
+ totalJobs: number;
35
+ totalChannels: number;
36
+ totalUsers: number;
37
+ activeUsers: number;
38
+ jobsLast24h: number;
39
+ };
40
+ }, {
41
+ message: string;
42
+ success: true;
43
+ data: {
44
+ totalJobs: number;
45
+ totalChannels: number;
46
+ totalUsers: number;
47
+ activeUsers: number;
48
+ jobsLast24h: number;
49
+ };
50
+ }>;
51
+ 500: z.ZodObject<{
52
+ success: z.ZodLiteral<false>;
53
+ message: z.ZodString;
54
+ errors: z.ZodOptional<z.ZodAny>;
55
+ }, "strip", z.ZodTypeAny, {
56
+ message: string;
57
+ success: false;
58
+ errors?: any;
59
+ }, {
60
+ message: string;
61
+ success: false;
62
+ errors?: any;
63
+ }>;
64
+ };
65
+ };
66
+ };
67
+ export declare const feedbackContract: {
68
+ submitFeedback: {
69
+ summary: "Submit user feedback";
70
+ method: "POST";
71
+ body: z.ZodObject<{
72
+ message: z.ZodString;
73
+ type: z.ZodOptional<z.ZodString>;
74
+ }, "strip", z.ZodTypeAny, {
75
+ message: string;
76
+ type?: string | undefined;
77
+ }, {
78
+ message: string;
79
+ type?: string | undefined;
80
+ }>;
81
+ path: "/api/feedback";
82
+ responses: {
83
+ 200: z.ZodObject<{
84
+ success: z.ZodLiteral<true>;
85
+ message: z.ZodString;
86
+ data: z.ZodObject<{
87
+ success: z.ZodBoolean;
88
+ }, "strip", z.ZodTypeAny, {
89
+ success: boolean;
90
+ }, {
91
+ success: boolean;
92
+ }>;
93
+ }, "strip", z.ZodTypeAny, {
94
+ message: string;
95
+ success: true;
96
+ data: {
97
+ success: boolean;
98
+ };
99
+ }, {
100
+ message: string;
101
+ success: true;
102
+ data: {
103
+ success: boolean;
104
+ };
105
+ }>;
106
+ 400: z.ZodObject<{
107
+ success: z.ZodLiteral<false>;
108
+ message: z.ZodString;
109
+ errors: z.ZodOptional<z.ZodAny>;
110
+ }, "strip", z.ZodTypeAny, {
111
+ message: string;
112
+ success: false;
113
+ errors?: any;
114
+ }, {
115
+ message: string;
116
+ success: false;
117
+ errors?: any;
118
+ }>;
119
+ 401: z.ZodObject<{
120
+ success: z.ZodLiteral<false>;
121
+ message: z.ZodString;
122
+ errors: z.ZodOptional<z.ZodAny>;
123
+ }, "strip", z.ZodTypeAny, {
124
+ message: string;
125
+ success: false;
126
+ errors?: any;
127
+ }, {
128
+ message: string;
129
+ success: false;
130
+ errors?: any;
131
+ }>;
132
+ 500: z.ZodObject<{
133
+ success: z.ZodLiteral<false>;
134
+ message: z.ZodString;
135
+ errors: z.ZodOptional<z.ZodAny>;
136
+ }, "strip", z.ZodTypeAny, {
137
+ message: string;
138
+ success: false;
139
+ errors?: any;
140
+ }, {
141
+ message: string;
142
+ success: false;
143
+ errors?: any;
144
+ }>;
145
+ };
146
+ };
147
+ };
148
+ //# sourceMappingURL=stats.contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.contract.d.ts","sourceRoot":"","sources":["../../src/contracts/stats.contract.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkBxB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgB3B,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.feedbackContract = exports.statsContract = void 0;
4
+ const core_1 = require("@ts-rest/core");
5
+ const errors_1 = require("../schemas/errors");
6
+ const zod_1 = require("zod");
7
+ const c = (0, core_1.initContract)();
8
+ exports.statsContract = c.router({
9
+ getPlatformStats: {
10
+ method: 'GET',
11
+ path: '/api/stats/platform',
12
+ responses: {
13
+ 200: (0, errors_1.SuccessResponseSchema)(zod_1.z.object({
14
+ totalJobs: zod_1.z.number(),
15
+ totalChannels: zod_1.z.number(),
16
+ totalUsers: zod_1.z.number(),
17
+ activeUsers: zod_1.z.number(),
18
+ jobsLast24h: zod_1.z.number(),
19
+ })),
20
+ 500: errors_1.ErrorResponseSchema,
21
+ },
22
+ summary: 'Get platform statistics',
23
+ },
24
+ });
25
+ exports.feedbackContract = c.router({
26
+ submitFeedback: {
27
+ method: 'POST',
28
+ path: '/api/feedback',
29
+ body: zod_1.z.object({
30
+ message: zod_1.z.string(),
31
+ type: zod_1.z.string().optional(),
32
+ }),
33
+ responses: {
34
+ 200: (0, errors_1.SuccessResponseSchema)(zod_1.z.object({ success: zod_1.z.boolean() })),
35
+ 400: errors_1.ErrorResponseSchema,
36
+ 401: errors_1.ErrorResponseSchema,
37
+ 500: errors_1.ErrorResponseSchema,
38
+ },
39
+ summary: 'Submit user feedback',
40
+ },
41
+ });