Skip to content

Commit 1b9c7d9

Browse files
committed
rename hashId to publicId
1 parent ba926a7 commit 1b9c7d9

9 files changed

Lines changed: 58 additions & 61 deletions

File tree

app/Data/UserData.php

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88

99
use Spatie\LaravelData\Data;
1010
use Spatie\LaravelData\Attributes\MapName;
11-
use Spatie\LaravelData\Attributes\MapInputName;
12-
use Spatie\LaravelData\Attributes\MapOutputName;
1311
use Spatie\LaravelData\Attributes\Validation\Max;
14-
use Spatie\LaravelData\Attributes\Validation\Rule;
1512

1613
use App\Enums\UserLevel;
1714
use App\Enums\UserStatus;
@@ -24,7 +21,7 @@ abstract class UserData extends Data
2421
- we don't use Optional as it brings unnecessary complexity (e.g. it "infects" validation rules with a hard-to-shake `sometimes`, which overrides `required`)
2522
- instead we use nullable (which is not inferred as `sometimes`)
2623
*/
27-
abstract public string|null $hashId { get; }
24+
abstract public string|null $publicId { get; }
2825

2926
abstract public UserLevel|null $userLevel { get; }
3027

@@ -38,20 +35,17 @@ abstract class UserData extends Data
3835
abstract public DateTimeImmutable|null $updatedAt { get; }
3936

4037
public function __construct(
41-
string|null $hashId,
38+
string|null $publicId,
4239

43-
#[MapInputName('displayname')]
44-
#[MapOutputName('displayname')]
40+
#[MapName('displayname')]
4541
#[Max(400)]
4642
readonly public string $displayName,
4743

48-
#[MapInputName('username')]
49-
#[MapOutputName('username')]
44+
#[MapName('username')]
5045
#[Max(400)]
5146
readonly public string $userName,
5247

53-
#[MapInputName('realname')]
54-
#[MapOutputName('realname')]
48+
#[MapName('realname')]
5549
#[Max(400)]
5650
readonly public string $realName,
5751

@@ -69,7 +63,7 @@ public function __construct(
6963
DateTimeImmutable|null $updatedAt,
7064
) {
7165
// abstract are unpromotable, need to be set up sans sugar
72-
$this->hashId = $hashId;
66+
$this->publicId = $publicId;
7367
$this->email = $email;
7468
$this->userLevel = $userLevel;
7569
$this->aboutMe = $aboutMe;

app/Data/UserModelData.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ class UserModelData extends UserData
2020
// need to repeat abstract, including types, but types can be a subset
2121
// (see also NonInvariantPropertyType in psalm.xml)
2222
// all abstracts non-Optional in Model
23-
#[MapName('hash_id')]
24-
public readonly string $hashId;
23+
24+
// different Input vs Ouput, see `created` below
25+
#[MapInputName('hash_id')]
26+
#[MapOutputName('public_id')]
27+
public readonly string $publicId;
2528

2629
// N.b. true nullable (not only to signal optional)
2730
public readonly string|null $email;

app/Data/UserStoreData.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ class UserStoreData extends UserData
2020
// we can only block it, via 'missing' validation.
2121
// It can't be subset to null only, either.
2222
#[Rule('missing')]
23-
#[MapInputName('hash_id')]
24-
public readonly string|null $hashId;
23+
#[MapInputName('public_id')]
24+
public readonly string|null $publicId;
2525

2626
#[Email]
2727
public readonly string|null $email;

app/Data/UserUpdateData.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
class UserUpdateData extends UserData
1616
{
1717
#[Rule('missing')]
18-
#[MapInputName('hash_id')]
19-
public readonly string|null $hashId;
18+
#[MapInputName('public_id')]
19+
public readonly string|null $publicId;
2020

2121
#[Email]
2222
public readonly string $email;

app/Http/Controllers/UserController.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,24 @@ public function index(): DataCollection
3434
return $this->listUsersUseCase->execute();
3535
}
3636

37-
// TODO? hash_id is nullable in DB
38-
public function show(string $hashId): UserModelData
37+
// TODO? public_id is nullable in DB
38+
public function show(string $publicId): UserModelData
3939
{
40-
return $this->showUserUseCase->execute($hashId);
40+
return $this->showUserUseCase->execute($publicId);
4141
}
4242

4343
public function store(UserStoreData $userStoreData): UserModelData
4444
{
4545
return $this->createUserUseCase->execute($userStoreData);
4646
}
4747

48-
public function update(string $hashId, UserUpdateData $userUpdateData): UserModelData
48+
public function update(string $publicId, UserUpdateData $userUpdateData): UserModelData
4949
{
50-
return $this->updateUserUseCase->execute($hashId, $userUpdateData);
50+
return $this->updateUserUseCase->execute($publicId, $userUpdateData);
5151
}
5252

53-
public function destroy(string $hashId): void
53+
public function destroy(string $publicId): void
5454
{
55-
$this->deleteUserUseCase->execute($hashId);
55+
$this->deleteUserUseCase->execute($publicId);
5656
}
5757
}

app/UseCases/User/DeleteUserUseCase.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88

99
class DeleteUserUseCase
1010
{
11-
public function execute(string $hashId): void
11+
public function execute(string $publicId): void
1212
{
13-
LegacyUser::where('hash_id', $hashId)->firstOrFail()->deleteOrFail();
13+
LegacyUser::where('hash_id', $publicId)->firstOrFail()->deleteOrFail();
1414

1515
// TODO functionality from legacy model User->deleteUser, including but not limited to:
1616
// - remove user's delegations

app/UseCases/User/ShowUserUseCase.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99

1010
class ShowUserUseCase
1111
{
12-
public function execute(string $hashId): UserModelData
12+
public function execute(string $publicId): UserModelData
1313
{
14-
$legacyUser = LegacyUser::where('hash_id', $hashId)->firstOrFail();
14+
$legacyUser = LegacyUser::where('hash_id', $publicId)->firstOrFail();
1515
return UserModelData::from($legacyUser);
1616
}
1717
}

tests/Feature/CrudUserTest.php

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ public function test_create()
4949
$newUserDecoded = $result->decodeResponseJson();
5050
$this->assertIsString($newUserDecoded['created_at']);
5151
$this->assertNotFalse(DateTimeImmutable::createFromFormat(DATE_ATOM, $newUserDecoded['created_at']));
52-
$newUserHashId = $newUserDecoded['hash_id'];
53-
$this->assertMatchesRegularExpression('/^[A-Za-z0-9]{32}$/', $newUserHashId);
54-
return $newUserHashId;
52+
$newUserPublicId = $newUserDecoded['public_id'];
53+
$this->assertMatchesRegularExpression('/^[A-Za-z0-9]{32}$/', $newUserPublicId);
54+
return $newUserPublicId;
5555
}
5656

5757
public function test_create_optional()
@@ -62,42 +62,42 @@ public function test_create_optional()
6262
)
6363
->assertCreated()
6464
->assertJson(self::USER_DATA_UPDATE);
65-
$newUserHashId = $result->decodeResponseJson()['hash_id'];
66-
$this->assertMatchesRegularExpression('/^[A-Za-z0-9]{32}$/', $newUserHashId);
67-
return $newUserHashId;
65+
$newUserPublicId = $result->decodeResponseJson()['public_id'];
66+
$this->assertMatchesRegularExpression('/^[A-Za-z0-9]{32}$/', $newUserPublicId);
67+
return $newUserPublicId;
6868
}
6969

