Skip to content

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

node scripts/seed.js

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:

firebase deploy --only firestore: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:

npm run build
firebase deploy --only hosting

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

# Start dev server
npm run dev

# View at http://localhost:5173

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.json exists
  • 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
  • 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