Skip to content

Commit c6a59e2

Browse files
committed
Internal: API: Add endpoints to get user session subscriptions - refs BT#21633
1 parent a0ac5ef commit c6a59e2

File tree

12 files changed

+227
-19
lines changed

12 files changed

+227
-19
lines changed

public/main/admin/user_information.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@
276276
* Show the sessions in which this user is subscribed.
277277
*/
278278
//$sessions = SessionManager::get_sessions_by_user($userId, true);
279-
$sessions = Container::getSessionRepository()->getSessionsByUser($user, api_get_url_entity());
279+
$sessions = Container::getSessionRepository()->getSessionsByUser($user, api_get_url_entity())->getQuery()->getResult();
280280

281281
$personal_course_list = [];
282282
$courseToolInformationTotal = null;

src/CoreBundle/DataProvider/Extension/CCalendarEventExtension.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ private function addSessionConditions(QueryBuilder $qb, User $user, AccessUrl $a
169169
$sessionIdList[] = $session->getId();
170170
}
171171
} else {
172-
$sessions = $this->sessionRepository->getSessionsByUser($user, $accessUrl);
172+
$sessions = $this->sessionRepository->getSessionsByUser($user, $accessUrl)->getQuery()->getResult();
173173

174174
foreach ($sessions as $session) {
175175
foreach ($session->getSessionRelCourseByUser($user) as $sessionRelCourse) {

src/CoreBundle/Entity/AbstractResource.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ abstract class AbstractResource
5555
'session_rel_course:read',
5656
'session_rel_user:read',
5757
'session_rel_course_rel_user:read',
58+
'user_subscriptions:sessions',
5859
])]
5960
public ?string $illustrationUrl = null;
6061

src/CoreBundle/Entity/Course.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
7474
'session_rel_user:read',
7575
'session_rel_course:read',
7676
'track_e_exercise:read',
77+
'user_subscriptions:sessions',
7778
])]
7879
#[ORM\Column(name: 'id', type: 'integer')]
7980
#[ORM\Id]
@@ -92,6 +93,7 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
9293
'session_rel_user:read',
9394
'session_rel_course:read',
9495
'track_e_exercise:read',
96+
'user_subscriptions:sessions',
9597
])]
9698
#[Assert\NotBlank(message: 'A Course requires a title')]
9799
#[ORM\Column(name: 'title', type: 'string', length: 250, unique: false, nullable: true)]

src/CoreBundle/Entity/Session.php

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
use ApiPlatform\Metadata\Delete;
1414
use ApiPlatform\Metadata\Get;
1515
use ApiPlatform\Metadata\GetCollection;
16+
use ApiPlatform\Metadata\Link;
1617
use ApiPlatform\Metadata\Post;
1718
use ApiPlatform\Metadata\Put;
1819
use ApiPlatform\Serializer\Filter\PropertyFilter;
1920
use Chamilo\CoreBundle\Entity\Listener\SessionListener;
2021
use Chamilo\CoreBundle\Repository\SessionRepository;
22+
use Chamilo\CoreBundle\State\UserSessionSubscriptionsStateProvider;
2123
use DateTime;
2224
use Doctrine\Common\Collections\ArrayCollection;
2325
use Doctrine\Common\Collections\Collection;
@@ -39,6 +41,54 @@
3941
),
4042
new Put(security: "is_granted('ROLE_ADMIN')"),
4143
new GetCollection(security: "is_granted('ROLE_ADMIN')"),
44+
new GetCollection(
45+
uriTemplate: '/user/{id}/session_subscriptions/past.{_format}',
46+
uriVariables: [
47+
'id' => new Link(
48+
fromClass: User::class,
49+
),
50+
],
51+
normalizationContext: [
52+
'groups' => [
53+
'user_subscriptions:sessions',
54+
],
55+
],
56+
security: "is_granted('ROLE_USER')",
57+
name: 'user_session_subscriptions_past',
58+
provider: UserSessionSubscriptionsStateProvider::class,
59+
),
60+
new GetCollection(
61+
uriTemplate: '/user/{id}/session_subscriptions/current.{_format}',
62+
uriVariables: [
63+
'id' => new Link(
64+
fromClass: User::class,
65+
),
66+
],
67+
normalizationContext: [
68+
'groups' => [
69+
'user_subscriptions:sessions',
70+
],
71+
],
72+
security: "is_granted('ROLE_USER')",
73+
name: 'user_session_subscriptions_current',
74+
provider: UserSessionSubscriptionsStateProvider::class,
75+
),
76+
new GetCollection(
77+
uriTemplate: '/user/{id}/session_subscriptions/upcoming.{_format}',
78+
uriVariables: [
79+
'id' => new Link(
80+
fromClass: User::class,
81+
),
82+
],
83+
normalizationContext: [
84+
'groups' => [
85+
'user_subscriptions:sessions',
86+
],
87+
],
88+
security: "is_granted('ROLE_USER')",
89+
name: 'user_session_subscriptions_upcoming',
90+
provider: UserSessionSubscriptionsStateProvider::class,
91+
),
4292
new Post(security: "is_granted('ROLE_ADMIN')"),
4393
new Delete(security: "is_granted('DELETE', object)"),
4494
],
@@ -72,6 +122,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable
72122
'session_rel_course_rel_user:read',
73123
'course:read',
74124
'track_e_exercise:read',
125+
'user_subscriptions:sessions',
75126
])]
76127
#[ORM\Column(name: 'id', type: 'integer')]
77128
#[ORM\Id]
@@ -85,6 +136,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable
85136
'session:read',
86137
'session_rel_user:read',
87138
'session_rel_course_rel_user:read',
139+
'user_subscriptions:sessions',
88140
])]
89141
#[ORM\OrderBy(['position' => 'ASC'])]
90142
#[ORM\OneToMany(
@@ -171,6 +223,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable
171223
'course:read',
172224
'track_e_exercise:read',
173225
'calendar_event:read',
226+
'user_subscriptions:sessions',
174227
])]
175228
#[ORM\Column(name: 'title', type: 'string', length: 150)]
176229
protected string $title;
@@ -189,7 +242,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable
189242
#[ORM\Column(name: 'show_description', type: 'boolean', nullable: true)]
190243
protected ?bool $showDescription;
191244

