Skip to content

Commit a027d13

Browse files
committed
fix: review feedback
Signed-off-by: romanetar <roman_ag@hotmail.com>
1 parent 4cda54a commit a027d13

4 files changed

Lines changed: 45 additions & 23 deletions

File tree

app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitBadgeScanApiController.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,6 @@ protected function addChild(Summit $summit, array $payload): IEntity
126126
if (is_null($current_member))
127127
throw new HTTP403ForbiddenException();
128128

129-
if (!$current_member->hasSponsorMembershipsFor($summit)) {
130-
throw new HTTP403ForbiddenException('Only sponsor users can add badge scans.');
131-
}
132-
133129
return $this->service->addBadgeScan($summit, $current_member, $payload);
134130
}
135131

app/Models/Foundation/Main/Member.php

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1994,14 +1994,36 @@ public function addSummitRegistrationOrder(SummitOrder $summit_order)
19941994
/**
19951995
* @param Summit $summit
19961996
* @return ArrayCollection
1997+
* @throws Exception
19971998
*/
1998-
public function getSponsorsBySummit(Summit $summit): ArrayCollection
1999+
public function getAllowedSponsorsBySummit(Summit $summit): ArrayCollection
19992000
{
2000-
return new ArrayCollection(
2001-
$this->sponsor_memberships->filter(function ($entity) use ($summit) {
2002-
return $entity->getSummitId() == $summit->getId();
2003-
})->toArray()
2004-
);
2001+
$sql = <<<SQL
2002+
SELECT su.SponsorID
2003+
FROM Sponsor_Users su
2004+
INNER JOIN Sponsor s ON s.ID = su.SponsorID
2005+
WHERE su.MemberID = :member_id
2006+
AND s.SummitID = :summit_id
2007+
AND (
2008+
JSON_CONTAINS(COALESCE(su.Permissions, '[]'), JSON_QUOTE(:slug_sponsors))
2009+
OR JSON_CONTAINS(COALESCE(su.Permissions, '[]'), JSON_QUOTE(:slug_external))
2010+
)
2011+
SQL;
2012+
$ids = $this->prepareRawSQL($sql, [
2013+
'member_id' => $this->getId(),
2014+
'summit_id' => $summit->getId(),
2015+
'slug_sponsors' => IGroup::Sponsors,
2016+
'slug_external' => IGroup::SponsorExternalUsers,
2017+
])->executeQuery()->fetchFirstColumn();
2018+
2019+
if (empty($ids)) {
2020+
return new ArrayCollection();
2021+
}
2022+
2023+
$position = array_flip($ids);
2024+
$sponsors = $this->getEM()->getRepository(Sponsor::class)->findBy(['id' => $ids]);
2025+
usort($sponsors, fn($a, $b) => $position[$a->getId()] <=> $position[$b->getId()]);
2026+
return new ArrayCollection($sponsors);
20052027
}
20062028

20072029
/**

app/Services/Model/Imp/SponsorUserInfoGrantService.php

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -178,24 +178,22 @@ public function addBadgeScan(Summit $summit, Member $current_member, array $data
178178
if(is_null($badge))
179179
throw new EntityNotFoundException("badge not found.");
180180

181-
$member_sponsors = $current_member->getSponsorsBySummit($summit);
181+
$member_sponsors = $current_member->getAllowedSponsorsBySummit($summit);
182182

183-
if($member_sponsors->isEmpty())
184-
throw new ValidationException("Current member does not belong to any sponsor of this summit.");
183+
if ($member_sponsors->isEmpty())
184+
throw new ValidationException("Current member does not have badge scan permissions for any sponsor of this summit.");
185185

186-
if($member_sponsors->count() === 1) {
186+
if ($member_sponsors->count() === 1) {
187187
$sponsor = $member_sponsors->first();
188188
} else {
189-
if(empty($data['sponsor_id']))
189+
if (empty($data['sponsor_id']))
190190
throw new ValidationException("sponsor_id is required when the member belongs to multiple sponsors.");
191-
$sponsor = $current_member->getSponsorBySummitAndId($summit, intval($data['sponsor_id']));
192-
if(is_null($sponsor))
191+
$sponsor_id = intval($data['sponsor_id']);
192+
$sponsor = $member_sponsors->filter(fn($s) => $s->getId() === $sponsor_id)->first();
193+
if ($sponsor === false)
193194
throw new ValidationException("Current member does not belong to the selected summit sponsor.");
194195
}
195196

196-
if(!$current_member->hasSponsorMembershipsFor($summit, $sponsor))
197-
throw new ValidationException("Current member does not have badge scan permissions for the selected sponsor.");
198-
199197
$scan = new SponsorBadgeScan();
200198
$scan->setScanDate($scan_date);
201199
$scan->setQRCode($qr_code);

tests/oauth2/OAuth2SummitBadgeScanApiControllerTest.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public function testAddEncryptedBadgeScan(){
9191
self::$em->flush();
9292

9393
$this->assertTrue($sponsor->hasUser(self::$member));
94-
$this->assertGreaterThan(0, self::$member->getSponsorsBySummit(self::$summit)->count());
94+
$this->assertGreaterThan(0, self::$member->getAllowedSponsorsBySummit(self::$summit)->count());
9595

9696
$badge = $attendee->getFirstTicket()->getBadge();
9797
$badge_qr_code = $badge->generateQRCode();
@@ -371,7 +371,10 @@ public function testAddBadgeScanWithMultipleSponsorsWithoutSponsorId()
371371

372372
self::$em->flush();
373373

374-
$this->assertGreaterThan(1, self::$member->getSponsorsBySummit(self::$summit)->count());
374+
self::$member->addSponsorPermission($sponsor1->getId(), IGroup::Sponsors);
375+
self::$member->addSponsorPermission($sponsor2->getId(), IGroup::Sponsors);
376+
377+
$this->assertGreaterThan(1, self::$member->getAllowedSponsorsBySummit(self::$summit)->count());
375378

376379
$params = [
377380
'id' => self::$summit->getId(),
@@ -416,7 +419,10 @@ public function testAddBadgeScanWithMultipleSponsorsWithSponsorId()
416419

417420
self::$em->flush();
418421

419-
$this->assertGreaterThan(1, self::$member->getSponsorsBySummit(self::$summit)->count());
422+
self::$member->addSponsorPermission($sponsor1->getId(), IGroup::Sponsors);
423+
self::$member->addSponsorPermission($sponsor2->getId(), IGroup::Sponsors);
424+
425+
$this->assertGreaterThan(1, self::$member->getAllowedSponsorsBySummit(self::$summit)->count());
420426

421427
$params = [
422428
'id' => self::$summit->getId(),

0 commit comments

Comments
 (0)