Enhance application structure: Add runtime configuration for environment variables, integrate new dependencies for Cloudinary and UI components, and refactor member management features including improved forms and member dashboard. Update styles and layout for better user experience.

This commit is contained in:
Jennie Robinson Faber 2025-08-27 16:49:51 +01:00
parent 6e7e27ac4e
commit e4a0a9ab0f
61 changed files with 7902 additions and 950 deletions

199
scripts/seed-members.js Normal file
View file

@ -0,0 +1,199 @@
import mongoose from 'mongoose'
import Member from '../server/models/member.js'
import { connectDB } from '../server/utils/mongoose.js'
import dotenv from 'dotenv'
// Load environment variables
dotenv.config()
const sampleMembers = [
{
email: 'alex.rivera@pixelcollective.coop',
name: 'Alex Rivera',
circle: 'founder',
contributionTier: '50',
slackInvited: true,
createdAt: new Date('2024-01-15'),
lastLogin: new Date('2025-08-20')
},
{
email: 'sam.chen@legalcoop.com',
name: 'Sam Chen',
circle: 'practitioner',
contributionTier: '30',
slackInvited: true,
createdAt: new Date('2024-02-03'),
lastLogin: new Date('2025-08-18')
},
{
email: 'maria.garcia@collectivegames.coop',
name: 'Maria Garcia',
circle: 'founder',
contributionTier: '50',
helcimCustomerId: 'cust_12345',
helcimSubscriptionId: 'sub_67890',
slackInvited: true,
createdAt: new Date('2024-03-10'),
lastLogin: new Date('2025-08-25')
},
{
email: 'david.park@impactinvest.org',
name: 'David Park',
circle: 'practitioner',
contributionTier: '30',
slackInvited: true,
createdAt: new Date('2024-04-12'),
lastLogin: new Date('2025-08-22')
},
{
email: 'jennifer.wu@grantspecialist.org',
name: 'Jennifer Wu',
circle: 'practitioner',
contributionTier: '15',
slackInvited: true,
createdAt: new Date('2024-05-08'),
lastLogin: new Date('2025-08-19')
},
{
email: 'jordan.lee@indiedev.com',
name: 'Jordan Lee',
circle: 'community',
contributionTier: '15',
slackInvited: false,
createdAt: new Date('2024-06-20'),
lastLogin: new Date('2025-08-15')
},
{
email: 'taylor.smith@gamemaker.studio',
name: 'Taylor Smith',
circle: 'community',
contributionTier: '5',
slackInvited: true,
createdAt: new Date('2024-07-15'),
lastLogin: new Date('2025-08-10')
},
{
email: 'casey.wong@studiocoop.dev',
name: 'Casey Wong',
circle: 'founder',
contributionTier: '30',
helcimCustomerId: 'cust_54321',
slackInvited: true,
createdAt: new Date('2024-08-01'),
lastLogin: new Date('2025-08-24')
},
{
email: 'riley.johnson@cooperativedev.org',
name: 'Riley Johnson',
circle: 'community',
contributionTier: '0',
slackInvited: false,
createdAt: new Date('2024-08-15'),
lastLogin: new Date('2025-08-12')
},
{
email: 'morgan.davis@gamecollective.coop',
name: 'Morgan Davis',
circle: 'founder',
contributionTier: '50',
helcimCustomerId: 'cust_98765',
helcimSubscriptionId: 'sub_13579',
slackInvited: true,
createdAt: new Date('2024-09-01'),
lastLogin: new Date('2025-08-26')
},
{
email: 'avery.brown@newdevstudio.com',
name: 'Avery Brown',
circle: 'community',
contributionTier: '5',
slackInvited: false,
createdAt: new Date('2024-10-10'),
lastLogin: new Date('2025-08-14')
},
{
email: 'phoenix.martinez@coopgames.dev',
name: 'Phoenix Martinez',
circle: 'practitioner',
contributionTier: '15',
slackInvited: true,
createdAt: new Date('2024-11-05'),
lastLogin: new Date('2025-08-21')
},
{
email: 'sage.anderson@collaborativestudio.org',
name: 'Sage Anderson',
circle: 'community',
contributionTier: '15',
slackInvited: true,
createdAt: new Date('2024-12-01'),
lastLogin: new Date('2025-08-16')
},
{
email: 'dakota.wilson@indieguildstudio.com',
name: 'Dakota Wilson',
circle: 'founder',
contributionTier: '30',
slackInvited: true,
createdAt: new Date('2025-01-10'),
lastLogin: new Date('2025-08-23')
},
{
email: 'charlie.thompson@gamecooperative.net',
name: 'Charlie Thompson',
circle: 'practitioner',
contributionTier: '50',
helcimCustomerId: 'cust_11111',
helcimSubscriptionId: 'sub_22222',
slackInvited: true,
createdAt: new Date('2025-02-14'),
lastLogin: new Date('2025-08-25')
}
]
async function seedMembers() {
try {
await connectDB()
// Clear existing members
await Member.deleteMany({})
console.log('Cleared existing members')
// Insert sample members
await Member.insertMany(sampleMembers)
console.log(`Added ${sampleMembers.length} sample members`)
// Verify insertion and show summary
const count = await Member.countDocuments()
console.log(`Total members in database: ${count}`)
// Show breakdown by circle
const circleBreakdown = await Member.aggregate([
{ $group: { _id: '$circle', count: { $sum: 1 } } },
{ $sort: { _id: 1 } }
])
console.log('\nBreakdown by circle:')
circleBreakdown.forEach(circle => {
console.log(` ${circle._id}: ${circle.count} members`)
})
// Show breakdown by contribution tier
const tierBreakdown = await Member.aggregate([
{ $group: { _id: '$contributionTier', count: { $sum: 1 } } },
{ $sort: { _id: 1 } }
])
console.log('\nBreakdown by contribution tier:')
tierBreakdown.forEach(tier => {
console.log(` $${tier._id}: ${tier.count} members`)
})
process.exit(0)
} catch (error) {
console.error('Error seeding members:', error)
process.exit(1)
}
}
seedMembers()