Files
thrillwiki_laravel/memory-bank/models/UserModel.md

122 lines
4.3 KiB
Markdown

# User Model Conversion
## Original Django Model Structure
### User Model (extends AbstractUser)
```python
class User(AbstractUser):
# Custom fields
user_id = models.CharField(max_length=10, unique=True, editable=False)
role = models.CharField(max_length=10, choices=['USER', 'MODERATOR', 'ADMIN', 'SUPERUSER'])
is_banned = models.BooleanField(default=False)
ban_reason = models.TextField(blank=True)
ban_date = models.DateTimeField(null=True, blank=True)
pending_email = models.EmailField(blank=True, null=True)
theme_preference = models.CharField(max_length=5, choices=['light', 'dark'])
```
### UserProfile Model
```python
class UserProfile:
profile_id = models.CharField(max_length=10, unique=True, editable=False)
user = models.OneToOneField(User, related_name='profile')
display_name = models.CharField(max_length=50, unique=True)
avatar = models.ImageField(upload_to='avatars/')
pronouns = models.CharField(max_length=50, blank=True)
bio = models.TextField(max_length=500, blank=True)
# Social media
twitter = models.URLField(blank=True)
instagram = models.URLField(blank=True)
youtube = models.URLField(blank=True)
discord = models.CharField(max_length=100, blank=True)
# Stats
coaster_credits = models.IntegerField(default=0)
dark_ride_credits = models.IntegerField(default=0)
flat_ride_credits = models.IntegerField(default=0)
water_ride_credits = models.IntegerField(default=0)
```
## Laravel Implementation Plan
### Database Migrations
1. Extend users table (`database/migrations/[timestamp]_add_user_fields.php`):
```php
Schema::table('users', function (Blueprint $table) {
$table->string('user_id', 10)->unique();
$table->enum('role', ['USER', 'MODERATOR', 'ADMIN', 'SUPERUSER'])->default('USER');
$table->boolean('is_banned')->default(false);
$table->text('ban_reason')->nullable();
$table->timestamp('ban_date')->nullable();
$table->string('pending_email')->nullable();
$table->enum('theme_preference', ['light', 'dark'])->default('light');
});
```
2. Create profiles table (`database/migrations/[timestamp]_create_profiles_table.php`):
```php
Schema::create('profiles', function (Blueprint $table) {
$table->id();
$table->string('profile_id', 10)->unique();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->string('display_name', 50)->unique();
$table->string('avatar')->nullable();
$table->string('pronouns', 50)->nullable();
$table->text('bio')->nullable();
// Social media
$table->string('twitter')->nullable();
$table->string('instagram')->nullable();
$table->string('youtube')->nullable();
$table->string('discord', 100)->nullable();
// Stats
$table->integer('coaster_credits')->default(0);
$table->integer('dark_ride_credits')->default(0);
$table->integer('flat_ride_credits')->default(0);
$table->integer('water_ride_credits')->default(0);
$table->timestamps();
});
```
### Model Implementation
1. User Model (`app/Models/User.php`):
- Extend Laravel's base User model
- Add custom attributes
- Add relationship to Profile
- Add role management methods
- Add ban management methods
2. Profile Model (`app/Models/Profile.php`):
- Create new model
- Add relationship to User
- Add avatar handling methods
- Add credit management methods
### Livewire Components
1. ProfileComponent - Handle profile management
2. AvatarUploadComponent - Handle avatar uploads
3. UserSettingsComponent - Handle user settings/preferences
4. UserBanComponent - For moderator use to handle bans
### Services
1. UserService - Business logic for user management
2. ProfileService - Business logic for profile management
3. AvatarService - Handle avatar generation and storage
### Next Steps
1. [ ] Create user fields migration
2. [ ] Create profiles table migration
3. [ ] Enhance User model with new fields and methods
4. [ ] Create Profile model
5. [ ] Implement initial Livewire components for profile management
### Notes
- Will use Laravel's built-in authentication (already scaffolded)
- Email verification will be handled by Laravel's built-in features
- Password reset functionality will use Laravel's default implementation
- Will implement custom avatar generation similar to Django version