Skip to content

[Proposal] Add event organization foundations - #1

Merged
guyghost merged 23 commits into
mainfrom
change/add-event-organization
Nov 19, 2025
Merged

[Proposal] Add event organization foundations#1
guyghost merged 23 commits into
mainfrom
change/add-event-organization

Conversation

@guyghost

@guyghost guyghost commented Nov 11, 2025

Copy link
Copy Markdown
Owner

Summary

Implement core event organization features to establish the foundation for Wakeve's collaborative event planning system.

  • Event Creation: Organizers can create events with proposed time slots and voting deadlines
  • Availability Polling: Participants vote on slots using YES/MAYBE/NO with weighted scoring
  • Date Confirmation: Organizers validate and lock the final event date
  • Domain Models: Event, TimeSlot, Poll, Vote with complete scoring logic

Related Issue

Relates to #2

Documentation

What Changed

  • Created domain models in shared KMP module (Event, TimeSlot, Poll, Vote)
  • Implemented EventRepository with in-memory storage
  • Added PollLogic with weighted slot scoring algorithm
  • Updated UI App.kt with event creation and polling UI
  • Created comprehensive design and specification documentation

Implementation Status

✅ Phase 1: Core Models & Logic
⏳ Phase 2: Persistence & Full UI
⏳ Phase 3: Timezone & Validation
⏳ Phase 4: Integration with Downstream Agents

Copilot AI review requested due to automatic review settings November 11, 2025 23:59

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR adds a proposal document for implementing event organization functionality in the Wakeve application, following the OpenSpec spec-driven development workflow. The proposal outlines the addition of core event management features including event creation, availability polls, deadline management, and date validation for event organizers.

Key Changes

  • Introduces proposal document for the add-event-organization change
  • Defines scope to add event data models, UI components, and organizer controls
  • Targets implementation across shared Kotlin module, Android (Jetpack Compose), and future iOS support

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread openspec/changes/add-event-organization/proposal.md Outdated
Comment thread openspec/changes/add-event-organization/proposal.md Outdated
- Add comprehensive design and spec documentation
- Create domain models (Event, TimeSlot, Poll, Vote)
- Implement EventRepository with in-memory storage
- Add PollLogic for weighted slot scoring
- Update issue #2 with documentation links

