mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-08-08 08:12:17 +01:00
Migrated endpoints from user to member; Renamed membership to member
This commit is contained in:
@@ -5,15 +5,15 @@ declare(strict_types=1);
|
||||
namespace Database\Factories;
|
||||
|
||||
use App\Enums\Role;
|
||||
use App\Models\Membership;
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
/**
|
||||
* @extends Factory<Membership>
|
||||
* @extends Factory<Member>
|
||||
*/
|
||||
class MembershipFactory extends Factory
|
||||
class MemberFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* Define the model's default state.
|
||||
@@ -24,11 +24,20 @@ class MembershipFactory extends Factory
|
||||
{
|
||||
return [
|
||||
'role' => Role::Employee,
|
||||
'organization_id' => OrganizationFactory::class,
|
||||
'user_id' => UserFactory::class,
|
||||
'organization_id' => Organization::factory(),
|
||||
'user_id' => User::factory(),
|
||||
];
|
||||
}
|
||||
|
||||
public function role(Role $role): static
|
||||
{
|
||||
return $this->state(function (array $attributes) use ($role): array {
|
||||
return [
|
||||
'role' => $role->value,
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
public function forOrganization(Organization $organization): static
|
||||
{
|
||||
return $this->state(function (array $attributes) use ($organization): array {
|
||||
@@ -5,10 +5,10 @@ declare(strict_types=1);
|
||||
namespace Database\Factories;
|
||||
|
||||
use App\Models\Client;
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectMember;
|
||||
use App\Models\User;
|
||||
use App\Service\ColorService;
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
@@ -61,12 +61,12 @@ class ProjectFactory extends Factory
|
||||
});
|
||||
}
|
||||
|
||||
public function addMember(User $user, array $attributes = []): self
|
||||
public function addMember(Member $member, array $attributes = []): self
|
||||
{
|
||||
return $this->afterCreating(function (Project $project) use ($user, $attributes): void {
|
||||
return $this->afterCreating(function (Project $project) use ($member, $attributes): void {
|
||||
ProjectMember::factory()
|
||||
->forProject($project)
|
||||
->forUser($user)
|
||||
->forMember($member)
|
||||
->create($attributes);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use App\Models\Member;
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectMember;
|
||||
use App\Models\User;
|
||||
@@ -25,9 +26,13 @@ class ProjectMemberFactory extends Factory
|
||||
'billable_rate' => $this->faker->numberBetween(10, 10000) * 100,
|
||||
'project_id' => Project::factory(),
|
||||
'user_id' => User::factory(),
|
||||
'member_id' => Member::factory(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use forMember instead
|
||||
*/
|
||||
public function forUser(User $user): self
|
||||
{
|
||||
return $this->state(function (array $attributes) use ($user): array {
|
||||
@@ -37,6 +42,16 @@ class ProjectMemberFactory extends Factory
|
||||
});
|
||||
}
|
||||
|
||||
public function forMember(Member $member): self
|
||||
{
|
||||
return $this->state(function (array $attributes) use ($member): array {
|
||||
return [
|
||||
'member_id' => $member->getKey(),
|
||||
'user_id' => $member->user_id, // Legacy
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
public function forProject(Project $project): self
|
||||
{
|
||||
return $this->state(function (array $attributes) use ($project): array {
|
||||
|
||||
@@ -4,6 +4,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Project;
|
||||
use App\Models\Tag;
|
||||
@@ -34,6 +35,7 @@ class TimeEntryFactory extends Factory
|
||||
'billable' => $this->faker->boolean(),
|
||||
'tags' => [],
|
||||
'user_id' => User::factory(),
|
||||
'member_id' => Member::factory(),
|
||||
'task_id' => null,
|
||||
'project_id' => null,
|
||||
'organization_id' => Organization::factory(),
|
||||
@@ -86,6 +88,9 @@ class TimeEntryFactory extends Factory
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use forMember instead
|
||||
*/
|
||||
public function forUser(User $user): self
|
||||
{
|
||||
return $this->state(function (array $attributes) use ($user) {
|
||||
@@ -95,6 +100,17 @@ class TimeEntryFactory extends Factory
|
||||
});
|
||||
}
|
||||
|
||||
public function forMember(Member $member): static
|
||||
{
|
||||
return $this->state(function (array $attributes) use ($member): array {
|
||||
return [
|
||||
'member_id' => $member->getKey(),
|
||||
'user_id' => $member->user_id,
|
||||
'organization_id' => $member->organization_id,
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
public function forOrganization(Organization $organization): self
|
||||
{
|
||||
return $this->state(function (array $attributes) use ($organization) {
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('project_members', function (Blueprint $table): void {
|
||||
$table->foreignUuid('member_id')
|
||||
->nullable()
|
||||
->constrained('organization_user')
|
||||
->cascadeOnDelete()
|
||||
->cascadeOnUpdate();
|
||||
});
|
||||
DB::statement('
|
||||
update project_members
|
||||
set member_id = organization_user.id
|
||||
from projects
|
||||
join organization_user on organization_user.organization_id = projects.organization_id
|
||||
where projects.id = project_members.project_id and project_members.user_id = organization_user.user_id
|
||||
');
|
||||
Schema::table('project_members', function (Blueprint $table): void {
|
||||
$table->uuid('member_id')->nullable(false)->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('project_members', function (Blueprint $table): void {
|
||||
$table->dropForeign(['member_id']);
|
||||
$table->dropColumn('member_id');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
|
||||
Schema::table('time_entries', function (Blueprint $table): void {
|
||||
$table->foreignUuid('member_id')
|
||||
->nullable()
|
||||
->constrained('organization_user')
|
||||
->cascadeOnDelete()
|
||||
->cascadeOnUpdate();
|
||||
});
|
||||
DB::statement('
|
||||
update time_entries
|
||||
set member_id = organization_user.id
|
||||
from organization_user
|
||||
where time_entries.organization_id = organization_user.organization_id and
|
||||
time_entries.user_id = organization_user.user_id
|
||||
');
|
||||
Schema::table('time_entries', function (Blueprint $table): void {
|
||||
$table->uuid('member_id')->nullable(false)->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('time_entries', function (Blueprint $table): void {
|
||||
$table->dropForeign(['member_id']);
|
||||
$table->dropColumn('member_id');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::rename('organization_user', 'members');
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::rename('members', 'organization_user');
|
||||
}
|
||||
};
|
||||
@@ -4,9 +4,9 @@ declare(strict_types=1);
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use App\Enums\Role;
|
||||
use App\Models\Client;
|
||||
use App\Models\Member;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectMember;
|
||||
@@ -25,6 +25,11 @@ class DatabaseSeeder extends Seeder
|
||||
public function run(): void
|
||||
{
|
||||
$this->deleteAll();
|
||||
$userWithMultipleOrganizations = User::factory()->withPersonalOrganization()->create([
|
||||
'name' => 'Mister Overemployed',
|
||||
'email' => 'overemployed@acme.test',
|
||||
]);
|
||||
|
||||
$userAcmeOwner = User::factory()->withPersonalOrganization()->create([
|
||||
'name' => 'Acme Owner',
|
||||
'email' => 'owner@acme.test',
|
||||
@@ -34,7 +39,7 @@ class DatabaseSeeder extends Seeder
|
||||
'personal_team' => false,
|
||||
'currency' => 'EUR',
|
||||
]);
|
||||
$userAcmeManager = User::factory()->withPersonalOrganization()->create([
|
||||
$userRivalManager = User::factory()->withPersonalOrganization()->create([
|
||||
'name' => 'Acme Manager',
|
||||
'email' => 'test@example.com',
|
||||
]);
|
||||
@@ -51,36 +56,28 @@ class DatabaseSeeder extends Seeder
|
||||
'email' => 'old.employee@acme.test',
|
||||
'password' => null,
|
||||
]);
|
||||
$userAcmeOwner->organizations()->attach($organizationAcme, [
|
||||
'role' => Role::Owner->value,
|
||||
]);
|
||||
$userAcmeManager->organizations()->attach($organizationAcme, [
|
||||
'role' => Role::Manager->value,
|
||||
]);
|
||||
$userAcmeAdmin->organizations()->attach($organizationAcme, [
|
||||
'role' => Role::Admin->value,
|
||||
]);
|
||||
$userAcmeEmployee->organizations()->attach($organizationAcme, [
|
||||
'role' => Role::Employee->value,
|
||||
]);
|
||||
$userAcmePlaceholder->organizations()->attach($organizationAcme, [
|
||||
'role' => Role::Placeholder->value,
|
||||
]);
|
||||
$userAcmeOwnerMember = Member::factory()->forUser($userAcmeOwner)->forOrganization($organizationAcme)->role(Role::Owner)->create();
|
||||
$userAcmeManagerMember = Member::factory()->forUser($userRivalManager)->forOrganization($organizationAcme)->role(Role::Manager)->create();
|
||||
$userAcmeAdminMember = Member::factory()->forUser($userAcmeAdmin)->forOrganization($organizationAcme)->role(Role::Admin)->create();
|
||||
$userAcmeEmployeeMember = Member::factory()->forUser($userAcmeEmployee)->forOrganization($organizationAcme)->role(Role::Employee)->create();
|
||||
$userAcmePlaceholderMember = Member::factory()->forUser($userAcmePlaceholder)->forOrganization($organizationAcme)->role(Role::Placeholder)->create();
|
||||
$userWithMultipleOrganizationsAcmeMember = Member::factory()->forUser($userWithMultipleOrganizations)->forOrganization($organizationAcme)->role(Role::Employee)->create();
|
||||
|
||||
$timeEntriesAcmeAdmin = TimeEntry::factory()
|
||||
TimeEntry::factory()
|
||||
->count(10)
|
||||
->forUser($userAcmeAdmin)
|
||||
->forOrganization($organizationAcme)
|
||||
->forMember($userAcmeAdminMember)
|
||||
->create();
|
||||
$timeEntriesAcmePlaceholder = TimeEntry::factory()
|
||||
TimeEntry::factory()
|
||||
->count(10)
|
||||
->forUser($userAcmePlaceholder)
|
||||
->forOrganization($organizationAcme)
|
||||
->forMember($userAcmePlaceholderMember)
|
||||
->create();
|
||||
$timeEntriesAcmePlaceholder = TimeEntry::factory()
|
||||
TimeEntry::factory()
|
||||
->count(10)
|
||||
->forUser($userAcmeEmployee)
|
||||
->forOrganization($organizationAcme)
|
||||
->forMember($userAcmeEmployeeMember)
|
||||
->create();
|
||||
TimeEntry::factory()
|
||||
->count(5)
|
||||
->forMember($userWithMultipleOrganizationsAcmeMember)
|
||||
->create();
|
||||
$client = Client::factory()->forOrganization($organizationAcme)->create([
|
||||
'name' => 'Big Company',
|
||||
@@ -88,6 +85,10 @@ class DatabaseSeeder extends Seeder
|
||||
$bigCompanyProject = Project::factory()->forOrganization($organizationAcme)->forClient($client)->create([
|
||||
'name' => 'Big Company Project',
|
||||
]);
|
||||
ProjectMember::factory()->forProject($bigCompanyProject)->forMember($userAcmeEmployeeMember)->create();
|
||||
ProjectMember::factory()->forProject($bigCompanyProject)->forMember($userAcmeAdminMember)->create();
|
||||
ProjectMember::factory()->forProject($bigCompanyProject)->forMember($userWithMultipleOrganizationsAcmeMember)->create();
|
||||
|
||||
Task::factory()->forOrganization($organizationAcme)->forProject($bigCompanyProject)->create();
|
||||
|
||||
$internalProject = Project::factory()->forOrganization($organizationAcme)->create([
|
||||
@@ -98,21 +99,26 @@ class DatabaseSeeder extends Seeder
|
||||
'name' => 'Other Owner',
|
||||
'email' => 'owner@rival-company.test',
|
||||
]);
|
||||
$organization2 = Organization::factory()->withOwner($organization2Owner)->create([
|
||||
$organizationRival = Organization::factory()->withOwner($organization2Owner)->create([
|
||||
'name' => 'Rival Corp',
|
||||
'personal_team' => true,
|
||||
'currency' => 'USD',
|
||||
]);
|
||||
$userAcmeManager = User::factory()->withPersonalOrganization()->create([
|
||||
$userRivalManager = User::factory()->withPersonalOrganization()->create([
|
||||
'name' => 'Other User',
|
||||
'email' => 'test@rival-company.test',
|
||||
]);
|
||||
$userAcmeManager->organizations()->attach($organization2, [
|
||||
'role' => Role::Admin->value,
|
||||
]);
|
||||
$otherCompanyProject = Project::factory()->forOrganization($organization2)->forClient($client)->create([
|
||||
$userRivalManagerMember = Member::factory()->forUser($userRivalManager)->forOrganization($organizationRival)->role(Role::Admin)->create();
|
||||
$userWithMultipleOrganizationsRivalMember = Member::factory()->forUser($userWithMultipleOrganizations)->forOrganization($organizationRival)->role(Role::Employee)->create();
|
||||
$otherCompanyProject = Project::factory()->forOrganization($organizationRival)->forClient($client)->create([
|
||||
'name' => 'Scale Company',
|
||||
]);
|
||||
ProjectMember::factory()->forProject($otherCompanyProject)->forMember($userRivalManagerMember)->create();
|
||||
ProjectMember::factory()->forProject($otherCompanyProject)->forMember($userWithMultipleOrganizationsRivalMember)->create();
|
||||
TimeEntry::factory()
|
||||
->count(5)
|
||||
->forMember($userWithMultipleOrganizationsRivalMember)
|
||||
->create();
|
||||
|
||||
User::factory()->withPersonalOrganization()->create([
|
||||
'email' => 'admin@example.com',
|
||||
|
||||
Reference in New Issue
Block a user