- Login by email; board members are dashboard users (full access) - Forced password change on first login; forgot/reset password via email - Auto-send welcome email with set-password link when board member created - 5 attempts / 5 min rate limit on login endpoint - Board + Minutes tabs: drag-and-drop card reordering, persisted to DB - PATCH /api/board/reorder and /api/minutes/reorder endpoints - New minutes auto-insert at top (order 0) - ImagePicker: inline preview thumbnail before upload (board, gallery, sponsors) - Fix Minutes public sort: proper date parsing instead of broken string compare - Remove server/dist/ from git tracking (.gitignore)
29 lines
1.1 KiB
TypeScript
29 lines
1.1 KiB
TypeScript
import mongoose, { Document, Schema } from 'mongoose';
|
|
|
|
export interface IBoardMember extends Document {
|
|
name: string;
|
|
position: string;
|
|
email: string;
|
|
image: string;
|
|
bio: string;
|
|
order: number;
|
|
password?: string;
|
|
mustChangePassword: boolean;
|
|
resetToken?: string;
|
|
resetTokenExpiry?: Date;
|
|
}
|
|
|
|
const BoardMemberSchema = new Schema<IBoardMember>({
|
|
name: { type: String, required: true, trim: true },
|
|
position: { type: String, required: true, trim: true },
|
|
email: { type: String, required: true, unique: true, trim: true, lowercase: true },
|
|
image: { type: String, required: true },
|
|
bio: { type: String, required: true },
|
|
order: { type: Number, default: 0 },
|
|
password: { type: String, select: false },
|
|
mustChangePassword:{ type: Boolean, default: true },
|
|
resetToken: { type: String, select: false },
|
|
resetTokenExpiry: { type: Date, select: false },
|
|
}, { timestamps: true });
|
|
|
|
export const BoardMember = mongoose.model<IBoardMember>('BoardMember', BoardMemberSchema);
|