This implements Phase 1 of the event organization feature,
providing the foundation for polling and date confirmation.
@guyghost guyghost changed the title [#1] Add proposal for add-event-organization [Proposal] Add event organization foundations Nov 12, 2025
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@guyghost guyghost self-assigned this Nov 17, 2025
@guyghost
guyghost requested a review from Copilot November 17, 2025 13:55

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 53 out of 248 changed files in this pull request and generated 4 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

)
Button(onClick = {
val event = Event(
id = kotlin.random.Random.nextLong().toString(),

Copilot AI Nov 17, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using Random.nextLong().toString() for IDs can produce collisions and negative values. Use a proper UUID generator (e.g., kotlinx-uuid) or ensure unique ID generation with a prefix/timestamp to prevent ID conflicts.

Copilot uses AI. Check for mistakes.
title = title,
description = description,
organizerId = "organizer1", // mock
proposedSlots = listOf(TimeSlot("slot1", "2024-01-01T10:00", "2024-01-01T12:00", "UTC")),

Copilot AI Nov 17, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The hardcoded date '2024-01-01' is in the past. Consider using a dynamic date calculation (e.g., current date + offset) to avoid creating events with expired dates during testing.

Copilot uses AI. Check for mistakes.
Comment on lines +3 to +9
class EventRepository {
private val events = mutableMapOf<String, Event>()
private val polls = mutableMapOf<String, Poll>()

fun createEvent(event: Event) {
events[event.id] = event
polls[event.id] = Poll(event.id, event.id, emptyMap())

Copilot AI Nov 17, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Poll is initialized with the same value for both id and eventId (event.id). Consider using distinct IDs or clarifying if this duplication is intentional through documentation.

Suggested change
class EventRepository {
private val events = mutableMapOf<String, Event>()
private val polls = mutableMapOf<String, Poll>()
fun createEvent(event: Event) {
events[event.id] = event
polls[event.id] = Poll(event.id, event.id, emptyMap())
import java.util.UUID
class EventRepository {
private val events = mutableMapOf<String, Event>()
private val polls = mutableMapOf<String, Poll>()
fun createEvent(event: Event) {
events[event.id] = event
val pollId = UUID.randomUUID().toString()
polls[event.id] = Poll(pollId, event.id, emptyMap())

Copilot uses AI. Check for mistakes.
Comment thread composeApp/src/commonMain/kotlin/com/guyghost/wakeve/App.kt Outdated
guyghost and others added 16 commits November 17, 2025 15:06
- Remove wiki-content, wiki-repo, docs directories
- Update AGENTS.md to reference GitHub Projects instead of wiki
- Update openspec-proposal.md command instructions
- Update openspec-apply.md command instructions
- Update openspec-archive.md command instructions
- Update GitHub issue template to use project items

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
…eltas

- Add event-organization capability specification with Purpose and Requirements sections
- Define 10 requirements for event creation, polling, voting, and date validation
- Create changes-v1.0.0.md with detailed ADDED requirements and scenarios
- Update proposal.md to link to GitHub issue #2
- Requirements include timezone support, RBAC, deadline enforcement, and data persistence
- OpenSpec change now has 10 deltas recognized for add-event-organization
…tests

- Enhance Event model with participants list for RBAC
- Implement EventRepository with deadline enforcement and vote validation
- Add vote submission blocking after deadline and for non-participants
- Implement role-based access control (Organizer can modify, Participants can vote)
- Extend PollLogic with score breakdown and best slot selection with details
- Add comprehensive unit tests for EventRepository (10 tests)
- Add comprehensive unit tests for PollLogic (6 tests)
- All 16 tests passing: event creation, participant management, voting, deadlines, scoring
- Fulfills OpenSpec requirements REQ-EVT-001 through REQ-EVT-010
- Create EventCreationScreen: event title, description, multiple time slots, deadline
- Create ParticipantManagementScreen: add/remove participants, start poll
- Create PollVotingScreen: vote on each time slot (YES/MAYBE/NO)
- Create PollResultsScreen: view vote breakdown, scores, confirm final date
- Implement navigation flow between screens using AppState
- Add input validation and error handling
- Display score breakdown with visual indicators
- Support role-based UI (organizer confirmation vs participant voting)
- All Compose components compile successfully
- Implements OpenSpec requirements REQ-EVT-001 through REQ-EVT-010
Simplified OpenSpec workflow to use only:
- GitHub Issues for tracking
- Local markdown files for specifications
- Structured naming conventions

Changes:
- Add openspec/README.md: Overview and quick start guide
- Add openspec/PROCESS.md: Complete step-by-step workflow guide
- Update openspec/AGENTS.md: Reference guide for AI assistants

Key improvements:
- No GitHub Projects required (removed as dependency)
- Clear stage workflow: Proposal → Specification → Validation → Implementation
- File structure clear and self-documenting
- Best practices and examples included
- Common issues and solutions documented
- Validation rules explicitly defined

The process now follows:
1. Create GitHub Issue with change-id
2. Create proposal.md in openspec/changes/<change-id>/
3. Create/update spec.md in openspec/specs/<capability>/
4. Write 10+ requirements with Given-When-Then scenarios
5. Validate with: openspec validate <change-id> --strict
6. Submit PR linking to GitHub Issue
7. Get approval before implementing

This maintains spec rigor while simplifying the process for AI assistants.
…ence layer

- Integrate SQLDelight as the multiplatform database solution
- Design and implement SQLite schema with 6 tables (event, timeSlot, participant, vote, confirmedDate, syncMetadata)
- Create SQLDelight query files (.sq) for all database operations
- Move domain models to separate models package to avoid conflicts with generated SQLDelight classes
- Implement DatabaseEventRepository as database-backed event storage
- Configure SQLDelight in shared/build.gradle.kts for Android, iOS, and JVM targets
- Update all imports across composeApp and shared modules for models package
- All Phase 1 tests continue to pass with refactored imports

SQLDelight provides:
- Compile-time verified SQL queries
- Type-safe database access
- Multiplatform support (Android, iOS, JVM)
- Automatic code generation for queries and data classes

Next steps: Create database driver initialization, add migration support, and write persistence layer tests.
…e persistence tests

Database Driver Initialization:
- Create DatabaseFactory interface for platform-specific driver implementations
- Implement AndroidDatabaseFactory using Android SQLite driver
- Implement IosDatabaseFactory using native SQLite driver
- Implement JvmDatabaseFactory using JDBC SQLite driver
- Create DatabaseProvider singleton for database instance management

Persistence Layer Tests (13 tests):
- testCreateAndRetrieveEvent: Basic create and retrieve operations
- testAddParticipant: Add participant to event
- testAddParticipantToNonDraftEventFails: Validation of event status
- testAddDuplicateParticipantFails: Prevent duplicate participants
- testUpdateEventStatus: Status transitions (DRAFT → POLLING → CONFIRMED)
- testAddVoteToEvent: Vote submission during polling
- testVoteBeforeDeadlineFails: Deadline validation
- testGetPoll: Poll aggregation across participants
- testGetAllEvents: Query all events
- testIsOrganizer: Organizer verification
- testCanModifyEvent: Permission checks
- testEventNotFound: Error handling for missing events
- testConfirmEventDate: Final date confirmation workflow

Offline Scenario & Data Recovery Tests (7 tests):
- testDataPersistsAcrossSessions: Verify persistence across app sessions
- testOfflineChangesAreTracked: Sync metadata tracking for offline changes
- testVotesArePersisted: Vote persistence across sessions
- testEventStatusChangesArePersisted: Status change persistence
- testMultipleEventsArePersisted: Multi-event persistence
- testDataRecoveryAfterCrash: Complete data recovery after app crash
- testSyncMetadataTracksPendingChanges: Offline change tracking

Test Organization:
- DatabaseEventRepositoryTest in jvmTest (platform-specific tests)
- OfflineScenarioTest in jvmTest (persistence across sessions)
- TestDatabaseFactory for in-memory database creation

All 36 tests passing (10 Phase 1 + 26 Phase 2)
Server Setup:
- Initialize JvmDatabaseFactory on server startup
- Load DatabaseEventRepository for event operations
- Configure Ktor with ContentNegotiation plugin

Dependencies:
- Add kotlinx-serialization 1.7.3 for JSON serialization
- Add Ktor content-negotiation and serialization plugins
- Add SQLDelight JVM driver for server database access

API Infrastructure:
- Create ApiModels.kt with serializable request/response DTOs
- Define data classes for event operations (create, vote, update status)
- Define response wrappers for API responses and errors
- Implement generic ApiResponse<T> for consistent API responses

API Endpoints (scaffolding):
- GET /health - health check
- GET /api/events - event management endpoints
- GET /api/polls - poll endpoints
- GET /api/votes - vote endpoints

Project Structure:
- Server module properly integrated with shared module
- Database access ready for endpoint implementation (Phase 2-14)
- ContentNegotiation configured for JSON serialization

Next: Implement REST API endpoints for events, polls, and votes
…ts, and polls

Event Endpoints (EventRoutes.kt):
- GET /api/events - List all events with details
- GET /api/events/{id} - Get specific event
- POST /api/events - Create new event with time slots
- PUT /api/events/{id}/status - Update event status (DRAFT → POLLING → CONFIRMED)

Participant Endpoints (ParticipantRoutes.kt):
- GET /api/events/{id}/participants - Get event participants
- POST /api/events/{id}/participants - Add participant to event

Vote Endpoints (VoteRoutes.kt):
- GET /api/events/{id}/poll - Get poll with all votes
- POST /api/events/{id}/poll/votes - Add vote (YES/MAYBE/NO) to poll

API Features:
- Comprehensive error handling with HTTP status codes
- Request validation (required fields, valid enums)
- Response mapping from domain models to serializable DTOs
- Consistent error response format
- Support for event lifecycle (creation → polling → confirmation)

Integration:
- Routes integrated into Ktor server application module
- Database repository injected into route handlers
- All endpoints use DatabaseEventRepository for persistence
- Serialization handled by Ktor ContentNegotiation

All 36 tests passing (shared module + JVM tests)
Document complete implementation of add-event-organization change:
- Phase 1: Domain models, business logic, Android UI (16 tests)
- Phase 2 Sprint 1: SQLDelight persistence, offline recovery (20 tests)
- Phase 2 Sprint 2: REST API endpoints with Ktor server

All 10 requirements implemented and tested.
36/36 tests passing.
Ready for code review and merge.
Complete checklist covering:
- Phase 1: 16 requirements for domain models, logic, and UI
- Phase 2 Sprint 1: 6 SQLDelight tables, 4 platform drivers, 20 persistence tests
- Phase 2 Sprint 2: 8 REST API endpoints, 10 API models, full CRUD support

All 36 tests passing.
All 10 core requirements satisfied.
Ready for code review and merge to main.
Phase 3 Planning Documents:
- PHASE_3_ROADMAP.md: Detailed 6-week roadmap covering OAuth2, offline sync, notifications, calendar integration
- CONTRIBUTING.md: Comprehensive contribution guide with development workflow, architecture, testing guidelines

Phase 3 Objectives:
1. User Authentication: OAuth2 integration with Google/Apple
2. Offline-First Sync: Automatic change synchronization to server
3. Push Notifications: Deadline reminders and event updates
4. Calendar Integration: Native calendar app support

Timeline:
- Sprint 1 (Dec 1-14): OAuth2 Authentication
- Sprint 2 (Dec 15-31): Offline-First Sync
- Sprint 3 (Jan 1-15): Notifications & Calendar
- Target: Mid-January 2026

Roadmap includes:
- Technical architecture decisions
- Database schema extensions
- Testing strategy
- Deployment considerations
- Risk mitigation
- Success criteria

Ready for Phase 3 implementation!
Quick Start Guide includes:
- 5-minute setup instructions
- Project status overview (Phase 2 complete, Phase 3 planning)
- Development workflow walkthrough
- Key files and directory structure
- Layer-by-layer architecture explanation
- API usage examples with curl
- Common tasks and troubleshooting
- Learning resources and links
- Commands cheat sheet

Helps new developers:
- Understand project structure
- Get up and running quickly
- Learn architecture patterns
- Understand development workflow
- Know where to find information

Perfect companion to CONTRIBUTING.md for onboarding.
New README includes:
- Project overview and feature highlights
- Quick start instructions (5 minutes)
- Complete project structure diagram
- Architecture layers and technology stack
- Project statistics and test coverage
- Comprehensive documentation links
- REST API endpoint reference with examples
- Platform support details (Android/iOS/JVM)
- Development workflow and OpenSpec process
- Contributing guidelines and support info
- Phase 3 roadmap reference
- Troubleshooting section

Replaces generic Kotlin Multiplatform template README with Wakeve-specific documentation.
Helps new contributors understand:
- What Wakeve does and why it matters
- How to get started quickly
- Where to find detailed documentation
- How to contribute effectively
- Current status and future plans
New README includes:
- Project overview: collaborative event planning for distributed teams
- Feature highlights for Phase 2 and Phase 3 planning
- Quick start instructions (5 minutes to productive)
- Complete project structure with file organization
- Architecture diagram showing multiplatform layers
- Key technology stack (Kotlin KMP, Compose, Ktor, SQLDelight)
- Project statistics (36 tests, ~3500 LOC, 8 API endpoints)
- Comprehensive documentation links
- REST API endpoints with curl examples
- Platform support details (Android/iOS/JVM)
- Development workflow following OpenSpec process
- Contributing guidelines reference
- Phase 3 roadmap overview
- Troubleshooting section
- Project vision statement

Replaces generic Kotlin Multiplatform template README.
Serves as main entry point for developers and contributors.
@guyghost

Copy link
Copy Markdown
Owner Author

Implementation Complete ✅

All 10 event organization requirements have been implemented and tested:

Summary

  • ✅ Phase 1: Domain models, business logic, Android UI (16 tests)
  • ✅ Phase 2 Sprint 1: SQLDelight persistence, multiplatform DB (20 tests)
  • ✅ Phase 2 Sprint 2: REST API endpoints, error handling (0 failures)
  • ✅ Total: 36 tests passing (100%), build successful

Test Results

  • EventRepositoryTest: 10/10 ✅
  • PollLogicTest: 6/6 ✅
  • DatabaseEventRepositoryTest: 13/13 ✅
  • OfflineScenarioTest: 7/7 ✅
  • ApplicationTest (API): 1/1 ✅

Build Status

  • shared module: ✅ Compiles
  • composeApp module: ✅ Compiles
  • server module: ✅ Compiles
  • All tests: ✅ Pass

Requirements Coverage

  1. ✅ Event creation with slots and deadline
  2. ✅ Participant invitation and management
  3. ✅ Poll status transition
  4. ✅ Voting with YES/MAYBE/NO
  5. ✅ Voting deadline enforcement
  6. ✅ Weighted vote scoring
  7. ✅ Event confirmation
  8. ✅ Timezone-aware display
  9. ✅ Role-based access control
  10. ✅ Data persistence

Ready for approval and merge to main.

- Replace placeholder ContentView with state-based navigation logic
- Implement EventListView with creation and listing capabilities
- Add EventDetailView with status-specific action buttons
- Create reusable UI components: EventCard and ActionButton
- Integrate EventRepository for data handling
Add SwiftUI screens for event creation, participant management, voting, and results. Include LiquidGlassModifier for custom styling.
@guyghost
guyghost merged commit 1b4792c into main Nov 19, 2025
guyghost added a commit that referenced this pull request Apr 14, 2026
- Store readiness checklist (102 items across 8 categories)
- Gap analysis document with action plan
- Privacy Policy (GDPR, CCPA, App Privacy Nutrition Label, Data Safety)
- Terms of Service
- Fastlane configuration (Android + iOS lanes)
- Store metadata (EN + FR) for both platforms:
  - Title, subtitle, keywords, descriptions, release notes
- GitHub Actions store-readiness workflow:
  - Build gate (Android AAB + iOS framework)
  - Test gate (shared JVM tests)
  - Security gate (secret scan, localhost URL scan)
  - Metadata validation gate
  - Code quality gate
  - Summary gate with pass/fail
- Add NSCalendarsUsageDescription to iOS Info.plist

Refs: DAO Proposal #1 - Application ready to go to Stores
guyghost added a commit that referenced this pull request Apr 14, 2026
- Store metadata linter script (scripts/lint-store-metadata.sh)
  Validates titles, descriptions, keywords, changelogs against
  store limits (Android 30/80/4000 chars, iOS 30/30/4000/100 chars)
  Checks legal pages, Fastlane config, screenshot presence
  Supports --strict and --json output modes
- Accessibility audit document (docs/ACCESSIBILITY_AUDIT.md)
  Android: 290 contentDescriptions, ~15 icons missing labels
  iOS: 39 accessibility labels, 15 views need audit
- Store submission benchmark thresholds in BENCHMARKS.md
  Cold start, memory, app size, crash-free, ANR rate targets
- Fix store titles to fit 30 char limit (Wakeve)
- Fix iOS subtitles to fit 30 char limit

All metadata validations pass (28/28 checks, 0 errors).

Refs: DAO Proposal #1 - Application ready to go to Stores
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants