jansathi-community-schema 0.12.0 → 0.13.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.
- package/dist/community.d.ts +66 -6
- package/dist/community.d.ts.map +1 -1
- package/dist/community.js +15 -3
- package/dist/community.js.map +1 -1
- package/package.json +1 -1
package/dist/community.d.ts
CHANGED
|
@@ -94,7 +94,7 @@ export declare const communityVerifiedScopeSchema: z.ZodEnum<{
|
|
|
94
94
|
* See `docs/community-create-v2.md` §2 in the jansathi-frontend repo
|
|
95
95
|
* for the full label table.
|
|
96
96
|
*/
|
|
97
|
-
export declare const COMMUNITY_CATEGORY_VALUES: readonly ["womens_group", "mens_group", "youth_group", "senior_citizens", "parenting_children", "resident_welfare", "social_welfare", "social_awareness", "volunteering", "civic_reform", "local_news_issues", "environment", "religion_spirituality", "festivals_culture", "devotional", "education", "competitive_exams", "books_literature", "language_learning", "health_wellness", "yoga_meditation", "fitness", "mental_health", "food_cooking", "travel", "photography", "fashion_beauty", "sports", "cricket", "arts_crafts", "music", "dance", "movies_tv", "gaming", "entertainment", "business_career", "entrepreneurship", "technology", "finance_investing", "agriculture", "news_current_affairs", "other"];
|
|
97
|
+
export declare const COMMUNITY_CATEGORY_VALUES: readonly ["womens_group", "mens_group", "youth_group", "senior_citizens", "parenting_children", "resident_welfare", "social_welfare", "social_awareness", "volunteering", "civic_reform", "local_news_issues", "environment", "legal_law", "politics_government", "real_estate_housing", "religion_spirituality", "festivals_culture", "devotional", "education", "competitive_exams", "books_literature", "language_learning", "science", "health_wellness", "yoga_meditation", "fitness", "mental_health", "lgbtq_identity", "mature_topics", "food_cooking", "travel", "photography", "fashion_beauty", "home_garden", "pets_animals", "vehicles_automotive", "sports", "cricket", "arts_crafts", "music", "dance", "movies_tv", "gaming", "entertainment", "anime_cosplay", "business_career", "entrepreneurship", "technology", "finance_investing", "agriculture", "news_current_affairs", "other"];
|
|
98
98
|
export type CommunityCategory = (typeof COMMUNITY_CATEGORY_VALUES)[number];
|
|
99
99
|
export declare const communityCategorySchema: z.ZodEnum<{
|
|
100
100
|
other: "other";
|
|
@@ -110,6 +110,9 @@ export declare const communityCategorySchema: z.ZodEnum<{
|
|
|
110
110
|
civic_reform: "civic_reform";
|
|
111
111
|
local_news_issues: "local_news_issues";
|
|
112
112
|
environment: "environment";
|
|
113
|
+
legal_law: "legal_law";
|
|
114
|
+
politics_government: "politics_government";
|
|
115
|
+
real_estate_housing: "real_estate_housing";
|
|
113
116
|
religion_spirituality: "religion_spirituality";
|
|
114
117
|
festivals_culture: "festivals_culture";
|
|
115
118
|
devotional: "devotional";
|
|
@@ -117,14 +120,20 @@ export declare const communityCategorySchema: z.ZodEnum<{
|
|
|
117
120
|
competitive_exams: "competitive_exams";
|
|
118
121
|
books_literature: "books_literature";
|
|
119
122
|
language_learning: "language_learning";
|
|
123
|
+
science: "science";
|
|
120
124
|
health_wellness: "health_wellness";
|
|
121
125
|
yoga_meditation: "yoga_meditation";
|
|
122
126
|
fitness: "fitness";
|
|
123
127
|
mental_health: "mental_health";
|
|
128
|
+
lgbtq_identity: "lgbtq_identity";
|
|
129
|
+
mature_topics: "mature_topics";
|
|
124
130
|
food_cooking: "food_cooking";
|
|
125
131
|
travel: "travel";
|
|
126
132
|
photography: "photography";
|
|
127
133
|
fashion_beauty: "fashion_beauty";
|
|
134
|
+
home_garden: "home_garden";
|
|
135
|
+
pets_animals: "pets_animals";
|
|
136
|
+
vehicles_automotive: "vehicles_automotive";
|
|
128
137
|
sports: "sports";
|
|
129
138
|
cricket: "cricket";
|
|
130
139
|
arts_crafts: "arts_crafts";
|
|
@@ -133,6 +142,7 @@ export declare const communityCategorySchema: z.ZodEnum<{
|
|
|
133
142
|
movies_tv: "movies_tv";
|
|
134
143
|
gaming: "gaming";
|
|
135
144
|
entertainment: "entertainment";
|
|
145
|
+
anime_cosplay: "anime_cosplay";
|
|
136
146
|
business_career: "business_career";
|
|
137
147
|
entrepreneurship: "entrepreneurship";
|
|
138
148
|
technology: "technology";
|
|
@@ -153,6 +163,7 @@ export declare const COMMUNITY_TAG_VALUES: readonly ["volunteer", "donation_driv
|
|
|
153
163
|
export type CommunityTag = (typeof COMMUNITY_TAG_VALUES)[number];
|
|
154
164
|
export declare const communityTagSchema: z.ZodEnum<{
|
|
155
165
|
environment: "environment";
|
|
166
|
+
science: "science";
|
|
156
167
|
fitness: "fitness";
|
|
157
168
|
mental_health: "mental_health";
|
|
158
169
|
photography: "photography";
|
|
@@ -205,7 +216,6 @@ export declare const communityTagSchema: z.ZodEnum<{
|
|
|
205
216
|
career_guidance: "career_guidance";
|
|
206
217
|
coding: "coding";
|
|
207
218
|
mathematics: "mathematics";
|
|
208
|
-
science: "science";
|
|
209
219
|
languages: "languages";
|
|
210
220
|
spoken_english: "spoken_english";
|
|
211
221
|
tutoring: "tutoring";
|
|
@@ -417,6 +427,9 @@ export declare const communityWireSchema: z.ZodObject<{
|
|
|
417
427
|
civic_reform: "civic_reform";
|
|
418
428
|
local_news_issues: "local_news_issues";
|
|
419
429
|
environment: "environment";
|
|
430
|
+
legal_law: "legal_law";
|
|
431
|
+
politics_government: "politics_government";
|
|
432
|
+
real_estate_housing: "real_estate_housing";
|
|
420
433
|
religion_spirituality: "religion_spirituality";
|
|
421
434
|
festivals_culture: "festivals_culture";
|
|
422
435
|
devotional: "devotional";
|
|
@@ -424,14 +437,20 @@ export declare const communityWireSchema: z.ZodObject<{
|
|
|
424
437
|
competitive_exams: "competitive_exams";
|
|
425
438
|
books_literature: "books_literature";
|
|
426
439
|
language_learning: "language_learning";
|
|
440
|
+
science: "science";
|
|
427
441
|
health_wellness: "health_wellness";
|
|
428
442
|
yoga_meditation: "yoga_meditation";
|
|
429
443
|
fitness: "fitness";
|
|
430
444
|
mental_health: "mental_health";
|
|
445
|
+
lgbtq_identity: "lgbtq_identity";
|
|
446
|
+
mature_topics: "mature_topics";
|
|
431
447
|
food_cooking: "food_cooking";
|
|
432
448
|
travel: "travel";
|
|
433
449
|
photography: "photography";
|
|
434
450
|
fashion_beauty: "fashion_beauty";
|
|
451
|
+
home_garden: "home_garden";
|
|
452
|
+
pets_animals: "pets_animals";
|
|
453
|
+
vehicles_automotive: "vehicles_automotive";
|
|
435
454
|
sports: "sports";
|
|
436
455
|
cricket: "cricket";
|
|
437
456
|
arts_crafts: "arts_crafts";
|
|
@@ -440,6 +459,7 @@ export declare const communityWireSchema: z.ZodObject<{
|
|
|
440
459
|
movies_tv: "movies_tv";
|
|
441
460
|
gaming: "gaming";
|
|
442
461
|
entertainment: "entertainment";
|
|
462
|
+
anime_cosplay: "anime_cosplay";
|
|
443
463
|
business_career: "business_career";
|
|
444
464
|
entrepreneurship: "entrepreneurship";
|
|
445
465
|
technology: "technology";
|
|
@@ -456,6 +476,7 @@ export declare const communityWireSchema: z.ZodObject<{
|
|
|
456
476
|
}>;
|
|
457
477
|
tags: z.ZodArray<z.ZodEnum<{
|
|
458
478
|
environment: "environment";
|
|
479
|
+
science: "science";
|
|
459
480
|
fitness: "fitness";
|
|
460
481
|
mental_health: "mental_health";
|
|
461
482
|
photography: "photography";
|
|
@@ -508,7 +529,6 @@ export declare const communityWireSchema: z.ZodObject<{
|
|
|
508
529
|
career_guidance: "career_guidance";
|
|
509
530
|
coding: "coding";
|
|
510
531
|
mathematics: "mathematics";
|
|
511
|
-
science: "science";
|
|
512
532
|
languages: "languages";
|
|
513
533
|
spoken_english: "spoken_english";
|
|
514
534
|
tutoring: "tutoring";
|
|
@@ -703,6 +723,9 @@ export declare const createCommunityBodySchema: z.ZodObject<{
|
|
|
703
723
|
civic_reform: "civic_reform";
|
|
704
724
|
local_news_issues: "local_news_issues";
|
|
705
725
|
environment: "environment";
|
|
726
|
+
legal_law: "legal_law";
|
|
727
|
+
politics_government: "politics_government";
|
|
728
|
+
real_estate_housing: "real_estate_housing";
|
|
706
729
|
religion_spirituality: "religion_spirituality";
|
|
707
730
|
festivals_culture: "festivals_culture";
|
|
708
731
|
devotional: "devotional";
|
|
@@ -710,14 +733,20 @@ export declare const createCommunityBodySchema: z.ZodObject<{
|
|
|
710
733
|
competitive_exams: "competitive_exams";
|
|
711
734
|
books_literature: "books_literature";
|
|
712
735
|
language_learning: "language_learning";
|
|
736
|
+
science: "science";
|
|
713
737
|
health_wellness: "health_wellness";
|
|
714
738
|
yoga_meditation: "yoga_meditation";
|
|
715
739
|
fitness: "fitness";
|
|
716
740
|
mental_health: "mental_health";
|
|
741
|
+
lgbtq_identity: "lgbtq_identity";
|
|
742
|
+
mature_topics: "mature_topics";
|
|
717
743
|
food_cooking: "food_cooking";
|
|
718
744
|
travel: "travel";
|
|
719
745
|
photography: "photography";
|
|
720
746
|
fashion_beauty: "fashion_beauty";
|
|
747
|
+
home_garden: "home_garden";
|
|
748
|
+
pets_animals: "pets_animals";
|
|
749
|
+
vehicles_automotive: "vehicles_automotive";
|
|
721
750
|
sports: "sports";
|
|
722
751
|
cricket: "cricket";
|
|
723
752
|
arts_crafts: "arts_crafts";
|
|
@@ -726,6 +755,7 @@ export declare const createCommunityBodySchema: z.ZodObject<{
|
|
|
726
755
|
movies_tv: "movies_tv";
|
|
727
756
|
gaming: "gaming";
|
|
728
757
|
entertainment: "entertainment";
|
|
758
|
+
anime_cosplay: "anime_cosplay";
|
|
729
759
|
business_career: "business_career";
|
|
730
760
|
entrepreneurship: "entrepreneurship";
|
|
731
761
|
technology: "technology";
|
|
@@ -743,6 +773,7 @@ export declare const createCommunityBodySchema: z.ZodObject<{
|
|
|
743
773
|
areaId: z.ZodOptional<z.ZodString>;
|
|
744
774
|
tags: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
745
775
|
environment: "environment";
|
|
776
|
+
science: "science";
|
|
746
777
|
fitness: "fitness";
|
|
747
778
|
mental_health: "mental_health";
|
|
748
779
|
photography: "photography";
|
|
@@ -795,7 +826,6 @@ export declare const createCommunityBodySchema: z.ZodObject<{
|
|
|
795
826
|
career_guidance: "career_guidance";
|
|
796
827
|
coding: "coding";
|
|
797
828
|
mathematics: "mathematics";
|
|
798
|
-
science: "science";
|
|
799
829
|
languages: "languages";
|
|
800
830
|
spoken_english: "spoken_english";
|
|
801
831
|
tutoring: "tutoring";
|
|
@@ -890,6 +920,9 @@ export declare const updateCommunityBodySchema: z.ZodObject<{
|
|
|
890
920
|
civic_reform: "civic_reform";
|
|
891
921
|
local_news_issues: "local_news_issues";
|
|
892
922
|
environment: "environment";
|
|
923
|
+
legal_law: "legal_law";
|
|
924
|
+
politics_government: "politics_government";
|
|
925
|
+
real_estate_housing: "real_estate_housing";
|
|
893
926
|
religion_spirituality: "religion_spirituality";
|
|
894
927
|
festivals_culture: "festivals_culture";
|
|
895
928
|
devotional: "devotional";
|
|
@@ -897,14 +930,20 @@ export declare const updateCommunityBodySchema: z.ZodObject<{
|
|
|
897
930
|
competitive_exams: "competitive_exams";
|
|
898
931
|
books_literature: "books_literature";
|
|
899
932
|
language_learning: "language_learning";
|
|
933
|
+
science: "science";
|
|
900
934
|
health_wellness: "health_wellness";
|
|
901
935
|
yoga_meditation: "yoga_meditation";
|
|
902
936
|
fitness: "fitness";
|
|
903
937
|
mental_health: "mental_health";
|
|
938
|
+
lgbtq_identity: "lgbtq_identity";
|
|
939
|
+
mature_topics: "mature_topics";
|
|
904
940
|
food_cooking: "food_cooking";
|
|
905
941
|
travel: "travel";
|
|
906
942
|
photography: "photography";
|
|
907
943
|
fashion_beauty: "fashion_beauty";
|
|
944
|
+
home_garden: "home_garden";
|
|
945
|
+
pets_animals: "pets_animals";
|
|
946
|
+
vehicles_automotive: "vehicles_automotive";
|
|
908
947
|
sports: "sports";
|
|
909
948
|
cricket: "cricket";
|
|
910
949
|
arts_crafts: "arts_crafts";
|
|
@@ -913,6 +952,7 @@ export declare const updateCommunityBodySchema: z.ZodObject<{
|
|
|
913
952
|
movies_tv: "movies_tv";
|
|
914
953
|
gaming: "gaming";
|
|
915
954
|
entertainment: "entertainment";
|
|
955
|
+
anime_cosplay: "anime_cosplay";
|
|
916
956
|
business_career: "business_career";
|
|
917
957
|
entrepreneurship: "entrepreneurship";
|
|
918
958
|
technology: "technology";
|
|
@@ -922,6 +962,7 @@ export declare const updateCommunityBodySchema: z.ZodObject<{
|
|
|
922
962
|
}>>;
|
|
923
963
|
tags: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
924
964
|
environment: "environment";
|
|
965
|
+
science: "science";
|
|
925
966
|
fitness: "fitness";
|
|
926
967
|
mental_health: "mental_health";
|
|
927
968
|
photography: "photography";
|
|
@@ -974,7 +1015,6 @@ export declare const updateCommunityBodySchema: z.ZodObject<{
|
|
|
974
1015
|
career_guidance: "career_guidance";
|
|
975
1016
|
coding: "coding";
|
|
976
1017
|
mathematics: "mathematics";
|
|
977
|
-
science: "science";
|
|
978
1018
|
languages: "languages";
|
|
979
1019
|
spoken_english: "spoken_english";
|
|
980
1020
|
tutoring: "tutoring";
|
|
@@ -1070,6 +1110,9 @@ export declare const communityListQuerySchema: z.ZodObject<{
|
|
|
1070
1110
|
civic_reform: "civic_reform";
|
|
1071
1111
|
local_news_issues: "local_news_issues";
|
|
1072
1112
|
environment: "environment";
|
|
1113
|
+
legal_law: "legal_law";
|
|
1114
|
+
politics_government: "politics_government";
|
|
1115
|
+
real_estate_housing: "real_estate_housing";
|
|
1073
1116
|
religion_spirituality: "religion_spirituality";
|
|
1074
1117
|
festivals_culture: "festivals_culture";
|
|
1075
1118
|
devotional: "devotional";
|
|
@@ -1077,14 +1120,20 @@ export declare const communityListQuerySchema: z.ZodObject<{
|
|
|
1077
1120
|
competitive_exams: "competitive_exams";
|
|
1078
1121
|
books_literature: "books_literature";
|
|
1079
1122
|
language_learning: "language_learning";
|
|
1123
|
+
science: "science";
|
|
1080
1124
|
health_wellness: "health_wellness";
|
|
1081
1125
|
yoga_meditation: "yoga_meditation";
|
|
1082
1126
|
fitness: "fitness";
|
|
1083
1127
|
mental_health: "mental_health";
|
|
1128
|
+
lgbtq_identity: "lgbtq_identity";
|
|
1129
|
+
mature_topics: "mature_topics";
|
|
1084
1130
|
food_cooking: "food_cooking";
|
|
1085
1131
|
travel: "travel";
|
|
1086
1132
|
photography: "photography";
|
|
1087
1133
|
fashion_beauty: "fashion_beauty";
|
|
1134
|
+
home_garden: "home_garden";
|
|
1135
|
+
pets_animals: "pets_animals";
|
|
1136
|
+
vehicles_automotive: "vehicles_automotive";
|
|
1088
1137
|
sports: "sports";
|
|
1089
1138
|
cricket: "cricket";
|
|
1090
1139
|
arts_crafts: "arts_crafts";
|
|
@@ -1093,6 +1142,7 @@ export declare const communityListQuerySchema: z.ZodObject<{
|
|
|
1093
1142
|
movies_tv: "movies_tv";
|
|
1094
1143
|
gaming: "gaming";
|
|
1095
1144
|
entertainment: "entertainment";
|
|
1145
|
+
anime_cosplay: "anime_cosplay";
|
|
1096
1146
|
business_career: "business_career";
|
|
1097
1147
|
entrepreneurship: "entrepreneurship";
|
|
1098
1148
|
technology: "technology";
|
|
@@ -1144,6 +1194,9 @@ export declare const communityListResponseSchema: z.ZodObject<{
|
|
|
1144
1194
|
civic_reform: "civic_reform";
|
|
1145
1195
|
local_news_issues: "local_news_issues";
|
|
1146
1196
|
environment: "environment";
|
|
1197
|
+
legal_law: "legal_law";
|
|
1198
|
+
politics_government: "politics_government";
|
|
1199
|
+
real_estate_housing: "real_estate_housing";
|
|
1147
1200
|
religion_spirituality: "religion_spirituality";
|
|
1148
1201
|
festivals_culture: "festivals_culture";
|
|
1149
1202
|
devotional: "devotional";
|
|
@@ -1151,14 +1204,20 @@ export declare const communityListResponseSchema: z.ZodObject<{
|
|
|
1151
1204
|
competitive_exams: "competitive_exams";
|
|
1152
1205
|
books_literature: "books_literature";
|
|
1153
1206
|
language_learning: "language_learning";
|
|
1207
|
+
science: "science";
|
|
1154
1208
|
health_wellness: "health_wellness";
|
|
1155
1209
|
yoga_meditation: "yoga_meditation";
|
|
1156
1210
|
fitness: "fitness";
|
|
1157
1211
|
mental_health: "mental_health";
|
|
1212
|
+
lgbtq_identity: "lgbtq_identity";
|
|
1213
|
+
mature_topics: "mature_topics";
|
|
1158
1214
|
food_cooking: "food_cooking";
|
|
1159
1215
|
travel: "travel";
|
|
1160
1216
|
photography: "photography";
|
|
1161
1217
|
fashion_beauty: "fashion_beauty";
|
|
1218
|
+
home_garden: "home_garden";
|
|
1219
|
+
pets_animals: "pets_animals";
|
|
1220
|
+
vehicles_automotive: "vehicles_automotive";
|
|
1162
1221
|
sports: "sports";
|
|
1163
1222
|
cricket: "cricket";
|
|
1164
1223
|
arts_crafts: "arts_crafts";
|
|
@@ -1167,6 +1226,7 @@ export declare const communityListResponseSchema: z.ZodObject<{
|
|
|
1167
1226
|
movies_tv: "movies_tv";
|
|
1168
1227
|
gaming: "gaming";
|
|
1169
1228
|
entertainment: "entertainment";
|
|
1229
|
+
anime_cosplay: "anime_cosplay";
|
|
1170
1230
|
business_career: "business_career";
|
|
1171
1231
|
entrepreneurship: "entrepreneurship";
|
|
1172
1232
|
technology: "technology";
|
|
@@ -1183,6 +1243,7 @@ export declare const communityListResponseSchema: z.ZodObject<{
|
|
|
1183
1243
|
}>;
|
|
1184
1244
|
tags: z.ZodArray<z.ZodEnum<{
|
|
1185
1245
|
environment: "environment";
|
|
1246
|
+
science: "science";
|
|
1186
1247
|
fitness: "fitness";
|
|
1187
1248
|
mental_health: "mental_health";
|
|
1188
1249
|
photography: "photography";
|
|
@@ -1235,7 +1296,6 @@ export declare const communityListResponseSchema: z.ZodObject<{
|
|
|
1235
1296
|
career_guidance: "career_guidance";
|
|
1236
1297
|
coding: "coding";
|
|
1237
1298
|
mathematics: "mathematics";
|
|
1238
|
-
science: "science";
|
|
1239
1299
|
languages: "languages";
|
|
1240
1300
|
spoken_english: "spoken_english";
|
|
1241
1301
|
tutoring: "tutoring";
|
package/dist/community.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"community.d.ts","sourceRoot":"","sources":["../src/community.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkBxB;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,8CAA+C,CAAC;AAClF,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AACnE,eAAO,MAAM,mBAAmB;;;;EAAgC,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,kEAMzB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AACrE,eAAO,MAAM,oBAAoB;;;;;;EAAiC,CAAC;AAEnE;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B,0CAA2C,CAAC;AACxF,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,+BAA+B,CAAC,CAAC,MAAM,CAAC,CAAC;AACtF,eAAO,MAAM,4BAA4B;;;;EAA0C,CAAC;AAEpF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"community.d.ts","sourceRoot":"","sources":["../src/community.ts"],"names":[],"mappings":"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"}
|
package/dist/community.js
CHANGED
|
@@ -100,35 +100,47 @@ export const COMMUNITY_CATEGORY_VALUES = [
|
|
|
100
100
|
'civic_reform',
|
|
101
101
|
'local_news_issues',
|
|
102
102
|
'environment',
|
|
103
|
+
// Civic & legal (3)
|
|
104
|
+
'legal_law',
|
|
105
|
+
'politics_government',
|
|
106
|
+
'real_estate_housing',
|
|
103
107
|
// Faith & culture (3)
|
|
104
108
|
'religion_spirituality',
|
|
105
109
|
'festivals_culture',
|
|
106
110
|
'devotional',
|
|
107
|
-
// Education (
|
|
111
|
+
// Education & sciences (5)
|
|
108
112
|
'education',
|
|
109
113
|
'competitive_exams',
|
|
110
114
|
'books_literature',
|
|
111
115
|
'language_learning',
|
|
116
|
+
'science',
|
|
112
117
|
// Health & wellness (4)
|
|
113
118
|
'health_wellness',
|
|
114
119
|
'yoga_meditation',
|
|
115
120
|
'fitness',
|
|
116
121
|
'mental_health',
|
|
117
|
-
//
|
|
122
|
+
// Identity & society (2)
|
|
123
|
+
'lgbtq_identity',
|
|
124
|
+
'mature_topics',
|
|
125
|
+
// Lifestyle (7)
|
|
118
126
|
'food_cooking',
|
|
119
127
|
'travel',
|
|
120
128
|
'photography',
|
|
121
129
|
'fashion_beauty',
|
|
130
|
+
'home_garden',
|
|
131
|
+
'pets_animals',
|
|
132
|
+
'vehicles_automotive',
|
|
122
133
|
// Sports & arts (5)
|
|
123
134
|
'sports',
|
|
124
135
|
'cricket',
|
|
125
136
|
'arts_crafts',
|
|
126
137
|
'music',
|
|
127
138
|
'dance',
|
|
128
|
-
// Entertainment (
|
|
139
|
+
// Entertainment (4)
|
|
129
140
|
'movies_tv',
|
|
130
141
|
'gaming',
|
|
131
142
|
'entertainment',
|
|
143
|
+
'anime_cosplay',
|
|
132
144
|
// Professional (5)
|
|
133
145
|
'business_career',
|
|
134
146
|
'entrepreneurship',
|
package/dist/community.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"community.js","sourceRoot":"","sources":["../src/community.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Topical Community wire shapes.\n *\n * A Community is a Reddit-subreddit / Facebook-group style surface: a\n * named topic users can discover, join, and post into. Distinct from\n * the user-created `Group` (chat-bound, small, private) — each\n * Community auto-owns its own bound `Group` (so members get a\n * Community chat room for free) but they're conceptually different\n * objects with their own roster + permissions.\n *\n * Visibility model\n * ----------------\n * - `public` — anyone can join one-tap; posts are visible to all\n * viewers in the community feed.\n * - `private` — joining requires owner / admin approval; posts and\n * member list are hidden from non-members. Discovery\n * still lists the community card (name + description +\n * member count + join button) so users can request to\n * join.\n *\n * Posts inside a community do NOT participate in the geo cascade —\n * they live and die inside the community surface. Posts authored\n * from the global composer continue to flow through the geo\n * area-proximity cascade ranked by `tierBoost` (see\n * `reform-backend/src/services/community/services/visibility.service.ts`).\n *\n * @module community-schema/community\n */\n\nimport { z } from 'zod';\nimport { areaLineageSnapshotSchema } from './area.js';\nimport {\n COMMUNITIES_PAGE_SIZE,\n COMMUNITY_DESCRIPTION_MAX_CHARS,\n COMMUNITY_DESIGNATION_CUSTOM_MAX_CHARS,\n COMMUNITY_DESIGNATION_CUSTOM_MIN_CHARS,\n COMMUNITY_DESIGNATION_CUSTOM_PATTERN,\n COMMUNITY_MAX_TAGS,\n COMMUNITY_NAME_MAX_CHARS,\n COMMUNITY_NAME_MIN_CHARS,\n COMMUNITY_SLUG_MAX_CHARS,\n COMMUNITY_SLUG_MIN_CHARS,\n COMMUNITY_SLUG_PATTERN,\n} from './constants.js';\n\n// ─── Enums ──────────────────────────────────────────────────────────────────\n\n/**\n * public — anyone can read + post.\n * restricted — anyone can read; only approved members can post. The\n * middle option Reddit added so communities can be open\n * to browse but moderated on the write side.\n * private — only approved members can read or post. The roster\n * + post bodies are hidden from non-members.\n */\nexport const COMMUNITY_TYPE_VALUES = ['public', 'restricted', 'private'] as const;\nexport type CommunityType = (typeof COMMUNITY_TYPE_VALUES)[number];\nexport const communityTypeSchema = z.enum(COMMUNITY_TYPE_VALUES);\n\n/**\n * Geographic scope a community claims. Maps onto the existing\n * area-lineage tiers so discovery can match a viewer's `areaLineage`\n * one tier at a time.\n *\n * neighborhood — hyperlocal; carries `areaLineage.localId` +\n * `centerCoords`. Discovery uses the 5 km radius from\n * `COMMUNITY_HYPERLOCAL_RADIUS_KM`.\n * city — district-scoped; carries `areaLineage.districtId`.\n * state — carries `areaLineage.stateId`.\n * national — carries `areaLineage.countryId`.\n * global — area-agnostic; `areaLineage` is null.\n */\nexport const COMMUNITY_REACH_VALUES = [\n 'neighborhood',\n 'city',\n 'state',\n 'national',\n 'global',\n] as const;\nexport type CommunityReach = (typeof COMMUNITY_REACH_VALUES)[number];\nexport const communityReachSchema = z.enum(COMMUNITY_REACH_VALUES);\n\n/**\n * Verification scope on a verified community — which leader-tier\n * vouched for it.\n *\n * state — a state-level leader verified within their own state.\n * national — a national-level leader (or higher).\n * global — a global / platform-level leader.\n */\nexport const COMMUNITY_VERIFIED_SCOPE_VALUES = ['state', 'national', 'global'] as const;\nexport type CommunityVerifiedScope = (typeof COMMUNITY_VERIFIED_SCOPE_VALUES)[number];\nexport const communityVerifiedScopeSchema = z.enum(COMMUNITY_VERIFIED_SCOPE_VALUES);\n\n/**\n * Curated category enum. Slugs are **stable English keys** (snake_case);\n * the visible label is i18n'd on the frontend (en/hi message files).\n * Never store culturally-specific or transliterated names here — the\n * locale layer owns presentation.\n *\n * First 12 slugs are weighted toward the Indian civic / hyperlocal\n * context that Jansathi serves (Women's / Men's / Youth groups, RWA,\n * Social Welfare, Civic Reform). Remaining 30 are general-interest\n * categories adapted from Reddit's curated topic set + Facebook\n * Groups' top discovery categories.\n *\n * See `docs/community-create-v2.md` §2 in the jansathi-frontend repo\n * for the full label table.\n */\nexport const COMMUNITY_CATEGORY_VALUES = [\n // Indian civic / community (12)\n 'womens_group',\n 'mens_group',\n 'youth_group',\n 'senior_citizens',\n 'parenting_children',\n 'resident_welfare',\n 'social_welfare',\n 'social_awareness',\n 'volunteering',\n 'civic_reform',\n 'local_news_issues',\n 'environment',\n // Faith & culture (3)\n 'religion_spirituality',\n 'festivals_culture',\n 'devotional',\n // Education (4)\n 'education',\n 'competitive_exams',\n 'books_literature',\n 'language_learning',\n // Health & wellness (4)\n 'health_wellness',\n 'yoga_meditation',\n 'fitness',\n 'mental_health',\n // Lifestyle (4)\n 'food_cooking',\n 'travel',\n 'photography',\n 'fashion_beauty',\n // Sports & arts (5)\n 'sports',\n 'cricket',\n 'arts_crafts',\n 'music',\n 'dance',\n // Entertainment (3)\n 'movies_tv',\n 'gaming',\n 'entertainment',\n // Professional (5)\n 'business_career',\n 'entrepreneurship',\n 'technology',\n 'finance_investing',\n 'agriculture',\n // Information (1) + fallback (1)\n 'news_current_affairs',\n 'other',\n] as const;\nexport type CommunityCategory = (typeof COMMUNITY_CATEGORY_VALUES)[number];\nexport const communityCategorySchema = z.enum(COMMUNITY_CATEGORY_VALUES);\n\n/**\n * Curated tag enum. A community picks 0–`COMMUNITY_MAX_TAGS` from\n * this list. Tags are stable English snake_case slugs; the visible\n * label is i18n'd. The tag picker UI groups them by theme via a\n * separate theme-map on the frontend; the stored enum is flat.\n *\n * Total: 112 tags spanning civic, health, education, sports, food,\n * arts/music/faith, business/tech, local issues, and lifestyle.\n */\nexport const COMMUNITY_TAG_VALUES = [\n // Civic & social (24)\n 'volunteer',\n 'donation_drive',\n 'blood_donation',\n 'anti_corruption',\n 'women_safety',\n 'child_safety',\n 'senior_care',\n 'disability_support',\n 'lgbtq_support',\n 'environment',\n 'cleanliness',\n 'plant_trees',\n 'waste_management',\n 'legal_aid',\n 'rti',\n 'voter_awareness',\n 'government_schemes',\n 'ngo',\n 'charity',\n 'relief_work',\n 'public_service',\n 'fundraising',\n 'awareness_campaign',\n 'social_justice',\n // Health & wellness (14)\n 'yoga',\n 'meditation',\n 'fitness',\n 'running',\n 'cycling',\n 'walking',\n 'nutrition',\n 'mental_health',\n 'ayurveda',\n 'weight_loss',\n 'womens_health',\n 'mens_health',\n 'dental_health',\n 'eye_care',\n // Education (16)\n 'jee',\n 'neet',\n 'upsc',\n 'ssc',\n 'ielts',\n 'school_support',\n 'college_support',\n 'scholarship',\n 'career_guidance',\n 'coding',\n 'mathematics',\n 'science',\n 'languages',\n 'spoken_english',\n 'tutoring',\n 'study_abroad',\n // Sports (9)\n 'cricket',\n 'football',\n 'badminton',\n 'tennis',\n 'kabaddi',\n 'hockey',\n 'chess',\n 'swimming',\n 'marathon',\n // Food (10)\n 'street_food',\n 'home_cooking',\n 'vegetarian',\n 'vegan',\n 'jain_food',\n 'fasting_recipes',\n 'north_indian',\n 'south_indian',\n 'baking',\n 'desserts',\n // Arts, music, faith (14)\n 'classical_music',\n 'hindustani',\n 'carnatic',\n 'bhajan',\n 'kirtan',\n 'bollywood',\n 'dance_classical',\n 'dance_folk',\n 'painting',\n 'photography',\n 'craft',\n 'satsang',\n 'festivals',\n 'pilgrimage',\n // Business & tech (11)\n 'entrepreneurship',\n 'startup',\n 'small_business',\n 'freelancing',\n 'real_estate',\n 'stocks_investing',\n 'mutual_funds',\n 'agriculture',\n 'handicrafts',\n 'job_postings',\n 'web_development',\n // Local issues (9)\n 'water_supply',\n 'electricity',\n 'road_repair',\n 'garbage_collection',\n 'drainage',\n 'public_transport',\n 'traffic',\n 'parking',\n 'local_healthcare',\n // Lifestyle (5)\n 'movies',\n 'tv_shows',\n 'books_club',\n 'trekking',\n 'parenting',\n] as const;\nexport type CommunityTag = (typeof COMMUNITY_TAG_VALUES)[number];\nexport const communityTagSchema = z.enum(COMMUNITY_TAG_VALUES);\n\n/**\n * Preset designation labels — purely **representation** (not\n * permission-bearing). Renders in brackets after a member's display\n * name in a community context (e.g., \"Hari Joshi (Chairman) · 12h ago\").\n *\n * Permission still flows through `CommunityRole` (owner / admin /\n * member). A designation does NOT promote or restrict anything.\n *\n * Per-community: Hari can be \"Chairman\" in one community and\n * \"Member-at-Large\" in another. Custom designations (free text)\n * cover the long tail; presets are surfaced first in the picker.\n */\nexport const COMMUNITY_DESIGNATION_PRESETS = [\n 'chairman',\n 'vice_chairman',\n 'president',\n 'vice_president',\n 'secretary',\n 'joint_secretary',\n 'general_secretary',\n 'treasurer',\n 'joint_treasurer',\n 'organizer',\n 'coordinator',\n 'spokesperson',\n 'founder',\n 'co_founder',\n 'patron',\n 'advisor',\n 'mentor',\n 'committee_member',\n 'member_at_large',\n 'volunteer',\n] as const;\nexport type CommunityDesignationPreset = (typeof COMMUNITY_DESIGNATION_PRESETS)[number];\nexport const communityDesignationPresetSchema = z.enum(COMMUNITY_DESIGNATION_PRESETS);\n\n/**\n * Designation stored on a `CommunityMembership`. Exactly one of\n * `preset` / `custom` is non-null when a designation is set.\n *\n * { preset: 'chairman', custom: null } — picked from the preset enum.\n * { preset: null, custom: 'Press & Media' } — free text.\n * null — no designation.\n *\n * The picker UI surfaces the preset list first; the custom path is\n * for niche labels that don't fit a preset. Validation enforces\n * exactly-one via a refinement.\n */\nexport const communityDesignationSchema = z\n .object({\n preset: communityDesignationPresetSchema.nullable(),\n custom: z.string().nullable(),\n })\n .refine((d) => (d.preset == null) !== (d.custom == null), {\n message: 'Designation must have exactly one of `preset` or `custom` set.',\n });\nexport type CommunityDesignation = z.infer<typeof communityDesignationSchema>;\n\n/**\n * Latitude / longitude pair used for hyperlocal (`reach=neighborhood`)\n * communities. Stored at create time from either the picked area's\n * centroid (if the Area carries coordinates) or the creator's current\n * GPS as a fallback. Indexed 2dsphere on the backend; powers the\n * `$nearSphere` query inside the `?nearMe=true` listing filter.\n */\nexport const communityCenterCoordsSchema = z.object({\n lat: z.number().min(-90).max(90),\n lng: z.number().min(-180).max(180),\n});\nexport type CommunityCenterCoords = z.infer<typeof communityCenterCoordsSchema>;\n\n/** Role hierarchy within a single community.\n *\n * owner — creator; cannot be demoted by anyone, can transfer\n * ownership (deferred for v1) and delete the community.\n * admin — granted by owner; can edit metadata, kick members,\n * soft-delete posts authored in the community.\n * member — joined; can post and comment, can leave at any time.\n */\nexport const COMMUNITY_ROLE_VALUES = ['owner', 'admin', 'member'] as const;\nexport type CommunityRole = (typeof COMMUNITY_ROLE_VALUES)[number];\nexport const communityRoleSchema = z.enum(COMMUNITY_ROLE_VALUES);\n\n/** Membership lifecycle.\n *\n * active — currently in the community.\n * pending — for a `private` community: the join request is awaiting\n * owner/admin approval. Pending rows aren't counted toward\n * `memberCount` and the user can't post yet.\n */\nexport const COMMUNITY_MEMBERSHIP_STATUS_VALUES = ['active', 'pending'] as const;\nexport type CommunityMembershipStatus = (typeof COMMUNITY_MEMBERSHIP_STATUS_VALUES)[number];\nexport const communityMembershipStatusSchema = z.enum(COMMUNITY_MEMBERSHIP_STATUS_VALUES);\n\n// ─── Wire shape ─────────────────────────────────────────────────────────────\n\n/**\n * `GET /communities/:slug` / discovery card / search hit.\n *\n * `viewer` is included when the request is authenticated. It carries\n * the viewer's role + membership status so the UI can render the\n * right CTA (Join / Joined / Pending / Owner) without a follow-up\n * round trip.\n */\nexport const communityWireSchema = z.object({\n _id: z.string(),\n slug: z.string(),\n name: z.string().min(COMMUNITY_NAME_MIN_CHARS).max(COMMUNITY_NAME_MAX_CHARS),\n description: z.string().max(COMMUNITY_DESCRIPTION_MAX_CHARS).optional(),\n type: communityTypeSchema,\n coverImageUrl: z.string().url().optional(),\n ownerUserId: z.string(),\n /** Active members only. Pending join-requests don't count. */\n memberCount: z.number().int().nonnegative(),\n /** Denormalised post count. Increments on create, decrements on\n * soft-delete. */\n postCount: z.number().int().nonnegative(),\n /** Bound chat-group id. Auto-created when the Community is created;\n * members are added to both rosters in lockstep. */\n groupId: z.string(),\n createdAt: z.string().datetime(),\n\n // ─── v2 taxonomy + reach + verification ─────────────────────────────\n /** Curated subject category. Single source of truth in\n * `COMMUNITY_CATEGORY_VALUES`; visible label is i18n'd. */\n category: communityCategorySchema,\n /** Geographic scope. Drives discovery filtering and is the reason\n * `areaLineage` / `centerCoords` may be present. */\n reach: communityReachSchema,\n /** Up to `COMMUNITY_MAX_TAGS` (10) tags from the curated enum. */\n tags: z.array(communityTagSchema),\n /** Mature (18+) flag. Content-gates the surface (blur previews,\n * age-confirm) once the gate UI ships; the field is persisted\n * from create-time so the mature designation is permanent. */\n mature: z.boolean(),\n /** Area snapshot — present when `reach !== 'global'`. Mirrors the\n * post-area lineage pattern; written once at create time and\n * immutable thereafter. */\n areaLineage: areaLineageSnapshotSchema.nullable(),\n /** Lat/lng pair — present when `reach === 'neighborhood'`. Powers\n * the `?nearMe=true` 5 km geospatial filter on discovery. */\n centerCoords: communityCenterCoordsSchema.nullable(),\n /** ISO timestamp set by a state+ leader when verifying the\n * community. Null until verified; clearing reverts to null. */\n verifiedAt: z.string().datetime().nullable(),\n /** UserId of the leader who verified. */\n verifiedBy: z.string().nullable(),\n /** Which leader tier vouched — drives the badge tooltip (\"verified\n * by a state leader\" vs \"by a national leader\"). */\n verifiedScope: communityVerifiedScopeSchema.nullable(),\n\n viewer: z\n .object({\n role: communityRoleSchema.nullable(),\n status: communityMembershipStatusSchema.nullable(),\n joinedAt: z.string().datetime().nullable(),\n /** Viewer's designation in THIS community. Null when the\n * viewer is not a member or has no designation set. Returned\n * at the wire level (vs the roster level) so post-cards and\n * the byline can render `(Chairman)` without a separate\n * roster lookup. */\n designation: communityDesignationSchema.nullable(),\n })\n .optional(),\n});\nexport type CommunityWire = z.infer<typeof communityWireSchema>;\n\n// ─── Member roster row ──────────────────────────────────────────────────────\n\nexport const communityMemberWireSchema = z.object({\n userId: z.string(),\n displayName: z.string(),\n avatarUrl: z.string().url().optional(),\n localName: z.string().optional(),\n role: communityRoleSchema,\n status: communityMembershipStatusSchema,\n joinedAt: z.string().datetime(),\n /** Per-community representation label. See\n * `communityDesignationSchema` — null when none set. */\n designation: communityDesignationSchema.nullable(),\n});\nexport type CommunityMemberWire = z.infer<typeof communityMemberWireSchema>;\n\n// ─── Create body ────────────────────────────────────────────────────────────\n\n/**\n * `POST /communities` body. `slug` is optional — when omitted the\n * backend auto-generates one from the name (lowercased, hyphenated,\n * collision-suffixed). When provided it must match the slug pattern\n * and be unique.\n *\n * `areaId` is required when `reach !== 'global'` — it's the deepest-\n * matching area-entity id (`localId` for neighborhood, `districtId`\n * for city, etc.) the creator picked from the area picker. The\n * backend resolves the full `areaLineage` snapshot from this id.\n */\nexport const createCommunityBodySchema = z\n .object({\n name: z.string().min(COMMUNITY_NAME_MIN_CHARS).max(COMMUNITY_NAME_MAX_CHARS),\n slug: z\n .string()\n .min(COMMUNITY_SLUG_MIN_CHARS)\n .max(COMMUNITY_SLUG_MAX_CHARS)\n .regex(COMMUNITY_SLUG_PATTERN)\n .optional(),\n description: z.string().max(COMMUNITY_DESCRIPTION_MAX_CHARS).optional(),\n type: communityTypeSchema,\n coverImageUrl: z.string().url().optional(),\n // ── v2 fields ─────────────────────────────────────────────────\n category: communityCategorySchema,\n reach: communityReachSchema,\n /** ObjectId of the picked area at the reach's tier. Required iff\n * `reach !== 'global'`. */\n areaId: z.string().optional(),\n tags: z.array(communityTagSchema).max(COMMUNITY_MAX_TAGS).default([]),\n mature: z.boolean().default(false),\n })\n .superRefine((body, ctx) => {\n if (body.reach !== 'global' && !body.areaId) {\n ctx.addIssue({\n code: 'custom',\n path: ['areaId'],\n message: 'Area is required when reach is not Global.',\n });\n }\n });\nexport type CreateCommunityBody = z.infer<typeof createCommunityBodySchema>;\n\n// ─── Update body (owner / admin only) ───────────────────────────────────────\n\n/**\n * `PATCH /communities/:slug` body. All fields optional. Sending\n * `null` for `description` or `coverImageUrl` clears that field.\n *\n * Type changes between `public` / `restricted` / `private` are NOT\n * supported in v1 — the decision has implications for already-\n * published posts and pending join requests that we don't want to\n * silently handle. Recreate the community if you need to switch.\n *\n * `category`, `tags`, `mature` are editable post-create. `reach` and\n * `areaLineage` / `centerCoords` are NOT editable — moving a community\n * across geographic scopes would silently invalidate every existing\n * member's relationship with it.\n */\nexport const updateCommunityBodySchema = z.object({\n name: z.string().min(COMMUNITY_NAME_MIN_CHARS).max(COMMUNITY_NAME_MAX_CHARS).optional(),\n description: z.string().max(COMMUNITY_DESCRIPTION_MAX_CHARS).nullable().optional(),\n coverImageUrl: z.string().url().nullable().optional(),\n category: communityCategorySchema.optional(),\n tags: z.array(communityTagSchema).max(COMMUNITY_MAX_TAGS).optional(),\n mature: z.boolean().optional(),\n});\nexport type UpdateCommunityBody = z.infer<typeof updateCommunityBodySchema>;\n\n// ─── List + discover + search responses ─────────────────────────────────────\n\n/** Sort order on the discover page. `popular` ranks by active member\n * count, `new` by createdAt desc. `top` is reserved for a future\n * activity-weighted ranking and accepted as a no-op for now. */\nexport const COMMUNITY_DISCOVER_SORT_VALUES = ['popular', 'new', 'top'] as const;\nexport type CommunityDiscoverSort = (typeof COMMUNITY_DISCOVER_SORT_VALUES)[number];\nexport const communityDiscoverSortSchema = z.enum(COMMUNITY_DISCOVER_SORT_VALUES);\n\nexport const communityListQuerySchema = z.object({\n sort: communityDiscoverSortSchema.optional(),\n /** Free-text fragment matched case-insensitively against the\n * community name. */\n q: z.string().max(60).optional(),\n cursor: z.string().optional(),\n pageSize: z.number().int().min(1).max(COMMUNITIES_PAGE_SIZE).optional(),\n // ── v2 discovery filters ─────────────────────────────────────────\n /** Filter by curated subject category. */\n category: communityCategorySchema.optional(),\n /** Filter by geographic reach tier. */\n reach: communityReachSchema.optional(),\n /** Return only verified communities. */\n verified: z.boolean().optional(),\n /** Layered \"near me\" mode — when true, returns the union of:\n * • `reach=neighborhood` AND `centerCoords` within\n * `COMMUNITY_HYPERLOCAL_RADIUS_KM` of the supplied (lat, lng),\n * • `reach=city` AND `districtId = viewer.districtId`,\n * • `reach=state` AND `stateId = viewer.stateId`,\n * • `reach=national` AND `countryId = viewer.countryId`.\n * `lat` + `lng` must accompany the flag (typically from the\n * viewer's currentLocation GPS). */\n nearMe: z.boolean().optional(),\n lat: z.number().min(-90).max(90).optional(),\n lng: z.number().min(-180).max(180).optional(),\n});\nexport type CommunityListQuery = z.infer<typeof communityListQuerySchema>;\n\nexport const communityListResponseSchema = z.object({\n items: z.array(communityWireSchema),\n nextCursor: z.string().nullable(),\n});\nexport type CommunityListResponse = z.infer<typeof communityListResponseSchema>;\n\n// ─── Membership actions ────────────────────────────────────────────────────\n\n/**\n * `POST /communities/:slug/join`. Response carries the new viewer\n * state so the client can update the CTA without a follow-up GET.\n *\n * - public → returns `{ status: 'active', role: 'member' }`\n * - private → returns `{ status: 'pending', role: null }`; the\n * owner / admin approves via the moderation endpoint\n * (`POST /communities/:slug/members/:userId/approve`).\n */\nexport const joinCommunityResponseSchema = z.object({\n status: communityMembershipStatusSchema,\n role: communityRoleSchema.nullable(),\n joinedAt: z.string().datetime().nullable(),\n});\nexport type JoinCommunityResponse = z.infer<typeof joinCommunityResponseSchema>;\n\nexport const communityMembersListResponseSchema = z.object({\n items: z.array(communityMemberWireSchema),\n nextCursor: z.string().nullable(),\n});\nexport type CommunityMembersListResponse = z.infer<typeof communityMembersListResponseSchema>;\n\n/** Body for `POST /communities/:slug/members/:userId/role` — owner-\n * only. Used to promote a member to admin or demote an admin back\n * to plain member. Owner role can't be set via this endpoint;\n * transferring ownership has its own dedicated route (deferred). */\nexport const updateMemberRoleBodySchema = z.object({\n role: z.enum(['admin', 'member']),\n});\nexport type UpdateMemberRoleBody = z.infer<typeof updateMemberRoleBodySchema>;\n\n// ─── Designation (representation, not permission) ──────────────────────────\n\n/**\n * Body for `PUT /communities/:slug/members/:userId/designation`.\n * Owner / admin only. Exactly one of `preset` / `custom` must be set.\n *\n * Use the preset list first (one-tap pick from `CommunityDesignationPreset`);\n * fall through to `custom` for niche labels (\"Press & Media\",\n * \"Disaster Response Lead\", etc.) that don't fit a preset.\n *\n * To clear an existing designation, use `DELETE` on the same path —\n * there's no \"null\" mode on this body.\n */\nexport const setMemberDesignationBodySchema = z\n .object({\n preset: communityDesignationPresetSchema.optional(),\n custom: z\n .string()\n .min(COMMUNITY_DESIGNATION_CUSTOM_MIN_CHARS)\n .max(COMMUNITY_DESIGNATION_CUSTOM_MAX_CHARS)\n .regex(COMMUNITY_DESIGNATION_CUSTOM_PATTERN)\n .optional(),\n })\n .refine((b) => (b.preset != null) !== (b.custom != null), {\n message: 'Provide exactly one of `preset` or `custom`.',\n });\nexport type SetMemberDesignationBody = z.infer<typeof setMemberDesignationBodySchema>;\n\n// ─── Verification (state+ leader vouch) ────────────────────────────────────\n\n/**\n * Body for `POST /communities/:slug/verify`. Empty for now; the\n * verifier's scope (`state | national | global`) is derived from the\n * caller's leader role rather than supplied. Keeping a body object\n * leaves room for a `note` field later without a breaking change.\n */\nexport const verifyCommunityBodySchema = z.object({\n /** Optional free-text note the leader can attach to the verification\n * (visible in the verification audit trail; not surfaced in the\n * default badge tooltip). Capped at 200 chars. */\n note: z.string().max(200).optional(),\n});\nexport type VerifyCommunityBody = z.infer<typeof verifyCommunityBodySchema>;\n\n// ─── Area picker query (powers the cascading area sheet) ───────────────────\n\n/**\n * `GET /areas?level=...&parentId=...&q=...` — backs the area picker\n * inside the create-community wizard's step 3. Returns areas at the\n * specified `level` that sit under the given parent area:\n *\n * level=local → returns localities under a `districtId` parent.\n * level=district → returns districts under a `stateId` parent.\n * level=state → returns states under a `countryId` parent.\n *\n * The picker constrains the user to siblings under their own parent\n * area (so a Maharashtra creator can pick any locality in Maharashtra\n * for a neighborhood community, but not one in Tamil Nadu).\n */\nexport const AREA_PICKER_LEVEL_VALUES = ['local', 'district', 'state'] as const;\nexport type AreaPickerLevel = (typeof AREA_PICKER_LEVEL_VALUES)[number];\nexport const areaPickerLevelSchema = z.enum(AREA_PICKER_LEVEL_VALUES);\n\nexport const areaPickerQuerySchema = z.object({\n level: areaPickerLevelSchema,\n parentId: z.string(),\n /** Optional name prefix for debounced search inside the sheet. */\n q: z.string().max(60).optional(),\n});\nexport type AreaPickerQuery = z.infer<typeof areaPickerQuerySchema>;\n\nexport const areaPickerItemSchema = z.object({\n _id: z.string(),\n name: z.string(),\n level: areaPickerLevelSchema,\n parentId: z.string(),\n});\nexport type AreaPickerItem = z.infer<typeof areaPickerItemSchema>;\n\nexport const areaPickerResponseSchema = z.object({\n items: z.array(areaPickerItemSchema),\n});\nexport type AreaPickerResponse = z.infer<typeof areaPickerResponseSchema>;\n"]}
|
|
1
|
+
{"version":3,"file":"community.js","sourceRoot":"","sources":["../src/community.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Topical Community wire shapes.\n *\n * A Community is a Reddit-subreddit / Facebook-group style surface: a\n * named topic users can discover, join, and post into. Distinct from\n * the user-created `Group` (chat-bound, small, private) — each\n * Community auto-owns its own bound `Group` (so members get a\n * Community chat room for free) but they're conceptually different\n * objects with their own roster + permissions.\n *\n * Visibility model\n * ----------------\n * - `public` — anyone can join one-tap; posts are visible to all\n * viewers in the community feed.\n * - `private` — joining requires owner / admin approval; posts and\n * member list are hidden from non-members. Discovery\n * still lists the community card (name + description +\n * member count + join button) so users can request to\n * join.\n *\n * Posts inside a community do NOT participate in the geo cascade —\n * they live and die inside the community surface. Posts authored\n * from the global composer continue to flow through the geo\n * area-proximity cascade ranked by `tierBoost` (see\n * `reform-backend/src/services/community/services/visibility.service.ts`).\n *\n * @module community-schema/community\n */\n\nimport { z } from 'zod';\nimport { areaLineageSnapshotSchema } from './area.js';\nimport {\n COMMUNITIES_PAGE_SIZE,\n COMMUNITY_DESCRIPTION_MAX_CHARS,\n COMMUNITY_DESIGNATION_CUSTOM_MAX_CHARS,\n COMMUNITY_DESIGNATION_CUSTOM_MIN_CHARS,\n COMMUNITY_DESIGNATION_CUSTOM_PATTERN,\n COMMUNITY_MAX_TAGS,\n COMMUNITY_NAME_MAX_CHARS,\n COMMUNITY_NAME_MIN_CHARS,\n COMMUNITY_SLUG_MAX_CHARS,\n COMMUNITY_SLUG_MIN_CHARS,\n COMMUNITY_SLUG_PATTERN,\n} from './constants.js';\n\n// ─── Enums ──────────────────────────────────────────────────────────────────\n\n/**\n * public — anyone can read + post.\n * restricted — anyone can read; only approved members can post. The\n * middle option Reddit added so communities can be open\n * to browse but moderated on the write side.\n * private — only approved members can read or post. The roster\n * + post bodies are hidden from non-members.\n */\nexport const COMMUNITY_TYPE_VALUES = ['public', 'restricted', 'private'] as const;\nexport type CommunityType = (typeof COMMUNITY_TYPE_VALUES)[number];\nexport const communityTypeSchema = z.enum(COMMUNITY_TYPE_VALUES);\n\n/**\n * Geographic scope a community claims. Maps onto the existing\n * area-lineage tiers so discovery can match a viewer's `areaLineage`\n * one tier at a time.\n *\n * neighborhood — hyperlocal; carries `areaLineage.localId` +\n * `centerCoords`. Discovery uses the 5 km radius from\n * `COMMUNITY_HYPERLOCAL_RADIUS_KM`.\n * city — district-scoped; carries `areaLineage.districtId`.\n * state — carries `areaLineage.stateId`.\n * national — carries `areaLineage.countryId`.\n * global — area-agnostic; `areaLineage` is null.\n */\nexport const COMMUNITY_REACH_VALUES = [\n 'neighborhood',\n 'city',\n 'state',\n 'national',\n 'global',\n] as const;\nexport type CommunityReach = (typeof COMMUNITY_REACH_VALUES)[number];\nexport const communityReachSchema = z.enum(COMMUNITY_REACH_VALUES);\n\n/**\n * Verification scope on a verified community — which leader-tier\n * vouched for it.\n *\n * state — a state-level leader verified within their own state.\n * national — a national-level leader (or higher).\n * global — a global / platform-level leader.\n */\nexport const COMMUNITY_VERIFIED_SCOPE_VALUES = ['state', 'national', 'global'] as const;\nexport type CommunityVerifiedScope = (typeof COMMUNITY_VERIFIED_SCOPE_VALUES)[number];\nexport const communityVerifiedScopeSchema = z.enum(COMMUNITY_VERIFIED_SCOPE_VALUES);\n\n/**\n * Curated category enum. Slugs are **stable English keys** (snake_case);\n * the visible label is i18n'd on the frontend (en/hi message files).\n * Never store culturally-specific or transliterated names here — the\n * locale layer owns presentation.\n *\n * First 12 slugs are weighted toward the Indian civic / hyperlocal\n * context that Jansathi serves (Women's / Men's / Youth groups, RWA,\n * Social Welfare, Civic Reform). Remaining 30 are general-interest\n * categories adapted from Reddit's curated topic set + Facebook\n * Groups' top discovery categories.\n *\n * See `docs/community-create-v2.md` §2 in the jansathi-frontend repo\n * for the full label table.\n */\nexport const COMMUNITY_CATEGORY_VALUES = [\n // Indian civic / community (12)\n 'womens_group',\n 'mens_group',\n 'youth_group',\n 'senior_citizens',\n 'parenting_children',\n 'resident_welfare',\n 'social_welfare',\n 'social_awareness',\n 'volunteering',\n 'civic_reform',\n 'local_news_issues',\n 'environment',\n // Civic & legal (3)\n 'legal_law',\n 'politics_government',\n 'real_estate_housing',\n // Faith & culture (3)\n 'religion_spirituality',\n 'festivals_culture',\n 'devotional',\n // Education & sciences (5)\n 'education',\n 'competitive_exams',\n 'books_literature',\n 'language_learning',\n 'science',\n // Health & wellness (4)\n 'health_wellness',\n 'yoga_meditation',\n 'fitness',\n 'mental_health',\n // Identity & society (2)\n 'lgbtq_identity',\n 'mature_topics',\n // Lifestyle (7)\n 'food_cooking',\n 'travel',\n 'photography',\n 'fashion_beauty',\n 'home_garden',\n 'pets_animals',\n 'vehicles_automotive',\n // Sports & arts (5)\n 'sports',\n 'cricket',\n 'arts_crafts',\n 'music',\n 'dance',\n // Entertainment (4)\n 'movies_tv',\n 'gaming',\n 'entertainment',\n 'anime_cosplay',\n // Professional (5)\n 'business_career',\n 'entrepreneurship',\n 'technology',\n 'finance_investing',\n 'agriculture',\n // Information (1) + fallback (1)\n 'news_current_affairs',\n 'other',\n] as const;\nexport type CommunityCategory = (typeof COMMUNITY_CATEGORY_VALUES)[number];\nexport const communityCategorySchema = z.enum(COMMUNITY_CATEGORY_VALUES);\n\n/**\n * Curated tag enum. A community picks 0–`COMMUNITY_MAX_TAGS` from\n * this list. Tags are stable English snake_case slugs; the visible\n * label is i18n'd. The tag picker UI groups them by theme via a\n * separate theme-map on the frontend; the stored enum is flat.\n *\n * Total: 112 tags spanning civic, health, education, sports, food,\n * arts/music/faith, business/tech, local issues, and lifestyle.\n */\nexport const COMMUNITY_TAG_VALUES = [\n // Civic & social (24)\n 'volunteer',\n 'donation_drive',\n 'blood_donation',\n 'anti_corruption',\n 'women_safety',\n 'child_safety',\n 'senior_care',\n 'disability_support',\n 'lgbtq_support',\n 'environment',\n 'cleanliness',\n 'plant_trees',\n 'waste_management',\n 'legal_aid',\n 'rti',\n 'voter_awareness',\n 'government_schemes',\n 'ngo',\n 'charity',\n 'relief_work',\n 'public_service',\n 'fundraising',\n 'awareness_campaign',\n 'social_justice',\n // Health & wellness (14)\n 'yoga',\n 'meditation',\n 'fitness',\n 'running',\n 'cycling',\n 'walking',\n 'nutrition',\n 'mental_health',\n 'ayurveda',\n 'weight_loss',\n 'womens_health',\n 'mens_health',\n 'dental_health',\n 'eye_care',\n // Education (16)\n 'jee',\n 'neet',\n 'upsc',\n 'ssc',\n 'ielts',\n 'school_support',\n 'college_support',\n 'scholarship',\n 'career_guidance',\n 'coding',\n 'mathematics',\n 'science',\n 'languages',\n 'spoken_english',\n 'tutoring',\n 'study_abroad',\n // Sports (9)\n 'cricket',\n 'football',\n 'badminton',\n 'tennis',\n 'kabaddi',\n 'hockey',\n 'chess',\n 'swimming',\n 'marathon',\n // Food (10)\n 'street_food',\n 'home_cooking',\n 'vegetarian',\n 'vegan',\n 'jain_food',\n 'fasting_recipes',\n 'north_indian',\n 'south_indian',\n 'baking',\n 'desserts',\n // Arts, music, faith (14)\n 'classical_music',\n 'hindustani',\n 'carnatic',\n 'bhajan',\n 'kirtan',\n 'bollywood',\n 'dance_classical',\n 'dance_folk',\n 'painting',\n 'photography',\n 'craft',\n 'satsang',\n 'festivals',\n 'pilgrimage',\n // Business & tech (11)\n 'entrepreneurship',\n 'startup',\n 'small_business',\n 'freelancing',\n 'real_estate',\n 'stocks_investing',\n 'mutual_funds',\n 'agriculture',\n 'handicrafts',\n 'job_postings',\n 'web_development',\n // Local issues (9)\n 'water_supply',\n 'electricity',\n 'road_repair',\n 'garbage_collection',\n 'drainage',\n 'public_transport',\n 'traffic',\n 'parking',\n 'local_healthcare',\n // Lifestyle (5)\n 'movies',\n 'tv_shows',\n 'books_club',\n 'trekking',\n 'parenting',\n] as const;\nexport type CommunityTag = (typeof COMMUNITY_TAG_VALUES)[number];\nexport const communityTagSchema = z.enum(COMMUNITY_TAG_VALUES);\n\n/**\n * Preset designation labels — purely **representation** (not\n * permission-bearing). Renders in brackets after a member's display\n * name in a community context (e.g., \"Hari Joshi (Chairman) · 12h ago\").\n *\n * Permission still flows through `CommunityRole` (owner / admin /\n * member). A designation does NOT promote or restrict anything.\n *\n * Per-community: Hari can be \"Chairman\" in one community and\n * \"Member-at-Large\" in another. Custom designations (free text)\n * cover the long tail; presets are surfaced first in the picker.\n */\nexport const COMMUNITY_DESIGNATION_PRESETS = [\n 'chairman',\n 'vice_chairman',\n 'president',\n 'vice_president',\n 'secretary',\n 'joint_secretary',\n 'general_secretary',\n 'treasurer',\n 'joint_treasurer',\n 'organizer',\n 'coordinator',\n 'spokesperson',\n 'founder',\n 'co_founder',\n 'patron',\n 'advisor',\n 'mentor',\n 'committee_member',\n 'member_at_large',\n 'volunteer',\n] as const;\nexport type CommunityDesignationPreset = (typeof COMMUNITY_DESIGNATION_PRESETS)[number];\nexport const communityDesignationPresetSchema = z.enum(COMMUNITY_DESIGNATION_PRESETS);\n\n/**\n * Designation stored on a `CommunityMembership`. Exactly one of\n * `preset` / `custom` is non-null when a designation is set.\n *\n * { preset: 'chairman', custom: null } — picked from the preset enum.\n * { preset: null, custom: 'Press & Media' } — free text.\n * null — no designation.\n *\n * The picker UI surfaces the preset list first; the custom path is\n * for niche labels that don't fit a preset. Validation enforces\n * exactly-one via a refinement.\n */\nexport const communityDesignationSchema = z\n .object({\n preset: communityDesignationPresetSchema.nullable(),\n custom: z.string().nullable(),\n })\n .refine((d) => (d.preset == null) !== (d.custom == null), {\n message: 'Designation must have exactly one of `preset` or `custom` set.',\n });\nexport type CommunityDesignation = z.infer<typeof communityDesignationSchema>;\n\n/**\n * Latitude / longitude pair used for hyperlocal (`reach=neighborhood`)\n * communities. Stored at create time from either the picked area's\n * centroid (if the Area carries coordinates) or the creator's current\n * GPS as a fallback. Indexed 2dsphere on the backend; powers the\n * `$nearSphere` query inside the `?nearMe=true` listing filter.\n */\nexport const communityCenterCoordsSchema = z.object({\n lat: z.number().min(-90).max(90),\n lng: z.number().min(-180).max(180),\n});\nexport type CommunityCenterCoords = z.infer<typeof communityCenterCoordsSchema>;\n\n/** Role hierarchy within a single community.\n *\n * owner — creator; cannot be demoted by anyone, can transfer\n * ownership (deferred for v1) and delete the community.\n * admin — granted by owner; can edit metadata, kick members,\n * soft-delete posts authored in the community.\n * member — joined; can post and comment, can leave at any time.\n */\nexport const COMMUNITY_ROLE_VALUES = ['owner', 'admin', 'member'] as const;\nexport type CommunityRole = (typeof COMMUNITY_ROLE_VALUES)[number];\nexport const communityRoleSchema = z.enum(COMMUNITY_ROLE_VALUES);\n\n/** Membership lifecycle.\n *\n * active — currently in the community.\n * pending — for a `private` community: the join request is awaiting\n * owner/admin approval. Pending rows aren't counted toward\n * `memberCount` and the user can't post yet.\n */\nexport const COMMUNITY_MEMBERSHIP_STATUS_VALUES = ['active', 'pending'] as const;\nexport type CommunityMembershipStatus = (typeof COMMUNITY_MEMBERSHIP_STATUS_VALUES)[number];\nexport const communityMembershipStatusSchema = z.enum(COMMUNITY_MEMBERSHIP_STATUS_VALUES);\n\n// ─── Wire shape ─────────────────────────────────────────────────────────────\n\n/**\n * `GET /communities/:slug` / discovery card / search hit.\n *\n * `viewer` is included when the request is authenticated. It carries\n * the viewer's role + membership status so the UI can render the\n * right CTA (Join / Joined / Pending / Owner) without a follow-up\n * round trip.\n */\nexport const communityWireSchema = z.object({\n _id: z.string(),\n slug: z.string(),\n name: z.string().min(COMMUNITY_NAME_MIN_CHARS).max(COMMUNITY_NAME_MAX_CHARS),\n description: z.string().max(COMMUNITY_DESCRIPTION_MAX_CHARS).optional(),\n type: communityTypeSchema,\n coverImageUrl: z.string().url().optional(),\n ownerUserId: z.string(),\n /** Active members only. Pending join-requests don't count. */\n memberCount: z.number().int().nonnegative(),\n /** Denormalised post count. Increments on create, decrements on\n * soft-delete. */\n postCount: z.number().int().nonnegative(),\n /** Bound chat-group id. Auto-created when the Community is created;\n * members are added to both rosters in lockstep. */\n groupId: z.string(),\n createdAt: z.string().datetime(),\n\n // ─── v2 taxonomy + reach + verification ─────────────────────────────\n /** Curated subject category. Single source of truth in\n * `COMMUNITY_CATEGORY_VALUES`; visible label is i18n'd. */\n category: communityCategorySchema,\n /** Geographic scope. Drives discovery filtering and is the reason\n * `areaLineage` / `centerCoords` may be present. */\n reach: communityReachSchema,\n /** Up to `COMMUNITY_MAX_TAGS` (10) tags from the curated enum. */\n tags: z.array(communityTagSchema),\n /** Mature (18+) flag. Content-gates the surface (blur previews,\n * age-confirm) once the gate UI ships; the field is persisted\n * from create-time so the mature designation is permanent. */\n mature: z.boolean(),\n /** Area snapshot — present when `reach !== 'global'`. Mirrors the\n * post-area lineage pattern; written once at create time and\n * immutable thereafter. */\n areaLineage: areaLineageSnapshotSchema.nullable(),\n /** Lat/lng pair — present when `reach === 'neighborhood'`. Powers\n * the `?nearMe=true` 5 km geospatial filter on discovery. */\n centerCoords: communityCenterCoordsSchema.nullable(),\n /** ISO timestamp set by a state+ leader when verifying the\n * community. Null until verified; clearing reverts to null. */\n verifiedAt: z.string().datetime().nullable(),\n /** UserId of the leader who verified. */\n verifiedBy: z.string().nullable(),\n /** Which leader tier vouched — drives the badge tooltip (\"verified\n * by a state leader\" vs \"by a national leader\"). */\n verifiedScope: communityVerifiedScopeSchema.nullable(),\n\n viewer: z\n .object({\n role: communityRoleSchema.nullable(),\n status: communityMembershipStatusSchema.nullable(),\n joinedAt: z.string().datetime().nullable(),\n /** Viewer's designation in THIS community. Null when the\n * viewer is not a member or has no designation set. Returned\n * at the wire level (vs the roster level) so post-cards and\n * the byline can render `(Chairman)` without a separate\n * roster lookup. */\n designation: communityDesignationSchema.nullable(),\n })\n .optional(),\n});\nexport type CommunityWire = z.infer<typeof communityWireSchema>;\n\n// ─── Member roster row ──────────────────────────────────────────────────────\n\nexport const communityMemberWireSchema = z.object({\n userId: z.string(),\n displayName: z.string(),\n avatarUrl: z.string().url().optional(),\n localName: z.string().optional(),\n role: communityRoleSchema,\n status: communityMembershipStatusSchema,\n joinedAt: z.string().datetime(),\n /** Per-community representation label. See\n * `communityDesignationSchema` — null when none set. */\n designation: communityDesignationSchema.nullable(),\n});\nexport type CommunityMemberWire = z.infer<typeof communityMemberWireSchema>;\n\n// ─── Create body ────────────────────────────────────────────────────────────\n\n/**\n * `POST /communities` body. `slug` is optional — when omitted the\n * backend auto-generates one from the name (lowercased, hyphenated,\n * collision-suffixed). When provided it must match the slug pattern\n * and be unique.\n *\n * `areaId` is required when `reach !== 'global'` — it's the deepest-\n * matching area-entity id (`localId` for neighborhood, `districtId`\n * for city, etc.) the creator picked from the area picker. The\n * backend resolves the full `areaLineage` snapshot from this id.\n */\nexport const createCommunityBodySchema = z\n .object({\n name: z.string().min(COMMUNITY_NAME_MIN_CHARS).max(COMMUNITY_NAME_MAX_CHARS),\n slug: z\n .string()\n .min(COMMUNITY_SLUG_MIN_CHARS)\n .max(COMMUNITY_SLUG_MAX_CHARS)\n .regex(COMMUNITY_SLUG_PATTERN)\n .optional(),\n description: z.string().max(COMMUNITY_DESCRIPTION_MAX_CHARS).optional(),\n type: communityTypeSchema,\n coverImageUrl: z.string().url().optional(),\n // ── v2 fields ─────────────────────────────────────────────────\n category: communityCategorySchema,\n reach: communityReachSchema,\n /** ObjectId of the picked area at the reach's tier. Required iff\n * `reach !== 'global'`. */\n areaId: z.string().optional(),\n tags: z.array(communityTagSchema).max(COMMUNITY_MAX_TAGS).default([]),\n mature: z.boolean().default(false),\n })\n .superRefine((body, ctx) => {\n if (body.reach !== 'global' && !body.areaId) {\n ctx.addIssue({\n code: 'custom',\n path: ['areaId'],\n message: 'Area is required when reach is not Global.',\n });\n }\n });\nexport type CreateCommunityBody = z.infer<typeof createCommunityBodySchema>;\n\n// ─── Update body (owner / admin only) ───────────────────────────────────────\n\n/**\n * `PATCH /communities/:slug` body. All fields optional. Sending\n * `null` for `description` or `coverImageUrl` clears that field.\n *\n * Type changes between `public` / `restricted` / `private` are NOT\n * supported in v1 — the decision has implications for already-\n * published posts and pending join requests that we don't want to\n * silently handle. Recreate the community if you need to switch.\n *\n * `category`, `tags`, `mature` are editable post-create. `reach` and\n * `areaLineage` / `centerCoords` are NOT editable — moving a community\n * across geographic scopes would silently invalidate every existing\n * member's relationship with it.\n */\nexport const updateCommunityBodySchema = z.object({\n name: z.string().min(COMMUNITY_NAME_MIN_CHARS).max(COMMUNITY_NAME_MAX_CHARS).optional(),\n description: z.string().max(COMMUNITY_DESCRIPTION_MAX_CHARS).nullable().optional(),\n coverImageUrl: z.string().url().nullable().optional(),\n category: communityCategorySchema.optional(),\n tags: z.array(communityTagSchema).max(COMMUNITY_MAX_TAGS).optional(),\n mature: z.boolean().optional(),\n});\nexport type UpdateCommunityBody = z.infer<typeof updateCommunityBodySchema>;\n\n// ─── List + discover + search responses ─────────────────────────────────────\n\n/** Sort order on the discover page. `popular` ranks by active member\n * count, `new` by createdAt desc. `top` is reserved for a future\n * activity-weighted ranking and accepted as a no-op for now. */\nexport const COMMUNITY_DISCOVER_SORT_VALUES = ['popular', 'new', 'top'] as const;\nexport type CommunityDiscoverSort = (typeof COMMUNITY_DISCOVER_SORT_VALUES)[number];\nexport const communityDiscoverSortSchema = z.enum(COMMUNITY_DISCOVER_SORT_VALUES);\n\nexport const communityListQuerySchema = z.object({\n sort: communityDiscoverSortSchema.optional(),\n /** Free-text fragment matched case-insensitively against the\n * community name. */\n q: z.string().max(60).optional(),\n cursor: z.string().optional(),\n pageSize: z.number().int().min(1).max(COMMUNITIES_PAGE_SIZE).optional(),\n // ── v2 discovery filters ─────────────────────────────────────────\n /** Filter by curated subject category. */\n category: communityCategorySchema.optional(),\n /** Filter by geographic reach tier. */\n reach: communityReachSchema.optional(),\n /** Return only verified communities. */\n verified: z.boolean().optional(),\n /** Layered \"near me\" mode — when true, returns the union of:\n * • `reach=neighborhood` AND `centerCoords` within\n * `COMMUNITY_HYPERLOCAL_RADIUS_KM` of the supplied (lat, lng),\n * • `reach=city` AND `districtId = viewer.districtId`,\n * • `reach=state` AND `stateId = viewer.stateId`,\n * • `reach=national` AND `countryId = viewer.countryId`.\n * `lat` + `lng` must accompany the flag (typically from the\n * viewer's currentLocation GPS). */\n nearMe: z.boolean().optional(),\n lat: z.number().min(-90).max(90).optional(),\n lng: z.number().min(-180).max(180).optional(),\n});\nexport type CommunityListQuery = z.infer<typeof communityListQuerySchema>;\n\nexport const communityListResponseSchema = z.object({\n items: z.array(communityWireSchema),\n nextCursor: z.string().nullable(),\n});\nexport type CommunityListResponse = z.infer<typeof communityListResponseSchema>;\n\n// ─── Membership actions ────────────────────────────────────────────────────\n\n/**\n * `POST /communities/:slug/join`. Response carries the new viewer\n * state so the client can update the CTA without a follow-up GET.\n *\n * - public → returns `{ status: 'active', role: 'member' }`\n * - private → returns `{ status: 'pending', role: null }`; the\n * owner / admin approves via the moderation endpoint\n * (`POST /communities/:slug/members/:userId/approve`).\n */\nexport const joinCommunityResponseSchema = z.object({\n status: communityMembershipStatusSchema,\n role: communityRoleSchema.nullable(),\n joinedAt: z.string().datetime().nullable(),\n});\nexport type JoinCommunityResponse = z.infer<typeof joinCommunityResponseSchema>;\n\nexport const communityMembersListResponseSchema = z.object({\n items: z.array(communityMemberWireSchema),\n nextCursor: z.string().nullable(),\n});\nexport type CommunityMembersListResponse = z.infer<typeof communityMembersListResponseSchema>;\n\n/** Body for `POST /communities/:slug/members/:userId/role` — owner-\n * only. Used to promote a member to admin or demote an admin back\n * to plain member. Owner role can't be set via this endpoint;\n * transferring ownership has its own dedicated route (deferred). */\nexport const updateMemberRoleBodySchema = z.object({\n role: z.enum(['admin', 'member']),\n});\nexport type UpdateMemberRoleBody = z.infer<typeof updateMemberRoleBodySchema>;\n\n// ─── Designation (representation, not permission) ──────────────────────────\n\n/**\n * Body for `PUT /communities/:slug/members/:userId/designation`.\n * Owner / admin only. Exactly one of `preset` / `custom` must be set.\n *\n * Use the preset list first (one-tap pick from `CommunityDesignationPreset`);\n * fall through to `custom` for niche labels (\"Press & Media\",\n * \"Disaster Response Lead\", etc.) that don't fit a preset.\n *\n * To clear an existing designation, use `DELETE` on the same path —\n * there's no \"null\" mode on this body.\n */\nexport const setMemberDesignationBodySchema = z\n .object({\n preset: communityDesignationPresetSchema.optional(),\n custom: z\n .string()\n .min(COMMUNITY_DESIGNATION_CUSTOM_MIN_CHARS)\n .max(COMMUNITY_DESIGNATION_CUSTOM_MAX_CHARS)\n .regex(COMMUNITY_DESIGNATION_CUSTOM_PATTERN)\n .optional(),\n })\n .refine((b) => (b.preset != null) !== (b.custom != null), {\n message: 'Provide exactly one of `preset` or `custom`.',\n });\nexport type SetMemberDesignationBody = z.infer<typeof setMemberDesignationBodySchema>;\n\n// ─── Verification (state+ leader vouch) ────────────────────────────────────\n\n/**\n * Body for `POST /communities/:slug/verify`. Empty for now; the\n * verifier's scope (`state | national | global`) is derived from the\n * caller's leader role rather than supplied. Keeping a body object\n * leaves room for a `note` field later without a breaking change.\n */\nexport const verifyCommunityBodySchema = z.object({\n /** Optional free-text note the leader can attach to the verification\n * (visible in the verification audit trail; not surfaced in the\n * default badge tooltip). Capped at 200 chars. */\n note: z.string().max(200).optional(),\n});\nexport type VerifyCommunityBody = z.infer<typeof verifyCommunityBodySchema>;\n\n// ─── Area picker query (powers the cascading area sheet) ───────────────────\n\n/**\n * `GET /areas?level=...&parentId=...&q=...` — backs the area picker\n * inside the create-community wizard's step 3. Returns areas at the\n * specified `level` that sit under the given parent area:\n *\n * level=local → returns localities under a `districtId` parent.\n * level=district → returns districts under a `stateId` parent.\n * level=state → returns states under a `countryId` parent.\n *\n * The picker constrains the user to siblings under their own parent\n * area (so a Maharashtra creator can pick any locality in Maharashtra\n * for a neighborhood community, but not one in Tamil Nadu).\n */\nexport const AREA_PICKER_LEVEL_VALUES = ['local', 'district', 'state'] as const;\nexport type AreaPickerLevel = (typeof AREA_PICKER_LEVEL_VALUES)[number];\nexport const areaPickerLevelSchema = z.enum(AREA_PICKER_LEVEL_VALUES);\n\nexport const areaPickerQuerySchema = z.object({\n level: areaPickerLevelSchema,\n parentId: z.string(),\n /** Optional name prefix for debounced search inside the sheet. */\n q: z.string().max(60).optional(),\n});\nexport type AreaPickerQuery = z.infer<typeof areaPickerQuerySchema>;\n\nexport const areaPickerItemSchema = z.object({\n _id: z.string(),\n name: z.string(),\n level: areaPickerLevelSchema,\n parentId: z.string(),\n});\nexport type AreaPickerItem = z.infer<typeof areaPickerItemSchema>;\n\nexport const areaPickerResponseSchema = z.object({\n items: z.array(areaPickerItemSchema),\n});\nexport type AreaPickerResponse = z.infer<typeof areaPickerResponseSchema>;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jansathi-community-schema",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Shared Zod schemas + TypeScript types for the Jansathi hyperlocal community feature (feed, posts, engagement, social graph, groups, communities).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|