// server/models/member.js import mongoose from "mongoose"; import { resolve } from "path"; import { fileURLToPath } from "url"; const __dirname = fileURLToPath(new URL(".", import.meta.url)); // Import configs using dynamic imports to avoid build issues const getValidCircleValues = () => ["community", "founder", "practitioner"]; const getValidContributionValues = () => ["0", "5", "15", "30", "50"]; const memberSchema = new mongoose.Schema({ email: { type: String, required: true, unique: true }, name: { type: String, required: true }, circle: { type: String, enum: getValidCircleValues(), required: true, }, contributionTier: { type: String, enum: getValidContributionValues(), required: true, }, status: { type: String, enum: ["pending_payment", "active", "suspended", "cancelled"], default: "pending_payment", }, helcimCustomerId: String, helcimSubscriptionId: String, paymentMethod: { type: String, enum: ["card", "bank", "none"], default: "none", }, subscriptionStartDate: Date, subscriptionEndDate: Date, nextBillingDate: Date, slackInvited: { type: Boolean, default: false }, slackInviteStatus: { type: String, enum: ["pending", "sent", "failed", "accepted"], default: "pending", }, slackUserId: String, // Profile fields pronouns: String, timeZone: String, avatar: String, studio: String, bio: String, skills: [String], location: String, socialLinks: { mastodon: String, linkedin: String, website: String, other: String, }, offering: String, lookingFor: String, showInDirectory: { type: Boolean, default: true }, // Peer support settings peerSupport: { enabled: { type: Boolean, default: false }, topics: [String], availability: String, personalMessage: String, slackUsername: String, slackDMChannelId: String, // DM channel ID for direct messaging }, // Privacy settings for profile fields privacy: { pronouns: { type: String, enum: ["public", "members", "private"], default: "members", }, timeZone: { type: String, enum: ["public", "members", "private"], default: "members", }, avatar: { type: String, enum: ["public", "members", "private"], default: "public", }, studio: { type: String, enum: ["public", "members", "private"], default: "members", }, bio: { type: String, enum: ["public", "members", "private"], default: "members", }, skills: { type: String, enum: ["public", "members", "private"], default: "members", }, location: { type: String, enum: ["public", "members", "private"], default: "members", }, socialLinks: { type: String, enum: ["public", "members", "private"], default: "members", }, offering: { type: String, enum: ["public", "members", "private"], default: "members", }, lookingFor: { type: String, enum: ["public", "members", "private"], default: "members", }, }, createdAt: { type: Date, default: Date.now }, lastLogin: Date, }); // Check if model already exists to prevent re-compilation in development export default mongoose.models.Member || mongoose.model("Member", memberSchema);