Sponsor-Dugnad Developer Documentation
Complete setup and maintenance guide for the Sponsor-Dugnad platform.
Quick Start
Prerequisites
- Node.js 18+ installed
- Firebase CLI installed (
npm install -g firebase-tools) - Firebase project access
Initial Setup
# 1. Clone and install
cd c:\Users\owest\Dev\GOLFTEAMTIME-V2\Sponsor-Dugnader
npm install
# 2. Login to Firebase
firebase login
# 3. Set active project
firebase use sponsor-dugnader
# 4. Start development server
npm run dev
Database Seeding
First-Time Setup
Step 1: Get Service Account Key
1. Go to Firebase Console Service Accounts
2. Click "Generate new private key"
3. Save the file as serviceAccountKey.json in project root
4. IMPORTANT: Add to .gitignore (already configured)
Step 2: Run Seed Script
What Gets Seeded
Companies (2):
- Kiwi Ski Storsenter (company_kiwi_ski)
- Rema 1000 Ski (company_rema_ski)
Clubs (2):
- Ski Golf Klubb (club_ski_golf)
- Ski Fotballklubb (club_ski_fotball)
Members (2):
- Ole Hansen (member_ole_hansen - Golf club)
- Kari Nordmann (member_kari_nordmann - Fotball club)
Missions (3): - Varetelling (active) - Julemarked (active) - Black Friday (completed)
User Profiles (3): - Company admin, Club admin, Member
Firebase Configuration
Security Rules
Location: firestore.rules
Deploy rules:
Current rules: - Companies: Owner + GKIT support only - Clubs: Admins can write, members can read - Members: STRICTEST - only self + GKIT support (GDPR) - Missions: Public read, company write
Hosting
Build and deploy:
Live URL: https://sponsor-dugnader.web.app
Project Structure
Sponsor-Dugnader/
├── src/
│ ├── components/
│ │ ├── Layout.jsx # Main layout with navigation
│ │ └── MissionCard.jsx # Swipeable mission card
│ ├── pages/
│ │ ├── Home.jsx # Landing page
│ │ ├── Login.jsx # Authentication
│ │ ├── Signup.jsx # Registration (2-step)
│ │ ├── MissionBoard.jsx # Tinder-style mission browser
│ │ ├── CompanyDashboard.jsx # Company profile (/profil/company)
│ │ ├── ClubDashboard.jsx # Club profile (/profil/club)
│ │ ├── MemberProfile.jsx # Member profile (/profil/member)
│ │ └── CompanyProfile.jsx # Public company page
│ ├── context/
│ │ └── AuthContext.jsx # Firebase Auth state
│ ├── services/
│ │ └── firestoreService.js # Database operations
│ ├── firebase.js # Firebase config
│ └── App.jsx # Routing
├── scripts/
│ └── seed.js # Database seeding
├── firestore.rules # Security rules
├── firebase.json # Firebase config
└── package.json
Routes
Public Routes
/- Home/Landing/login- Login/signup- Registration/company/:id- Public company profile
Protected Routes
/dugnadsborsen- Mission marketplace (swipeable cards)/mine-oppdrag- My missions dashboard/profil/company- Company dashboard/profil/club- Club dashboard/profil/member- Member profile (GDPR protected)/leaderboard- Rankings
Firestore Collections
companies/{companyId}
- Company information
- Stats (total spent, missions posted, etc.)
- Access: Owner + GKIT support only
clubs/{clubId}
- Club information
- Team roster (memberIds array)
- Stats (total earned, active members, etc.)
- Access: Admins write, members read
club_members/{memberId} ⚠️ GDPR PROTECTED
- Personal data (name, email, phone, address, DOB)
- Club affiliation
- Individual stats
- Access: ONLY the member + GKIT support
missions/{missionId}
- Mission details
- Company reference
- Status (open/completed)
- Access: Public read, company write
users/{userId}
- Basic auth profile
- Role (company/club/member)
- Display name
- Access: Authenticated users read, self write
Development Workflow
Daily Development
Deploy Changes
# 1. Build production bundle
npm run build
# 2. Deploy to Firebase Hosting
firebase deploy --only hosting
# 3. If rules changed, also deploy:
firebase deploy --only firestore:rules
Testing Profiles
Company Login:
- Email: ski@kiwi.no
- View at: /profil/company
Club Admin Login:
- Email: leder@skigk.no
- View at: /profil/club
Member Login:
- Email: ole.hansen@skigk.no
- View at: /profil/member
Key Features
Mission Board (Tinder for Work)
- Swipeable mission cards
- Left swipe = Skip (❌)
- Right swipe = Save (📌)
- Visual feedback with color overlays
- Card tilt animation
GDPR Compliance
- Separate data collections by role
- Strictest access for member personal data
- Security rules enforce separation
- Member data only accessible by self + support
Role-Based Access
- Navigation adapts based on user role
- Profile routes automatically determined
- Dashboard content varies by role
Environment Variables
Firebase configuration is in src/firebase.js:
- API Key
- Auth Domain
- Project ID
- Storage Bucket
- Messaging Sender ID
- App ID
No .env file needed - config is committed (Firebase public config is safe)
Troubleshooting
"Permission denied" errors
- Check Firestore security rules
- Verify user is authenticated
- Confirm user role matches required permissions
Seed script fails
- Ensure
serviceAccountKey.jsonexists - Check file is in project root
- Verify Firebase project is active
Build fails
- Clear node_modules:
rm -rf node_modules && npm install - Clear dist:
rm -rf dist - Rebuild:
npm run build
Navigation not working
- Check Layout.jsx for role detection
- Verify userRole in AuthContext
- Clear browser cache
Maintenance
Monthly Tasks
- Review Firestore security rules
- Check for Firebase SDK updates
- Monitor usage/costs in Firebase Console
Before Production Launch
- [ ] Remove temporary seed rules from
firestore.rules - [ ] Add privacy policy page
- [ ] Implement data export feature (GDPR)
- [ ] Add account deletion flow (GDPR)
- [ ] Set up monitoring/alerts
- [ ] Configure backup policies
Support
GKIT Support Email: Check Firebase security rules for @gkit.no domain
Firebase Console: https://console.firebase.google.com/project/sponsor-dugnader
Live App: https://sponsor-dugnader.web.app