Skip to content

Commit d83e8ea

Browse files
authored
Merge pull request #15 from RRZE-Webteam/FAU-376
[FAU-376] Include slugs in admission requirements data and allow the use of custom admission requirements
2 parents fc1f347 + 07756cd commit d83e8ea

File tree

6 files changed

+66
-28
lines changed

6 files changed

+66
-28
lines changed

src/Application/AdmissionRequirementTranslated.php

+14-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
* name: string,
1212
* link_text: string,
1313
* link_url: string,
14+
* slug: string
1415
* }
1516
* @psalm-type AdmissionRequirementTranslatedType = AdmissionRequirementTranslated
1617
* & array{parent: AdmissionRequirementTranslated|null}
@@ -20,15 +21,17 @@ final class AdmissionRequirementTranslated
2021
private function __construct(
2122
private Link $current,
2223
private ?AdmissionRequirementTranslated $parent,
24+
private string $slug
2325
) {
2426
}
2527

2628
public static function new(
2729
Link $current,
2830
?AdmissionRequirementTranslated $parent,
31+
string $slug = ''
2932
): self {
3033

31-
return new self($current, $parent);
34+
return new self($current, $parent, $slug);
3235
}
3336

3437
public static function fromAdmissionRequirement(
@@ -41,6 +44,7 @@ public static function fromAdmissionRequirement(
4144
$admissionRequirement->parent()
4245
? self::fromAdmissionRequirement($admissionRequirement->parent(), $languageCode)
4346
: null,
47+
$admissionRequirement->slug()
4448
);
4549
}
4650

@@ -57,10 +61,12 @@ public static function fromArray(array $data): self
5761

5862
/** @var AdmissionRequirementTranslatedType|null $parentData */
5963
$parentData = $data[AdmissionRequirement::PARENT];
64+
$slug = $data[AdmissionRequirement::SLUG] ?? '';
6065

6166
return new self(
6267
Link::fromArray($currentData),
63-
$parentData ? self::fromArray($parentData) : null
68+
$parentData ? self::fromArray($parentData) : null,
69+
$slug
6470
);
6571
}
6672

@@ -73,6 +79,7 @@ public function asArray(): array
7379
$parentData = $this->parent?->asArray();
7480
$currentData = $this->current->asArray();
7581
$currentData[AdmissionRequirement::PARENT] = $parentData;
82+
$currentData[AdmissionRequirement::SLUG] = $this->slug;
7683

7784
return $currentData;
7885
}
@@ -82,6 +89,11 @@ public function name(): string
8289
return $this->current->name();
8390
}
8491

