Skip to content

Commit daefd9c

Browse files
authored
Feature/reserve identifier with new issue url (#118)
Closes #99, closes #62, closes #53, closes #104, closes #55, closes #101, closes #125 This PR is a massive one, but needed as most of the functionality is based upon each other, although there are a number of features addressed here. Features that come with this PR: - Reserving identifiers with a GitHub New Issue URL Link - Linking manually created GtiHub Issue to the Certificate Identifier in OJS Submission - Update the information in the GitHub Issue (on metadata form save) - Delete concept of Venue Type & Venue Name as Labels (instead all labels in one central Dropdown) - Labels are cached / saved in the OJS DB (and only fetched from the API, when they are older than 6 hours) - Connection to the GitHub Register Issue is shown in the CODECHECK Form Sidebar panel - - - ❗ I want to include a setting in the settings form for a feature which is only introduced with this PR here (#101).
2 parents d35fa2f + 0c4ec5f commit daefd9c

34 files changed

Lines changed: 1977 additions & 709 deletions

.github/workflows/tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ jobs:
244244

245245
- name: Configure Apache for OJS
246246
run: |
247-
sudo add-apt-repository --remove ppa:ondrej/php -y || true
247+
sudo add-apt-repository ppa:ondrej/php -y
248248
sudo apt-get update
249249
sudo apt-get install -y apache2 libapache2-mod-php8.2
250250
sudo a2enmod rewrite php8.2 alias

CodecheckPlugin.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use APP\plugins\generic\codecheck\controllers\page\CodecheckPageHandler;
2222
use APP\plugins\generic\codecheck\classes\CodecheckRoles\CodecheckRoleArray;
2323
use APP\plugins\generic\codecheck\classes\CodecheckRoles\CodecheckRoleManager;
24+
use APP\core\Request;
2425

2526
class CodecheckPlugin extends GenericPlugin
2627
{
@@ -408,11 +409,13 @@ public function manage($args, $request): JSONMessage
408409

409410
public function setEnabled($enabled, $contextId = null)
410411
{
412+
CodecheckLogger::debug("Plugin Enabled!");
411413
$result = parent::setEnabled($enabled, $contextId);
412414

413415
if ($enabled) {
414-
$this->migration = new CodecheckSchemaMigration();
415-
$this->migration->up();
416+
$migration = new CodecheckSchemaMigration();
417+
$migration->up();
418+
$migration->issueLabelsUp();
416419
}
417420

418421
return $result;
@@ -423,6 +426,8 @@ public function resetSchema(): void
423426
$this->migration = new CodecheckSchemaMigration();
424427
$this->migration->down();
425428
$this->migration->up();
429+
$this->migration->issueLabelsDown();
430+
$this->migration->issueLabelsUp();
426431
}
427432
}
428433

api/v1/CodecheckApiHandler.php

Lines changed: 415 additions & 89 deletions
Large diffs are not rendered by default.

classes/CodecheckRegister/CertificateIdentifierList.php

Lines changed: 96 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,23 @@
44

55
use APP\plugins\generic\codecheck\classes\Exceptions\ApiFetchException;
66
use APP\plugins\generic\codecheck\classes\Exceptions\NoMatchingIssuesFoundException;
7-
use APP\plugins\generic\codecheck\classes\DataStructures\UniqueArray;
7+
use APP\plugins\generic\codecheck\classes\DataStructures\UniqueIdentifierArray;
88
use APP\plugins\generic\codecheck\classes\CodecheckRegister\CodecheckGithubRegisterApiClient;
99
use APP\plugins\generic\codecheck\classes\CodecheckRegister\CertificateIdentifier;
1010
use APP\plugins\generic\codecheck\classes\Log\CodecheckLogger;
1111

1212
class CertificateIdentifierList
1313
{
14-
private UniqueArray $uniqueArray;
14+
private UniqueIdentifierArray $uniqueIdentifierArray;
1515

1616
/**
17-
* This initializes a new Certificate Identifier List with a new `UniqueArray`
17+
* This initializes a new Certificate Identifier List with a new `uniqueIdentifierArray`
1818
*
1919
* @return void
2020
*/
2121
function __construct()
2222
{
23-
$this->uniqueArray = new UniqueArray();
23+
$this->uniqueIdentifierArray = new UniqueIdentifierArray();
2424
}
2525

2626
/**
@@ -30,22 +30,60 @@ function __construct()
3030
* @return CertificateIdentifierList Returns a new List containing all fetched Certificate Identifiers from GitHub
3131
*/
3232
static function fromApi(
33-
CodecheckGithubRegisterApiClient $codecheckGithubRegisterApiClient
33+
CodecheckGithubRegisterApiClient $codecheckGithubRegisterApiClient,
34+
?bool $onlyNewestIdentifiers
3435
): CertificateIdentifierList {
3536
$newCertificateIdentifierList = new CertificateIdentifierList();
3637

3738
// fetch API
3839
try {
39-
$codecheckGithubRegisterApiClient->fetchIssues();
40-
} catch (ApiFetchException $ae) {
41-
CodecheckLogger::error($ae->getMessage());
42-
throw $ae;
43-
} catch (NoMatchingIssuesFoundException $me) {
44-
CodecheckLogger::error($me->getMessage());
45-
throw $me;
40+
if($onlyNewestIdentifiers == true) {
41+
$codecheckGithubRegisterApiClient->fetchNewestIssues();
42+
} else {
43+
$codecheckGithubRegisterApiClient->fetchAllIssues();
44+
}
45+
} catch (\Throwable $e) {
46+
CodecheckLogger::error($e->getCode() . ": " . $e->getMessage());
47+
throw $e;
4648
}
4749

48-
foreach ($codecheckGithubRegisterApiClient->getIssues() as $issue) {
50+
return CertificateIdentifierList::createNewCertificateIdentifierList(
51+
$codecheckGithubRegisterApiClient->getIssues(),
52+
$newCertificateIdentifierList
53+
);
54+
}
55+
56+
/**
57+
* Factory Method to create a new CertificateIdentifierList from a GitHub API fetch
58+
*
59+
* @param CodecheckGithubRegisterApiClient $codecheckGithubRegisterApiClient The APIParser for the GitHub Issues
60+
* @return CertificateIdentifierList Returns a new List containing all fetched Certificate Identifiers from GitHub
61+
*/
62+
static function fromApiWithIdentifier(
63+
CodecheckGithubRegisterApiClient $codecheckGithubRegisterApiClient,
64+
CertificateIdentifier $certificateIdentifier
65+
): CertificateIdentifierList {
66+
$newCertificateIdentifierList = new CertificateIdentifierList();
67+
68+
// fetch API
69+
try {
70+
$codecheckGithubRegisterApiClient->fetchIssueByIdentifier($certificateIdentifier);
71+
} catch (\Throwable $e) {
72+
CodecheckLogger::error($e->getCode() . ": " . $e->getMessage());
73+
throw $e;
74+
}
75+
76+
return CertificateIdentifierList::createNewCertificateIdentifierList(
77+
$codecheckGithubRegisterApiClient->getIssues(),
78+
$newCertificateIdentifierList
79+
);
80+
}
81+
82+
private static function createNewCertificateIdentifierList(
83+
array $issues,
84+
CertificateIdentifierList $newCertificateIdentifierList
85+
): CertificateIdentifierList {
86+
foreach ($issues as $issue) {
4987
// raw identifier (can still have ranges of identifiers);
5088
$rawIdentifier = CertificateIdentifierList::getRawIdentifier($issue['title']);
5189

@@ -56,7 +94,7 @@ static function fromApi(
5694
}
5795

5896
// append to all identifiers in new Register
59-
$newCertificateIdentifierList->appendToCertificateIdList($rawIdentifier);
97+
$newCertificateIdentifierList->appendToCertificateIdList($rawIdentifier, $issue);
6098
}
6199

62100
// return the new Register
@@ -98,10 +136,11 @@ public static function getRawIdentifier(string $title): ?string
98136
/**
99137
* Appends a raw Identifier to the list of Certificate Identifiers
100138
*
101-
* @param string $rawidentifier The raw Identifier to be appended
139+
* @param string $rawIdentifier The raw Identifier to be appended
140+
* @param array $issue The GitHub Issue information of the raw Identifier to be appended
102141
* @return void
103142
*/
104-
public function appendToCertificateIdList(string $rawIdentifier): void
143+
public function appendToCertificateIdList(string $rawIdentifier, array $issue): void
105144
{
106145
// list of certificate identifiers in range
107146
$idRange = [];
@@ -111,42 +150,46 @@ public function appendToCertificateIdList(string $rawIdentifier): void
111150
// split into "fromIdStr" and "toIdStr"
112151
list($fromIdStr, $toIdStr) = explode('/', $rawIdentifier);
113152

114-
$from_identifier = CertificateIdentifier::fromStr($fromIdStr);
115-
$to_identifier = CertificateIdentifier::fromStr($toIdStr);
153+
$fromIdentifier = CertificateIdentifier::fromStr($fromIdStr);
154+
$toIdentifier = CertificateIdentifier::fromStr($toIdStr);
116155

117156
// append to $idRange list
118-
for ($id_count = $from_identifier->getNumber(); $id_count <= $to_identifier->getNumber(); $id_count++) {
119-
$new_identifier = new CertificateIdentifier($from_identifier->getYear(), $id_count);
157+
for ($id_count = $fromIdentifier->getNumber(); $id_count <= $toIdentifier->getNumber(); $id_count++) {
158+
$newIdentifier = new CertificateIdentifier($fromIdentifier->getYear(), $id_count);
120159
// append new identifier
121-
$idRange[] = $new_identifier;
160+
$idRange[] = [
161+
'identifier' => $newIdentifier,
162+
'issueUrl' => $issue['html_url'],
163+
'issueNumber' => $issue['number']
164+
];
122165
}
123166
}
124167
// if it isn't a list then just append on identifier
125168
else {
126-
$new_identifier = CertificateIdentifier::fromStr($rawIdentifier);
127-
$idRange[] = $new_identifier;
169+
$newIdentifier = CertificateIdentifier::fromStr($rawIdentifier);
170+
$idRange[] = [
171+
'identifier' => $newIdentifier,
172+
'issueUrl' => $issue['html_url'],
173+
'issueNumber' => $issue['number']
174+
];
128175
}
129176

130177
// append to all certificate identifiers
131-
foreach ($idRange as $identifier) {
132-
if (!$this->uniqueArray->contains($identifier)) {
133-
$this->uniqueArray->add($identifier);
134-
}
135-
}
178+
$this->uniqueIdentifierArray->addArray($idRange);
136179
}
137180

138181
/**
139182
* Sorts the Certificate Identifier List ascending
140183
*/
141184
public function sortAsc(): void
142185
{
143-
$this->uniqueArray->sort(function($a, $b) {
186+
$this->uniqueIdentifierArray->sort(function($a, $b) {
144187
// First, compare year
145-
if ($a->getYear() !== $b->getYear()) {
146-
return $a->getYear() <=> $b->getYear();
188+
if ($a['identifier']->getYear() !== $b['identifier']->getYear()) {
189+
return $a['identifier']->getYear() <=> $b['identifier']->getYear();
147190
}
148191
// If years are equal, compare ID
149-
return $a->getNumber() <=> $b->getNumber();
192+
return $a['identifier']->getNumber() <=> $b['identifier']->getNumber();
150193
});
151194
}
152195

@@ -155,13 +198,13 @@ public function sortAsc(): void
155198
*/
156199
public function sortDesc(): void
157200
{
158-
$this->uniqueArray->sort(function($a, $b) {
201+
$this->uniqueIdentifierArray->sort(function($a, $b) {
159202
// First, compare year descending
160-
if ($a->getYear() !== $b->getYear()) {
161-
return $b->getYear() <=> $a->getYear();
203+
if ($a['identifier']->getYear() !== $b['identifier']->getYear()) {
204+
return $b['identifier']->getYear() <=> $a['identifier']->getYear();
162205
}
163206
// If years are equal, compare ID descending
164-
return $b->getNumber() <=> $a->getNumber();
207+
return $b['identifier']->getNumber() <=> $a['identifier']->getNumber();
165208
});
166209
}
167210

@@ -172,7 +215,7 @@ public function sortDesc(): void
172215
*/
173216
public function getNumberOfIdentifiers(): int
174217
{
175-
return $this->uniqueArray->count();
218+
return $this->uniqueIdentifierArray->count();
176219
}
177220

178221
/**
@@ -184,7 +227,7 @@ public function getNewestIdentifier(): CertificateIdentifier
184227
{
185228
$this->sortDesc();
186229
// get first element of sort descending -> newest element
187-
return $this->uniqueArray->at(0);
230+
return $this->uniqueIdentifierArray->at(0)['identifier'];
188231
}
189232

190233
/**
@@ -194,10 +237,21 @@ public function getNewestIdentifier(): CertificateIdentifier
194237
*/
195238
public function toStr(): string
196239
{
197-
$return_str = "Certificate Identifiers:\n";
198-
foreach ($this->uniqueArray->toArray() as $identifier) {
199-
$return_str .= $identifier->toStr() . "\n";
240+
$returnStr = "Certificate Identifiers:\n";
241+
foreach ($this->uniqueIdentifierArray->toArray() as $identifierInformation) {
242+
$returnStr .= $identifierInformation['identifier']->toStr() . "\n";
200243
}
201-
return $return_str;
244+
return $returnStr;
245+
}
246+
247+
public function getIssueInformationByIdentifier(CertificateIdentifier $identifier): ?array
248+
{
249+
foreach ($this->uniqueIdentifierArray->toArray() as $identifierInformation) {
250+
if($identifierInformation['identifier']->toStr() == $identifier->toStr()){
251+
return $identifierInformation;
252+
}
253+
}
254+
255+
return null;
202256
}
203257
}

0 commit comments

Comments
 (0)