192-
#[Groups(['session:read', 'session:write'])]
245+
#[Groups(['session:read', 'session:write', 'user_subscriptions:sessions'])]
193246
#[ORM\Column(name: 'duration', type: 'integer', nullable: true)]
194247
protected ?int $duration = null;
195248

@@ -221,6 +274,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable
221274
'session:write',
222275
'session_rel_user:read',
223276
'session_rel_course_rel_user:read',
277+
'user_subscriptions:sessions',
224278
])]
225279
#[ORM\Column(name: 'display_start_date', type: 'datetime', unique: false, nullable: true)]
226280
protected ?DateTime $displayStartDate;
@@ -230,6 +284,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable
230284
'session:write',
231285
'session_rel_user:read',
232286
'session_rel_course_rel_user:read',
287+
'user_subscriptions:sessions',
233288
])]
234289
#[ORM\Column(name: 'display_end_date', type: 'datetime', unique: false, nullable: true)]
235290
protected ?DateTime $displayEndDate;
@@ -277,7 +332,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable
277332
#[ORM\Column(name: 'status', type: 'integer', nullable: false)]
278333
protected int $status;
279334

280-
#[Groups(['session:read', 'session:write', 'session_rel_user:read'])]
335+
#[Groups(['session:read', 'session:write', 'session_rel_user:read', 'user_subscriptions:sessions'])]
281336
#[ORM\ManyToOne(targetEntity: SessionCategory::class, inversedBy: 'sessions')]
282337
#[ORM\JoinColumn(name: 'session_category_id', referencedColumnName: 'id')]
283338
protected ?SessionCategory $category = null;
@@ -293,6 +348,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable
293348
/**
294349
* Image illustrating the session (was extra field 'image' in 1.11).
295350
*/
351+
#[Groups(['user_subscriptions:sessions'])]
296352
#[ORM\ManyToOne(targetEntity: Asset::class, cascade: ['remove'])]
297353
#[ORM\JoinColumn(name: 'image_id', referencedColumnName: 'id', onDelete: 'SET NULL')]
298354
protected ?Asset $image = null;
@@ -530,6 +586,9 @@ public function setNbrUsers(int $nbrUsers): self
530586
return $this;
531587
}
532588

589+
/**
590+
* @return Collection<SessionRelCourseRelUser>
591+
*/
533592
public function getAllUsersFromCourse(int $status): Collection
534593
{
535594
$criteria = Criteria::create()->where(Criteria::expr()->eq('status', $status));
@@ -686,6 +745,7 @@ public function getGeneralCoaches(): ReadableCollection
686745
;
687746
}
688747

748+
#[Groups(['user_subscriptions:sessions'])]
689749
public function getGeneralCoachesSubscriptions(): Collection
690750
{
691751
$criteria = Criteria::create()->where(Criteria::expr()->eq('relationType', self::GENERAL_COACH));
@@ -1193,4 +1253,13 @@ protected function compareDates(?DateTime $start, ?DateTime $end = null): bool
11931253

11941254
return !empty($end) && $now <= $end;
11951255
}
1256+
1257+
/**
1258+
* @return Collection<SessionRelCourseRelUser>
1259+
*/
1260+
#[Groups(['user_subscriptions:sessions'])]
1261+
public function getCourseCoachesSubscriptions(): Collection
1262+
{
1263+
return $this->getAllUsersFromCourse(self::COURSE_COACH);
1264+
}
11961265
}

src/CoreBundle/Entity/SessionCategory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class SessionCategory implements Stringable
3636
protected AccessUrl $url;
3737
#[ORM\OneToMany(targetEntity: Session::class, mappedBy: 'category')]
3838
protected Collection $sessions;
39-
#[Groups(['session_category:read', 'session_category:write', 'session:read', 'session_rel_user:read'])]
39+
#[Groups(['session_category:read', 'session_category:write', 'session:read', 'session_rel_user:read', 'user_subscriptions:sessions'])]
4040
#[Assert\NotBlank]
4141
#[ORM\Column(name: 'title', type: 'string', length: 100, nullable: false, unique: false)]
4242
protected string $title;