7070
#[Depends('test_create')]
71-
public function test_show($newUserHashId)
71+
public function test_show($newUserPublicId)
7272
{
73-
$this->getJson('/api/v2/users/'.$newUserHashId)
73+
$this->getJson('/api/v2/users/'.$newUserPublicId)
7474
->assertOk()
7575
->assertJsonMissingPath('id')
7676
->assertJson(self::NEW_USER_DATA);
7777
}
7878

7979
#[Depends('test_create_optional')]
80-
public function test_show_optional($newUserHashId)
80+
public function test_show_optional($newUserPublicId)
8181
{
82-
$this->getJson('/api/v2/users/'.$newUserHashId)
82+
$this->getJson('/api/v2/users/'.$newUserPublicId)
8383
->assertOk()
8484
->assertJson([...self::NEW_USER_DATA, ...self::USER_DATA_UPDATE]);
8585
}
8686

8787
#[Depends('test_create')]
8888
#[Depends('test_create_optional')]
89-
public function test_index($newUserHashId1, $newUserHashId2)
89+
public function test_index($newUserPublicId1, $newUserPublicId2)
9090
{
9191
$allUsers = $this->getJson('/api/v2/users/')
9292
->assertOk()->json();
9393

94-
$allUserHashIds = array_column($allUsers, 'hash_id');
95-
$this->assertContains($newUserHashId1, $allUserHashIds);
96-
$this->assertContains($newUserHashId2, $allUserHashIds);
94+
$allUserPublicIds = array_column($allUsers, 'public_id');
95+
$this->assertContains($newUserPublicId1, $allUserPublicIds);
96+
$this->assertContains($newUserPublicId2, $allUserPublicIds);
9797
}
9898