92+
public function slug(): string
93+
{
94+
return $this->slug;
95+
}
96+
8597
public function linkText(): string
8698
{
8799
return $this->current->linkText();

src/Application/Filter/AdmissionRequirementTypeFilter.php

+4-17
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,18 @@
44

55
namespace Fau\DegreeProgram\Common\Application\Filter;
66

7-
/**
8-
* @psalm-type AdmissionRequirementType = 'frei' | 'eingeschraenkt' | 'frei-mit-einschraenkung'
9-
*/
107
final class AdmissionRequirementTypeFilter implements Filter
118
{
129
public const FREE = 'frei';
13-
public const FREE_WITH_RESTRICTION = 'frei-mit-einschraenkung';
1410
public const RESTRICTED = 'eingeschraenkt';
1511

1612
public const KEY = 'admission-requirement';
1713

1814
/**
19-
* @var array<AdmissionRequirementType>
15+
* @var array<string>
2016
*/
2117
private array $types;
2218

23-
/**
24-
* @psalm-param AdmissionRequirementType $types
25-
*/
2619
private function __construct(
2720
string ...$types
2821
) {
@@ -35,9 +28,6 @@ public function id(): string
3528
return self::KEY;
3629
}
3730

38-
/**
39-
* @psalm-return array<AdmissionRequirementType>
40-
*/
4131
public function value(): array
4232
{
4333
return array_unique($this->types);
@@ -56,7 +46,7 @@ public static function empty(): static
5646
}
5747

5848
/**
59-
* @psalm-return ?array<AdmissionRequirementType>
49+
* @return array<string>|null
6050
*/
6151
private static function sanitize(mixed $value): ?array
6252
{
@@ -68,12 +58,9 @@ private static function sanitize(mixed $value): ?array
6858
return null;
6959
}
7060

71-
/** @psalm-var array<AdmissionRequirementType> $value */
72-
$value = array_filter(
61+
return array_filter(
7362
$value,
74-
static fn ($item) => in_array($item, [self::FREE, self::FREE_WITH_RESTRICTION, self::RESTRICTED], true),
63+
'is_string',
7564
);
76-
77-
return $value;
7865
}
7966
}

src/Domain/AdmissionRequirement.php

+31-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* name: MultilingualStringType,
1313
* link_text: MultilingualStringType,
1414
* link_url: MultilingualStringType,
15+
* slug: string
1516
* }
1617
*
1718
* @psalm-type AdmissionRequirementType = AdmissionRequirement & array{
@@ -22,6 +23,7 @@ final class AdmissionRequirement
2223
{
2324
public const ID = 'id';
2425
public const NAME = 'name';
26+
public const SLUG = 'slug';
2527
public const LINK_TEXT = 'link_text';
2628
public const LINK_URL = 'link_url';
2729

@@ -33,6 +35,7 @@ final class AdmissionRequirement
3335
'required' => [
3436
AdmissionRequirement::ID,
3537
AdmissionRequirement::NAME,
38+
AdmissionRequirement::SLUG,
3639
AdmissionRequirement::LINK_TEXT,
3740
AdmissionRequirement::LINK_URL,
3841
AdmissionRequirement::PARENT,
@@ -43,6 +46,10 @@ final class AdmissionRequirement
4346
'minLength' => 1,
4447
],
4548
AdmissionRequirement::NAME => MultilingualString::SCHEMA,
49+
AdmissionRequirement::SLUG => [
50+
'type' => 'string',
51+
'minLength' => 1,
52+
],
4653
AdmissionRequirement::LINK_TEXT => MultilingualString::SCHEMA,
4754
AdmissionRequirement::LINK_URL => MultilingualString::SCHEMA,
4855
AdmissionRequirement::PARENT => [
@@ -51,13 +58,18 @@ final class AdmissionRequirement
5158
'required' => [
5259
AdmissionRequirement::ID,
5360
AdmissionRequirement::NAME,
61+
AdmissionRequirement::SLUG,
5462
],
5563
'properties' => [
5664
AdmissionRequirement::ID => [
5765
'type' => 'string',
5866
'minLength' => 1,
5967
],
6068
AdmissionRequirement::NAME => MultilingualString::SCHEMA,
69+
AdmissionRequirement::SLUG => [
70+
'type' => 'string',
71+
'minLength' => 1,
72+
],
6173
],
6274
],
6375
],
@@ -69,6 +81,7 @@ final class AdmissionRequirement
6981
'required' => [
7082
AdmissionRequirement::ID,
7183
AdmissionRequirement::NAME,
84+
AdmissionRequirement::SLUG,
7285
AdmissionRequirement::LINK_TEXT,
7386
AdmissionRequirement::LINK_URL,
7487
],
@@ -78,6 +91,10 @@ final class AdmissionRequirement
7891
'maxLength' => 0,
7992
],
8093
AdmissionRequirement::NAME => MultilingualString::SCHEMA,
94+
AdmissionRequirement::SLUG => [
95+
'type' => 'string',
96+
'maxLength' => 0,
97+
],
8198
AdmissionRequirement::LINK_TEXT => MultilingualString::SCHEMA,
8299
AdmissionRequirement::LINK_URL => MultilingualString::SCHEMA,
83100
AdmissionRequirement::PARENT => [
@@ -89,22 +106,25 @@ final class AdmissionRequirement
89106
private function __construct(
90107
private MultilingualLink $current,
91108
private ?AdmissionRequirement $parent,
109+
private string $slug
92110
) {
93111
}
94112

95113
public static function new(
96114
MultilingualLink $current,
97115
?AdmissionRequirement $parent,
116+
string $slug = ''
98117
): self {
99118

100-
return new self($current, $parent);
119+
return new self($current, $parent, $slug);
101120
}
102121

103122
public static function empty(): self
104123
{
105124
return new self(
106125
MultilingualLink::empty(),
107-
null
126+
null,
127+
''
108128
);
109129
}
110130

@@ -122,10 +142,12 @@ public static function fromArray(array $data): self
122142

123143
/** @var AdmissionRequirementType|null $parentData */
124144
$parentData = $data[self::PARENT] ?? null;
145+
$slug = $data[self::SLUG] ?? '';
125146

126147
return new self(
127148
MultilingualLink::fromArray($currentData),
128-
$parentData ? self::fromArray($parentData) : null
149+
$parentData ? self::fromArray($parentData) : null,
150+
$slug
129151
);
130152
}
131153