src/CoreBundle/Entity/SessionRelCourse.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class SessionRelCourse
5151
#[ORM\JoinColumn(name: 'session_id', referencedColumnName: 'id', nullable: false)]
5252
protected ?Session $session = null;
5353

54-
#[Groups(['session_rel_course:read', 'session_rel_course:write', 'session:read'])]
54+
#[Groups(['session_rel_course:read', 'session_rel_course:write', 'session:read', 'user_subscriptions:sessions'])]
5555
#[ORM\ManyToOne(targetEntity: Course::class, cascade: ['persist'], inversedBy: 'sessions')]
5656
#[ORM\JoinColumn(name: 'c_id', referencedColumnName: 'id', nullable: false)]
5757
protected ?Course $course = null;

src/CoreBundle/Entity/SessionRelCourseRelUser.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class SessionRelCourseRelUser
7474
#[Groups([
7575
'session:read',
7676
'session_rel_course_rel_user:read',
77+
'user_subscriptions:sessions',
7778
])]
7879
#[ORM\ManyToOne(targetEntity: UserAlias::class, cascade: ['persist'], inversedBy: 'sessionRelCourseRelUsers')]
7980
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')]
@@ -90,13 +91,14 @@ class SessionRelCourseRelUser
9091
'session:read',
9192
'session_rel_course_rel_user:read',
9293
'session_rel_user:read',
94+
'user_subscriptions:sessions',
9395
])]
9496
#[MaxDepth(1)]
9597
#[ORM\ManyToOne(targetEntity: Course::class, cascade: ['persist'], inversedBy: 'sessionRelCourseRelUsers')]
9698
#[ORM\JoinColumn(name: 'c_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')]
9799
protected Course $course;
98100

99-
#[Groups(['session:item:read'])]
101+
#[Groups(['session:item:read', 'user_subscriptions:sessions'])]
100102
#[ORM\Column(name: 'status', type: 'integer')]
101103
protected int $status;
102104

src/CoreBundle/Entity/SessionRelUser.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,12 @@ class SessionRelUser
7676
protected ?Session $session = null;
7777

7878
#[Assert\NotNull]
79-
#[Groups(['session_rel_user:read', 'session:item:read'])]
79+
#[Groups(['session_rel_user:read', 'session:item:read', 'user_subscriptions:sessions'])]
8080
#[ORM\ManyToOne(targetEntity: User::class, cascade: ['persist'], inversedBy: 'sessionsRelUser')]
8181
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', onDelete: 'CASCADE')]
8282
protected User $user;
8383

84-
#[Groups(['session_rel_user:read', 'session:item:read'])]
84+
#[Groups(['session_rel_user:read', 'session:item:read', 'user_subscriptions:sessions'])]
8585
#[Assert\Choice(callback: [Session::class, 'getRelationTypeList'], message: 'Choose a valid relation type.')]
8686
#[ORM\Column(name: 'relation_type', type: 'integer')]
8787
protected int $relationType;

src/CoreBundle/Entity/User.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ class User implements UserInterface, EquatableInterface, ResourceInterface, Reso
164164
'user_rel_user:read',
165165
'social_post:read',
166166
'track_e_exercise:read',
167+
'user_subscriptions:sessions',
167168
])]
168169
#[ORM\Column(name: 'username', type: 'string', length: 100, unique: true)]
169170
protected string $username;
@@ -173,11 +174,11 @@ class User implements UserInterface, EquatableInterface, ResourceInterface, Reso
173174

174175
#[ApiProperty(iris: ['http://schema.org/name'])]
175176
#[Assert\NotBlank]
176-
#[Groups(['user:read', 'user:write', 'resource_node:read', 'user_json:read', 'track_e_exercise:read', 'user_rel_user:read'])]
177+
#[Groups(['user:read', 'user:write', 'resource_node:read', 'user_json:read', 'track_e_exercise:read', 'user_rel_user:read', 'user_subscriptions:sessions'])]
177178
#[ORM\Column(name: 'firstname', type: 'string', length: 64, nullable: true)]
178179
protected ?string $firstname = null;
179180

180-
#[Groups(['user:read', 'user:write', 'resource_node:read', 'user_json:read', 'track_e_exercise:read', 'user_rel_user:read'])]
181+
#[Groups(['user:read', 'user:write', 'resource_node:read', 'user_json:read', 'track_e_exercise:read', 'user_rel_user:read', 'user_subscriptions:sessions'])]
181182
#[ORM\Column(name: 'lastname', type: 'string', length: 64, nullable: true)]
182183
protected ?string $lastname = null;
183184

@@ -713,6 +714,7 @@ class User implements UserInterface, EquatableInterface, ResourceInterface, Reso
713714
'course:read',
714715
'course_rel_user:read',
715716
'message:read',
717+
'user_subscriptions:sessions',
716718
])]
717719
protected string $fullName;
718720

0 commit comments

Comments
 (0)