9999
#[Depends('test_create')]
100-
public function test_update($newUserHashId)
100+
public function test_update($newUserPublicId)
101101
{
102102
$changedUserData = [
103103
...self::NEW_USER_DATA,
@@ -106,7 +106,7 @@ public function test_update($newUserHashId)
106106
];
107107

108108
$result = $this->putJson(
109-
'/api/v2/users/'.$newUserHashId,
109+
'/api/v2/users/'.$newUserPublicId,
110110
$changedUserData,
111111
)
112112
->assertOk()
@@ -120,10 +120,10 @@ public function test_update($newUserHashId)
120120
}
121121

122122
#[Depends('test_create')]
123-
public function test_update_required($newUserHashId)
123+
public function test_update_required($newUserPublicId)
124124
{
125125
$result = $this->putJson(
126-
'/api/v2/users/'.$newUserHashId,
126+
'/api/v2/users/'.$newUserPublicId,
127127
self::NEW_USER_DATA
128128
);
129129
$result
@@ -132,7 +132,7 @@ public function test_update_required($newUserHashId)
132132
}
133133

134134
#[Depends('test_create')]
135-
public function test_update_validation($newUserHashId)
135+
public function test_update_validation($newUserPublicId)
136136
{
137137
$changedUserData = [
138138
...self::NEW_USER_DATA,
@@ -141,7 +141,7 @@ public function test_update_validation($newUserHashId)
141141
...['userlevel' => 1000],
142142
];
143143
$this->putJson(
144-
'/api/v2/users/'.$newUserHashId,
144+
'/api/v2/users/'.$newUserPublicId,
145145
$changedUserData,
146146
)
147147
->assertInvalid(['email', 'userlevel'])
@@ -150,11 +150,11 @@ public function test_update_validation($newUserHashId)
150150

151151
#[Depends('test_create')]
152152
#[Depends('test_create_optional')]
153-
public function test_delete($newUserHashId1, $newUserHashId2)
153+
public function test_delete($newUserPublicId1, $newUserPublicId2)
154154
{
155-
$this->deleteJson('/api/v2/users/'.$newUserHashId1, [])
155+
$this->deleteJson('/api/v2/users/'.$newUserPublicId1, [])
156156
->assertOk();
157-
$this->deleteJson('/api/v2/users/'.$newUserHashId2, [])
157+
$this->deleteJson('/api/v2/users/'.$newUserPublicId2, [])
158158
->assertOk();
159159
}
160160

@@ -164,9 +164,9 @@ public function test_create_validation()
164164
['created_at' => '2001-01-23T12:34:56Z'],
165165
['created_at' => 'nondate'],
166166
['created_at' => ''],
167-
// created, last_update, hash_id musst be *missing* from request
168-
['hash_id' => ''],
169-
['hash_id' => null],
167+
// created, last_update, public_id musst be *missing* from request
168+
['public_id' => ''],
169+
['public_id' => null],
170170
['updated_at' => ''],
171171
['username' => null],
172172
['username' => ''],
@@ -184,10 +184,10 @@ public function test_create_validation()
184184
}
185185

186186
#[Depends('test_create')]
187-
public function test_patch_disallowed($newUserHashId)
187+
public function test_patch_disallowed($newUserPublicId)
188188
{
189189
// need an existing user, PATCH to /api/v2/users/foo will 404 before 405ing
190-
$this->patchJson('/api/v2/users/'.$newUserHashId, [])
190+
$this->patchJson('/api/v2/users/'.$newUserPublicId, [])
191191
->assertMethodNotAllowed();
192192
}
193193

tests/Unit/UserDataTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ public function test_it_has_proper_store_validation_rules(): void
5858
$this->assertNotContains('sometimes', $rules['created_at']);
5959
$this->assertContains('missing', $rules['updated_at']);
6060
$this->assertNotContains('sometimes', $rules['updated_at']);
61-
$this->assertContains('missing', $rules['hash_id']);
62-
$this->assertNotContains('sometimes', $rules['hash_id']);
61+
$this->assertContains('missing', $rules['public_id']);
62+
$this->assertNotContains('sometimes', $rules['public_id']);
6363
$this->assertTrue(array_any(
6464
$rules['userlevel'],
6565
fn ($r) => $r instanceof \Illuminate\Validation\Rules\Enum
@@ -75,8 +75,8 @@ public function test_it_has_proper_update_validation_rules(): void
7575
$this->assertNotContains('sometimes', $rules['created_at']);
7676
$this->assertContains('missing', $rules['updated_at']);
7777
$this->assertNotContains('sometimes', $rules['updated_at']);
78-
$this->assertContains('missing', $rules['hash_id']);
79-
$this->assertNotContains('sometimes', $rules['hash_id']);
78+
$this->assertContains('missing', $rules['public_id']);
79+
$this->assertNotContains('sometimes', $rules['public_id']);
8080
$this->assertTrue(array_any(
8181
$rules['userlevel'],
8282
fn ($r) => $r instanceof \Illuminate\Validation\Rules\Enum

0 commit comments

Comments
 (0)