# Contributing to MirrorMatch

Thank you for your interest in contributing to MirrorMatch! This document outlines the coding conventions, development workflow, and expectations for contributors.

## Getting Started

### Local Development Setup

1. **Clone the repository** (if applicable) or navigate to the project directory
2. **Install dependencies:**
   ```bash
   npm install
   ```

3. **Set up environment variables:**
   - Copy `env.example` to `.env`
   - Configure `DATABASE_URL`, `NEXTAUTH_SECRET`, and email settings
   - See `README.md` for detailed setup instructions

4. **Set up the database:**
   ```bash
   npm run db:generate
   npm run db:migrate
   npm run db:seed
   ```

5. **Start the development server:**
   ```bash
   npm run dev
   ```

6. **Open the app:**
   - Navigate to [http://localhost:3000](http://localhost:3000)
   - Login with default admin: `admin@mirrormatch.com` / `admin123`

## Coding Conventions

### TypeScript

- **Use TypeScript for all code** - no JavaScript files
- **Strict mode enabled** - follow TypeScript best practices
- **Avoid `any` types** - use proper types or `unknown` when necessary
- **Define types explicitly** - don't rely on type inference when it reduces clarity

### Code Style

- **Follow existing patterns** - maintain consistency with the codebase
- **Use meaningful names** - variables, functions, and components should be self-documenting
- **Keep functions focused** - single responsibility principle
- **Prefer small components** - break down large components into smaller, composable pieces

### Folder Structure

Follow the established structure:
```
app/              # Next.js App Router routes
components/       # Reusable React components
lib/             # Utility functions and helpers
prisma/           # Database schema and migrations
types/            # TypeScript type definitions
```

### Naming Conventions

- **Components:** PascalCase (e.g., `Navigation.tsx`, `GuessForm.tsx`)
- **Files:** Match component/function names (e.g., `lib/utils.ts`)
- **Variables/Functions:** camelCase (e.g., `getUserById`, `photoUrl`)
- **Constants:** UPPER_SNAKE_CASE (e.g., `MAX_POINTS`)
- **Types/Interfaces:** PascalCase (e.g., `User`, `PhotoData`)

### Linting and Formatting

- **ESLint** is configured - run `npm run lint` to check for issues
- **Fix linting errors** before committing
- **Follow Next.js ESLint rules** - the project uses `eslint-config-next`

## Development Workflow

### Before Making Changes

1. **Read the documentation:**
   - `README.md` - Project overview and setup
   - `ARCHITECTURE.md` - System design and data flows
   - `.cursor/rules/mirrormatch.mdc` - Project rules and guidelines
   - `CONTRIBUTING.md` (this file) - Coding conventions
   - `SECURITY.md` - Security practices

2. **Understand the codebase:**
   - Review related files before modifying
   - Understand the data model in `prisma/schema.prisma`
   - Check existing patterns for similar features

3. **Plan your changes:**
   - Break down large changes into smaller, incremental steps
   - Consider impact on existing features
   - Think about security implications

### Making Changes

1. **Create a focused change:**
   - One feature or fix per commit when possible
   - Keep changes small and reviewable
   - Test your changes locally

2. **Follow established patterns:**
   - Use existing component patterns
   - Follow the same structure for new API routes
   - Maintain consistency with existing code style

3. **Write clear code:**
   - Add comments for complex logic
   - Use descriptive variable names
   - Keep functions and components focused

### Adding New Features

When adding new features:

1. **Update documentation:**
   - Update `README.md` if user-facing behavior changes
   - Update `ARCHITECTURE.md` if system design changes
   - Update `.cursor/rules/mirrormatch.mdc` if rules change
   - Update `SECURITY.md` if security practices change

2. **Follow security guidelines:**
   - Validate all user inputs
   - Check authorization for all mutations
   - Never expose sensitive data
   - See `SECURITY.md` for details

3. **Test your changes:**
   - Test the feature manually
   - Verify error handling
   - Check edge cases
   - Ensure no regressions

4. **Update types:**
   - Add TypeScript types for new data structures
   - Update Prisma schema if database changes needed
   - Run `npm run db:generate` after schema changes

### Commit Messages

Write clear, descriptive commit messages:

- **Format:** Use imperative mood (e.g., "Add photo upload validation")
- **Be specific:** Describe what changed and why
- **Reference issues:** If applicable, reference issue numbers

**Examples:**
- ✅ "Add password strength validation to change password form"
- ✅ "Fix case-insensitive guess matching bug"
- ✅ "Update README with new environment variables"
- ❌ "Fixed stuff"
- ❌ "Updates"

### Code Review Checklist

Before submitting changes, ensure:

- [ ] Code follows TypeScript and style conventions
- [ ] All linting errors are fixed
- [ ] Documentation is updated (if needed)
- [ ] Security considerations are addressed
- [ ] Changes are tested locally
- [ ] Commit messages are clear and descriptive

## Testing

### Manual Testing

- Test all user flows:
  - User login and authentication
  - Photo upload and email notifications
  - Guess submission and point awarding
  - Admin user management
  - Password changes

- Test edge cases:
  - Invalid inputs
  - Unauthorized access attempts
  - Missing data
  - Network errors

### Database Testing

- Test with fresh database migrations
- Verify seed script works correctly
- Test with various data states

## Adding Tests (Future)

If tests are added to the project:

- **Unit tests:** Test utility functions and helpers
- **Integration tests:** Test API routes and database operations
- **E2E tests:** Test complete user flows
- **Update test coverage** when adding new features

## Documentation Updates

### When to Update Documentation

- **README.md:** When setup steps, features, or usage changes
- **ARCHITECTURE.md:** When system design, data flows, or patterns change
- **CONTRIBUTING.md:** When coding conventions or workflow changes
- **SECURITY.md:** When security practices or vulnerabilities change
- **.cursor/rules:** When project rules or guidelines change

### Documentation Standards

- **Keep docs up to date** - outdated docs are worse than no docs
- **Be clear and concise** - use examples when helpful
- **Cross-reference** - link to related documentation
- **Update all relevant docs** - don't update just one file

## Guidelines for AI Tools (Cursor)

If you're using AI tools like Cursor to help with development:

1. **Respect these conventions:**
   - Follow the coding style and patterns outlined here
   - Use the established folder structure
   - Maintain consistency with existing code

2. **Prefer incremental changes:**
   - Make small, focused changes rather than large refactors
   - Test each change before moving to the next
   - Keep commits focused and reviewable

3. **Update documentation:**
   - When AI generates code that changes behavior, update relevant docs
   - Keep architecture docs in sync with code changes
   - Document any new patterns or conventions

4. **Security awareness:**
   - Never generate code that exposes sensitive data
   - Always include authorization checks
   - Validate all user inputs
   - Follow security guidelines in `SECURITY.md`

5. **Read before generating:**
   - Always read relevant documentation first
   - Understand existing patterns before creating new code
   - Check similar features for consistency

## Questions?

If you have questions about:
- **Setup issues:** Check `README.md`
- **Architecture questions:** Check `ARCHITECTURE.md`
- **Security concerns:** Check `SECURITY.md`
- **Coding conventions:** Check this file and `.cursor/rules/mirrormatch.mdc`

## Important Reminders

- **Always read documentation before making large changes**
- **Keep documentation updated when behavior changes**
- **Follow security guidelines strictly**
- **Test your changes before committing**
- **Write clear commit messages**
- **Maintain consistency with existing code**

---

**Last Updated:** When conventions or workflow change, update this file and notify contributors.