@@ -138,6 +160,7 @@ public function asArray(): array
138160
$parentData = $this->parent?->asArray();
139161
$currentData = $this->current->asArray();
140162
$currentData[self::PARENT] = $parentData;
163+
$currentData[self::SLUG] = $this->slug;
141164

142165
return $currentData;
143166
}
@@ -152,6 +175,11 @@ public function name(): MultilingualString
152175
return $this->current->name();
153176
}
154177

178+
public function slug(): string
179+
{
180+
return $this->slug;
181+
}
182+
155183
public function linkText(): MultilingualString
156184
{
157185
return $this->current->linkText();

src/Infrastructure/Repository/WordPressDatabaseDegreeProgramRepository.php

+1
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ private function admissionRequirement(?WP_Term $term): AdmissionRequirement
307307
return AdmissionRequirement::new(
308308
$this->bilingualLinkFromTerm($term),
309309
$parent instanceof WP_Term ? $this->admissionRequirement($parent) : null,
310+
$term->slug
310311
);
311312
}
312313

tests/resources/fixtures/degree_program.json

+12-6
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,10 @@
262262
"de": "",
263263
"en": ""
264264
},
265-
"parent": null
266-
}
265+
"parent": null,
266+
"slug": "frei"
267+
},
268+
"slug": "admission_bachelor"
267269
},
268270
"teaching_degree_higher_semester": {
269271
"id": "term:24",
@@ -299,8 +301,10 @@
299301
"de": "",
300302
"en": ""
301303
},
302-
"parent": null
303-
}
304+
"parent": null,
305+
"slug": "frei"
306+
},
307+
"slug": "admission_higher_semester"
304308
},
305309
"master": {
306310
"id": "term:19",
@@ -336,8 +340,10 @@
336340
"de": "",
337341
"en": ""
338342
},
339-
"parent": null
340-
}
343+
"parent": null,
344+
"slug": "nich_frei"
345+
},
346+
"slug": "admission_master"
341347
}
342348
},
343349
"content_related_master_requirements": {

tests/unit/Domain/AdmissionRequirementsTest.php

+4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public function testFromArray(): void
3030
'en' => 'Link URL Bachelor EN',
3131
],
3232
'parent' => null,
33+
'slug' => 'name_bachelor',
3334
],
3435
'teaching_degree_higher_semester' => [
3536
'id' => 'term:6',
@@ -66,7 +67,9 @@ public function testFromArray(): void
6667
'en' => '',
6768
],
6869
'parent' => null,
70+
'slug' => 'frei',
6971
],
72+
'slug' => 'name_higher_semester',
7073
],
7174
'master' => [
7275
'id' => 'term:7',
@@ -86,6 +89,7 @@ public function testFromArray(): void
8689
'en' => 'Link URL Master EN',
8790
],
8891
'parent' => null,
92+
'slug' => 'name_master',
8993
],
9094
];
9195

0 commit comments

Comments
 (0)