jansathi-community-schema 0.14.1 → 0.15.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.
@@ -686,6 +686,7 @@ export declare const communityMemberWireSchema: z.ZodObject<{
686
686
  }>>;
687
687
  custom: z.ZodNullable<z.ZodString>;
688
688
  }, z.core.$strip>>;
689
+ identityVerified: z.ZodOptional<z.ZodBoolean>;
689
690
  }, z.core.$strip>;
690
691
  export type CommunityMemberWire = z.infer<typeof communityMemberWireSchema>;
691
692
  /**
@@ -1478,6 +1479,7 @@ export declare const communityMembersListResponseSchema: z.ZodObject<{
1478
1479
  }>>;
1479
1480
  custom: z.ZodNullable<z.ZodString>;
1480
1481
  }, z.core.$strip>>;
1482
+ identityVerified: z.ZodOptional<z.ZodBoolean>;
1481
1483
  }, z.core.$strip>>;
1482
1484
  nextCursor: z.ZodNullable<z.ZodString>;
1483
1485
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"community.d.ts","sourceRoot":"","sources":["../src/community.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"community.d.ts","sourceRoot":"","sources":["../src/community.ts"],"names":[],"mappings":"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"}
package/dist/community.js CHANGED
@@ -450,6 +450,11 @@ export const communityMemberWireSchema = z.object({
450
450
  /** Per-community representation label. See
451
451
  * `communityDesignationSchema` — null when none set. */
452
452
  designation: communityDesignationSchema.nullable(),
453
+ /** True when this user has been identity-verified by a Jansathi
454
+ * volunteer / leader. Drives the green check badge in the member
455
+ * roster row. Optional for forward-compat with un-migrated
456
+ * backends. */
457
+ identityVerified: z.boolean().optional(),
453
458
  });
454
459
  // ─── Create body ────────────────────────────────────────────────────────────
455
460
  /**
@@ -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 // 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"]}
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 /** True when this user has been identity-verified by a Jansathi\n * volunteer / leader. Drives the green check badge in the member\n * roster row. Optional for forward-compat with un-migrated\n * backends. */\n identityVerified: z.boolean().optional(),\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/dist/profile.d.ts CHANGED
@@ -53,6 +53,7 @@ export declare const publicProfileWireSchema: z.ZodObject<{
53
53
  viewer: z.ZodObject<{
54
54
  following: z.ZodBoolean;
55
55
  }, z.core.$strip>;
56
+ identityVerified: z.ZodOptional<z.ZodBoolean>;
56
57
  }, z.core.$strip>;
57
58
  export type PublicProfileWire = z.infer<typeof publicProfileWireSchema>;
58
59
  /**
@@ -72,6 +73,7 @@ export declare const peopleListItemSchema: z.ZodObject<{
72
73
  viewer: z.ZodObject<{
73
74
  following: z.ZodBoolean;
74
75
  }, z.core.$strip>;
76
+ identityVerified: z.ZodOptional<z.ZodBoolean>;
75
77
  }, z.core.$strip>;
76
78
  export type PeopleListItem = z.infer<typeof peopleListItemSchema>;
77
79
  export declare const peopleQueryParamsSchema: z.ZodObject<{
@@ -101,6 +103,7 @@ export declare const peopleListResponseSchema: z.ZodObject<{
101
103
  viewer: z.ZodObject<{
102
104
  following: z.ZodBoolean;
103
105
  }, z.core.$strip>;
106
+ identityVerified: z.ZodOptional<z.ZodBoolean>;
104
107
  }, z.core.$strip>>;
105
108
  nextCursor: z.ZodNullable<z.ZodString>;
106
109
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;iBAW/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;iBAwClC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAIxE;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;iBAU/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB;;;;;;;;;;;iBAQlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;iBAGnC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;iBAW/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;iBAgDlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAIxE;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;iBAe/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB;;;;;;;;;;;iBAQlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;iBAGnC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
package/dist/profile.js CHANGED
@@ -73,6 +73,13 @@ export const publicProfileWireSchema = z.object({
73
73
  mutuals: profileMutualsSchema.optional(),
74
74
  /** Per-viewer relationship state. Always present (never gated). */
75
75
  viewer: viewerSocialStateSchema,
76
+ /** True when this user has been identity-verified by a Jansathi
77
+ * volunteer / leader (UDP step-1 `verifiedFields`). Surfaces the
78
+ * green check badge next to the display name on the profile
79
+ * header. Optional so backends not yet populating the field
80
+ * serialize a valid wire shape — readers treat undefined as
81
+ * unverified. Live-joined at read time, NOT a snapshot. */
82
+ identityVerified: z.boolean().optional(),
76
83
  });
77
84
  // ─── People list ────────────────────────────────────────────────────────────
78
85
  /**
@@ -89,6 +96,11 @@ export const peopleListItemSchema = z.object({
89
96
  localName: z.string().optional(),
90
97
  privacy: profilePrivacySchema,
91
98
  viewer: viewerSocialStateSchema,
99
+ /** True when this user has been identity-verified by a Jansathi
100
+ * volunteer / leader. Drives the green check badge next to the
101
+ * display name in the row. Optional for forward-compat with
102
+ * un-migrated backends. */
103
+ identityVerified: z.boolean().optional(),
92
104
  });
93
105
  export const peopleQueryParamsSchema = z.object({
94
106
  /** Free-text search across `displayName`. */
@@ -1 +1 @@
1
- {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Public community-profile wire shape.\n *\n * What every viewer can see about another user's community presence.\n * Differs from the auth/UDP `User` shape — this view is purposely thin\n * and content-engagement-oriented (post count, follower count, …).\n *\n * Privacy gating:\n * - `public` profile: the full shape is returned to any signed-in viewer.\n * - `private` profile: only `userId`, `displayName`, `avatarUrl`, and\n * the viewer's follow state are returned to non-followers. Posts and\n * counters are hidden until the viewer follows the profile owner and\n * the owner has accepted (TODO: follow-approval lifecycle — currently\n * \"private\" simply hides counters/posts from anyone who isn't the\n * owner).\n *\n * @module community-schema/profile\n */\n\nimport { z } from 'zod';\nimport { PROFILE_MAX_BIO_CHARS } from './constants.js';\nimport { profilePrivacySchema, visibilityLevelSchema } from './enums.js';\nimport { viewerSocialStateSchema } from './social.js';\nimport { usernameSchema } from './username.js';\n\n/**\n * Mini-row used in the \"Followed by X, Y + N more\" mutuals line on the\n * profile header. The server picks up to 3 sample names + a count of\n * the remaining mutuals so the row reads naturally without paginating\n * the full mutuals list inline.\n */\nexport const profileMutualsSchema = z.object({\n /** Avatar URLs (or single-letter fallbacks via `null`) for the sample\n * mutuals — order is \"show first\" → \"show last\". Capped at 3. */\n avatars: z.array(z.string().url().nullable()).max(3),\n /** Display names matched 1:1 with `avatars` order. Empty when the\n * viewer has no mutuals with the profile owner. */\n sampleNames: z.array(z.string()).max(3),\n /** How many additional mutuals exist beyond the sample. Used to\n * render the trailing \"+ N more\" suffix. Zero when the sample IS\n * the full list. */\n extraCount: z.number().int().nonnegative(),\n});\nexport type ProfileMutuals = z.infer<typeof profileMutualsSchema>;\n\nexport const publicProfileWireSchema = z.object({\n userId: z.string(),\n /** Public URL handle. The profile page lives at `/<username>`; this\n * is the canonical identity surfaced to the viewer. Always present\n * — every user is auto-minted a username at provisioning time and\n * can change it from community Settings (14-day cooldown). */\n username: usernameSchema,\n displayName: z.string(),\n avatarUrl: z.string().url().optional(),\n\n /** Author area at view time (resolved server-side). Hidden when\n * privacy is `private` and the viewer is not the owner. */\n localName: z.string().optional(),\n\n /** Privacy of THIS profile (not the viewer's). Useful for the UI\n * to render a lock chip when the profile is private. */\n privacy: profilePrivacySchema,\n\n /** Short bio — present only when set by the user. */\n bio: z.string().max(PROFILE_MAX_BIO_CHARS).optional(),\n\n /** Engagement counters. Hidden on private profiles when the viewer is\n * not the owner. Three-tuple post-redesign: connections went away\n * when the connection-request feature was removed in v0.9.0. */\n counters: z\n .object({\n postCount: z.number().int().nonnegative(),\n followerCount: z.number().int().nonnegative(),\n followingCount: z.number().int().nonnegative(),\n })\n .optional(),\n\n /** Mutual followees between the viewer and the profile owner. Renders\n * the \"Followed by X, Y + N more\" line. Omitted for self-view (no\n * point telling you about yourself) and when the viewer has no\n * mutuals with the owner. */\n mutuals: profileMutualsSchema.optional(),\n\n /** Per-viewer relationship state. Always present (never gated). */\n viewer: viewerSocialStateSchema,\n});\nexport type PublicProfileWire = z.infer<typeof publicProfileWireSchema>;\n\n// ─── People list ────────────────────────────────────────────────────────────\n\n/**\n * Lightweight row used in the People tab list. Fewer fields than the\n * full profile to keep the list response small.\n */\nexport const peopleListItemSchema = z.object({\n userId: z.string(),\n /** Public URL handle (see `publicProfileWireSchema.username`). Always\n * present — the row's display + tap-to-profile link both depend on it. */\n username: usernameSchema,\n displayName: z.string(),\n avatarUrl: z.string().url().optional(),\n localName: z.string().optional(),\n privacy: profilePrivacySchema,\n viewer: viewerSocialStateSchema,\n});\nexport type PeopleListItem = z.infer<typeof peopleListItemSchema>;\n\nexport const peopleQueryParamsSchema = z.object({\n /** Free-text search across `displayName`. */\n q: z.string().optional(),\n /** Area-scope filter. When set, server filters to users whose primary\n * area lineage matches the viewer's lineage at the chosen level. */\n level: visibilityLevelSchema.optional(),\n cursor: z.string().optional(),\n pageSize: z.number().int().positive().max(50).optional(),\n});\nexport type PeopleQueryParams = z.infer<typeof peopleQueryParamsSchema>;\n\nexport const peopleListResponseSchema = z.object({\n items: z.array(peopleListItemSchema),\n nextCursor: z.string().nullable(),\n});\nexport type PeopleListResponse = z.infer<typeof peopleListResponseSchema>;\n"]}
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Public community-profile wire shape.\n *\n * What every viewer can see about another user's community presence.\n * Differs from the auth/UDP `User` shape — this view is purposely thin\n * and content-engagement-oriented (post count, follower count, …).\n *\n * Privacy gating:\n * - `public` profile: the full shape is returned to any signed-in viewer.\n * - `private` profile: only `userId`, `displayName`, `avatarUrl`, and\n * the viewer's follow state are returned to non-followers. Posts and\n * counters are hidden until the viewer follows the profile owner and\n * the owner has accepted (TODO: follow-approval lifecycle — currently\n * \"private\" simply hides counters/posts from anyone who isn't the\n * owner).\n *\n * @module community-schema/profile\n */\n\nimport { z } from 'zod';\nimport { PROFILE_MAX_BIO_CHARS } from './constants.js';\nimport { profilePrivacySchema, visibilityLevelSchema } from './enums.js';\nimport { viewerSocialStateSchema } from './social.js';\nimport { usernameSchema } from './username.js';\n\n/**\n * Mini-row used in the \"Followed by X, Y + N more\" mutuals line on the\n * profile header. The server picks up to 3 sample names + a count of\n * the remaining mutuals so the row reads naturally without paginating\n * the full mutuals list inline.\n */\nexport const profileMutualsSchema = z.object({\n /** Avatar URLs (or single-letter fallbacks via `null`) for the sample\n * mutuals — order is \"show first\" → \"show last\". Capped at 3. */\n avatars: z.array(z.string().url().nullable()).max(3),\n /** Display names matched 1:1 with `avatars` order. Empty when the\n * viewer has no mutuals with the profile owner. */\n sampleNames: z.array(z.string()).max(3),\n /** How many additional mutuals exist beyond the sample. Used to\n * render the trailing \"+ N more\" suffix. Zero when the sample IS\n * the full list. */\n extraCount: z.number().int().nonnegative(),\n});\nexport type ProfileMutuals = z.infer<typeof profileMutualsSchema>;\n\nexport const publicProfileWireSchema = z.object({\n userId: z.string(),\n /** Public URL handle. The profile page lives at `/<username>`; this\n * is the canonical identity surfaced to the viewer. Always present\n * — every user is auto-minted a username at provisioning time and\n * can change it from community Settings (14-day cooldown). */\n username: usernameSchema,\n displayName: z.string(),\n avatarUrl: z.string().url().optional(),\n\n /** Author area at view time (resolved server-side). Hidden when\n * privacy is `private` and the viewer is not the owner. */\n localName: z.string().optional(),\n\n /** Privacy of THIS profile (not the viewer's). Useful for the UI\n * to render a lock chip when the profile is private. */\n privacy: profilePrivacySchema,\n\n /** Short bio — present only when set by the user. */\n bio: z.string().max(PROFILE_MAX_BIO_CHARS).optional(),\n\n /** Engagement counters. Hidden on private profiles when the viewer is\n * not the owner. Three-tuple post-redesign: connections went away\n * when the connection-request feature was removed in v0.9.0. */\n counters: z\n .object({\n postCount: z.number().int().nonnegative(),\n followerCount: z.number().int().nonnegative(),\n followingCount: z.number().int().nonnegative(),\n })\n .optional(),\n\n /** Mutual followees between the viewer and the profile owner. Renders\n * the \"Followed by X, Y + N more\" line. Omitted for self-view (no\n * point telling you about yourself) and when the viewer has no\n * mutuals with the owner. */\n mutuals: profileMutualsSchema.optional(),\n\n /** Per-viewer relationship state. Always present (never gated). */\n viewer: viewerSocialStateSchema,\n\n /** True when this user has been identity-verified by a Jansathi\n * volunteer / leader (UDP step-1 `verifiedFields`). Surfaces the\n * green check badge next to the display name on the profile\n * header. Optional so backends not yet populating the field\n * serialize a valid wire shape — readers treat undefined as\n * unverified. Live-joined at read time, NOT a snapshot. */\n identityVerified: z.boolean().optional(),\n});\nexport type PublicProfileWire = z.infer<typeof publicProfileWireSchema>;\n\n// ─── People list ────────────────────────────────────────────────────────────\n\n/**\n * Lightweight row used in the People tab list. Fewer fields than the\n * full profile to keep the list response small.\n */\nexport const peopleListItemSchema = z.object({\n userId: z.string(),\n /** Public URL handle (see `publicProfileWireSchema.username`). Always\n * present — the row's display + tap-to-profile link both depend on it. */\n username: usernameSchema,\n displayName: z.string(),\n avatarUrl: z.string().url().optional(),\n localName: z.string().optional(),\n privacy: profilePrivacySchema,\n viewer: viewerSocialStateSchema,\n /** True when this user has been identity-verified by a Jansathi\n * volunteer / leader. Drives the green check badge next to the\n * display name in the row. Optional for forward-compat with\n * un-migrated backends. */\n identityVerified: z.boolean().optional(),\n});\nexport type PeopleListItem = z.infer<typeof peopleListItemSchema>;\n\nexport const peopleQueryParamsSchema = z.object({\n /** Free-text search across `displayName`. */\n q: z.string().optional(),\n /** Area-scope filter. When set, server filters to users whose primary\n * area lineage matches the viewer's lineage at the chosen level. */\n level: visibilityLevelSchema.optional(),\n cursor: z.string().optional(),\n pageSize: z.number().int().positive().max(50).optional(),\n});\nexport type PeopleQueryParams = z.infer<typeof peopleQueryParamsSchema>;\n\nexport const peopleListResponseSchema = z.object({\n items: z.array(peopleListItemSchema),\n nextCursor: z.string().nullable(),\n});\nexport type PeopleListResponse = z.infer<typeof peopleListResponseSchema>;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jansathi-community-schema",
3
- "version": "0.14.1",
3
+ "version": "0.15.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",