Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ QUEUE_DATABASE=
MAIL_DRIVER=sendgrid
SENDGRID_API_KEY='YOUR_SENDGRID_API_KEY'

CORS_ALLOWED_HEADERS=origin, content-type, accept, authorization, x-requested-with
CORS_ALLOWED_METHODS=GET, POST, OPTIONS, PUT, DELETE
CORS_ALLOWED_HEADERS="origin, content-type, accept, authorization, x-requested-with"
CORS_ALLOWED_METHODS="GET, POST, OPTIONS, PUT, DELETE"
CORS_USE_PRE_FLIGHT_CACHING=true
CORS_MAX_AGE=3200
CORS_EXPOSED_HEADERS=
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,4 @@ public/apc.php
.nvmrc
.codegraph
docs/
docker-compose.override.yml
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,110 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) {
);
}

#[OA\Get(
path: '/api/v1/summits/{id}/speakers/all/events/count',
operationId: 'getSpeakersActivitiesCount',
description: 'Get the count of unique activities associated with speakers matching the filter criteria',
tags: ['Summit Speakers'],
security: [['summit_speakers_oauth2' => [
SummitScopes::ReadSummitData,
SummitScopes::ReadAllSummitData
]]],
parameters: [
new OA\Parameter(
name: 'id',
description: 'Summit ID',
in: 'path',
required: true,
schema: new OA\Schema(type: 'integer')
),
new OA\Parameter(
name: 'filter',
description: 'Filter query (supports multiple operators). Filterable fields: id, not_id, first_name, last_name, email, full_name, member_id, member_user_external_id, has_accepted_presentations, has_alternate_presentations, has_rejected_presentations, presentations_track_id, presentations_track_group_id, presentations_selection_plan_id, presentations_type_id, presentations_title, presentations_abstract, presentations_submitter_full_name, presentations_submitter_email, has_media_upload_with_type, has_not_media_upload_with_type.',
in: 'query',
required: false,
schema: new OA\Schema(type: 'string')
),
],
responses: [
new OA\Response(
response: Response::HTTP_OK,
description: 'Unique activities count',
content: new OA\JsonContent(
properties: [new OA\Property(property: 'count', type: 'integer')]
)
),
new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'),
new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'),
]
)]
public function getSpeakersActivitiesCount($summit_id)
{
return $this->processRequest(function () use ($summit_id) {

$summit = SummitFinderStrategyFactory::build($this->getRepository(), $this->getResourceServerContext())->find($summit_id);
if (is_null($summit)) return $this->error404();

$filter = null;

if (Request::has('filter')) {
$filter = FilterParser::parse(Request::input('filter'), [
'id' => ['=='],
'not_id' => ['=='],
'first_name' => ['=@', '@@', '=='],
'last_name' => ['=@', '@@', '=='],
'email' => ['=@', '@@', '=='],
'full_name' => ['=@', '@@', '=='],
'member_id' => ['=='],
'member_user_external_id' => ['=='],
'has_accepted_presentations' => ['=='],
'has_alternate_presentations' => ['=='],
'has_rejected_presentations' => ['=='],
'presentations_track_id' => ['=='],
'presentations_track_group_id' => ['=='],
'presentations_selection_plan_id' => ['=='],
'presentations_type_id' => ['=='],
'presentations_title' => ['=@', '@@', '=='],
'presentations_abstract' => ['=@', '@@', '=='],
'presentations_submitter_full_name' => ['=@', '@@', '=='],
'presentations_submitter_email' => ['=@', '@@', '=='],
'has_media_upload_with_type' => ['=='],
'has_not_media_upload_with_type' => ['=='],
]);
}

if (!is_null($filter)) {
$filter->validate([
'id' => 'sometimes|integer',
'not_id' => 'sometimes|integer',
'first_name' => 'sometimes|string',
'last_name' => 'sometimes|string',
'email' => 'sometimes|string',
'full_name' => 'sometimes|string',
'member_id' => 'sometimes|integer',
'member_user_external_id' => 'sometimes|integer',
'has_accepted_presentations' => 'sometimes|required|string|in:true,false',
'has_alternate_presentations' => 'sometimes|required|string|in:true,false',
'has_rejected_presentations' => 'sometimes|required|string|in:true,false',
'presentations_track_id' => 'sometimes|integer',
'presentations_track_group_id' => 'sometimes|integer',
'presentations_selection_plan_id' => 'sometimes|integer',
'presentations_type_id' => 'sometimes|integer',
'presentations_title' => 'sometimes|string',
'presentations_abstract' => 'sometimes|string',
'presentations_submitter_full_name' => 'sometimes|string',
'presentations_submitter_email' => 'sometimes|string',
'has_media_upload_with_type' => 'sometimes|integer',
'has_not_media_upload_with_type' => 'sometimes|integer',
]);
}

$count = $this->speaker_repository->getUniqueActivitiesCountBySummit($summit, $filter);

return $this->ok(['count' => $count]);
});
}

/**
* @param $summit_id
* @return mixed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -495,4 +495,111 @@ public function send($summit_id)
return $this->ok();
});
}

#[OA\Get(
path: "/api/v1/summits/{id}/submitters/all/events/count",
summary: "Get unique activities count for submitters",
operationId: "getSubmittersActivitiesCount",
tags: ["Summit Submitters"],
security: [['summit_submitters_oauth2' => [
SummitScopes::ReadSummitData,
SummitScopes::ReadAllSummitData,
]]],
parameters: [
new OA\Parameter(
name: "id",
in: "path",
required: true,
description: "Summit ID or slug",
schema: new OA\Schema(type: "string")
),
new OA\Parameter(
name: "filter",
in: "query",
required: false,
description: "Filter query (supports multiple operators). Filterable fields: id, not_id, first_name, last_name, email, full_name, member_id, member_user_external_id, has_accepted_presentations, has_alternate_presentations, has_rejected_presentations, presentations_track_id, presentations_selection_plan_id, presentations_type_id, presentations_title, presentations_abstract, presentations_submitter_full_name, presentations_submitter_email, is_speaker, has_media_upload_with_type, has_not_media_upload_with_type.",
schema: new OA\Schema(type: "string", example: "has_accepted_presentations==true")
),
],
responses: [
new OA\Response(
response: Response::HTTP_OK,
description: "Unique activities count",
content: new OA\JsonContent(
properties: [new OA\Property(property: "count", type: "integer")]
)
),
new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"),
new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"),
new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"),
new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"),
new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"),
]
)]
public function getSubmittersActivitiesCount($summit_id)
{
return $this->processRequest(function () use ($summit_id) {

$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->getResourceServerContext())->find(intval($summit_id));
if (is_null($summit)) return $this->error404();

$filter = null;

if (Request::has('filter')) {
$filter = FilterParser::parse(Request::input('filter'), [
'id' => ['=='],
'not_id' => ['=='],
'first_name' => ['=@', '@@', '=='],
'last_name' => ['=@', '@@', '=='],
'email' => ['=@', '@@', '=='],
'full_name' => ['=@', '@@', '=='],
'member_id' => ['=='],
'member_user_external_id' => ['=='],
'has_accepted_presentations' => ['=='],
'has_alternate_presentations' => ['=='],
'has_rejected_presentations' => ['=='],
'presentations_track_id' => ['=='],
'presentations_selection_plan_id' => ['=='],
'presentations_type_id' => ['=='],
'presentations_title' => ['=@', '@@', '=='],
'presentations_abstract' => ['=@', '@@', '=='],
'presentations_submitter_full_name' => ['=@', '@@', '=='],
'presentations_submitter_email' => ['=@', '@@', '=='],
'is_speaker' => ['=='],
'has_media_upload_with_type' => ['=='],
'has_not_media_upload_with_type' => ['=='],
]);
}

if (!is_null($filter)) {
$filter->validate([
'id' => 'sometimes|integer',
'not_id' => 'sometimes|integer',
'first_name' => 'sometimes|string',
'last_name' => 'sometimes|string',
'email' => 'sometimes|string',
'full_name' => 'sometimes|string',
'member_id' => 'sometimes|integer',
'member_user_external_id' => 'sometimes|integer',
'has_accepted_presentations' => 'sometimes|string|in:true,false',
'has_alternate_presentations' => 'sometimes|string|in:true,false',
'has_rejected_presentations' => 'sometimes|string|in:true,false',
'presentations_track_id' => 'sometimes|integer',
'presentations_selection_plan_id' => 'sometimes|integer',
'presentations_type_id' => 'sometimes|integer',
'presentations_title' => 'sometimes|string',
'presentations_abstract' => 'sometimes|string',
'presentations_submitter_full_name' => 'sometimes|string',
'presentations_submitter_email' => 'sometimes|string',
'is_speaker' => 'sometimes|string|in:true,false',
'has_media_upload_with_type' => 'sometimes|integer',
'has_not_media_upload_with_type' => 'sometimes|integer',
]);
}

$count = $this->repository->getUniqueActivitiesCountBySummit($summit, $filter);

return $this->ok(['count' => $count]);
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ public function handle($request, Closure $next)
}
if (
$token_info->getApplicationType() === 'JS_CLIENT'
&& (is_null($origin) || empty($origin)|| str_contains($token_info->getAllowedOrigins(), $origin) === false )
&& (is_null($origin) || empty($origin)|| str_contains($token_info->getAllowedOrigins(), rtrim($origin, '/')) === false )
) {
Comment thread
mulldug marked this conversation as resolved.
//check origins
throw new OAuth2ResourceServerException(
Expand Down
30 changes: 16 additions & 14 deletions app/ModelSerializers/Summit/SummitSerializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -320,24 +320,26 @@ public function serialize($expand = null, array $fields = [], array $relations =
if (!$has_registration_profile &&
!is_null($build_default_payment_gateway_profile_strategy)
) {

$values['payment_profiles'][] =
SerializerRegistry::getInstance()->getSerializer
(
$build_default_payment_gateway_profile_strategy->build(IPaymentConstants::ApplicationTypeRegistration),
$this->getSerializerType()
)->serialize(AbstractSerializer::filterExpandByPrefix($expand, 'payment_profiles'));

try {
$profile = $build_default_payment_gateway_profile_strategy->build(IPaymentConstants::ApplicationTypeRegistration);
$serializer = SerializerRegistry::getInstance()->getSerializer($profile, $this->getSerializerType());
if (!is_null($serializer))
$values['payment_profiles'][] = $serializer->serialize(AbstractSerializer::filterExpandByPrefix($expand, 'payment_profiles'));
} catch (\Exception $ex) {
Log::warning($ex->getMessage());
}
}

if (!$has_bookable_rooms_profile &&
!is_null($build_default_payment_gateway_profile_strategy)) {
$values['payment_profiles'][] =
SerializerRegistry::getInstance()->getSerializer
(
$build_default_payment_gateway_profile_strategy->build(IPaymentConstants::ApplicationTypeBookableRooms),
$this->getSerializerType()
)->serialize(AbstractSerializer::filterExpandByPrefix($expand, 'payment_profiles'));
try {
$profile = $build_default_payment_gateway_profile_strategy->build(IPaymentConstants::ApplicationTypeBookableRooms);
$serializer = SerializerRegistry::getInstance()->getSerializer($profile, $this->getSerializerType());
if (!is_null($serializer))
$values['payment_profiles'][] = $serializer->serialize(AbstractSerializer::filterExpandByPrefix($expand, 'payment_profiles'));
} catch (\Exception $ex) {
Log::warning($ex->getMessage());
}
}
}

Expand Down
8 changes: 8 additions & 0 deletions app/Models/Foundation/Main/Repositories/IMemberRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,12 @@ public function getSubmittersBySummit(Summit $summit, PagingInfo $paging_info, F
* @throws \Doctrine\DBAL\Exception
*/
public function getSubmittersIdsBySummit(Summit $summit, PagingInfo $paging_info, Filter $filter = null, Order $order = null);

/**
* @param Summit $summit
* @param Filter|null $filter
* @return int
* @throws \Doctrine\DBAL\Exception
*/
public function getUniqueActivitiesCountBySummit(Summit $summit, Filter $filter = null): int;
}
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,12 @@ public function getSpeakersIdsBySummit(Summit $summit, PagingInfo $paging_info,
* @return PagingResponse
*/
public function getAllCompaniesByPage(PagingInfo $paging_info, Filter $filter = null, Order $order = null);

/**
* @param Summit $summit
* @param Filter|null $filter
* @return int
* @throws \Doctrine\DBAL\Exception
*/
public function getUniqueActivitiesCountBySummit(Summit $summit, Filter $filter = null): int;
}
44 changes: 43 additions & 1 deletion app/Repositories/Summit/DoctrineMemberRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ protected function getBaseEntity()
*/
protected function applyExtraJoins(QueryBuilder $query, ?Filter $filter = null, ?Order $order = null): QueryBuilder
{
if($filter->hasFilter("summit_id") || $filter->hasFilter("schedule_event_id")){
if(!is_null($filter) && ($filter->hasFilter("summit_id") || $filter->hasFilter("schedule_event_id"))){
$query
->leftJoin("e.schedule","sch")
->leftJoin("sch.event", "evt")
Expand Down Expand Up @@ -638,6 +638,48 @@ function ($query) {
});
}

/**
* @param Summit $summit
* @param Filter|null $filter
* @return int
* @throws \Doctrine\DBAL\Exception
*/
public function getUniqueActivitiesCountBySummit(Summit $summit, Filter $filter = null): int
{
// Collect distinct member IDs matching the summit + filter using the
// same base query / filter mappings as getSubmittersBySummit.
$qb = $this->getEntityManager()->createQueryBuilder()
->distinct(true)
->select("e.id")
->from($this->getBaseEntity(), "e")
->where("
EXISTS (
SELECT __p.id FROM models\summit\Presentation __p
WHERE __p.created_by = e AND __p.summit = :summit
)")
->setParameter("summit", $summit);

$qb = $this->applyExtraJoins($qb, $filter);

if (!is_null($filter)) {
$filter->apply2Query($qb, $this->getFilterMappings($filter));
}

// Count distinct presentations using the member query as a subquery — no PHP ID materialization.
$countQb = $this->getEntityManager()->createQueryBuilder()
->select("COUNT(DISTINCT p.id)")
->from('models\summit\Presentation', 'p')
->where('p.summit = :summit_outer')
->andWhere("p.created_by IN ({$qb->getDQL()})");

$countQb->setParameter('summit_outer', $summit);
foreach ($qb->getParameters() as $param) {
$countQb->setParameter($param->getName(), $param->getValue(), $param->getType());
}

return intval($countQb->getQuery()->getSingleScalarResult());
}

/**
* @param PagingInfo $paging_info
* @param Filter|null $filter
Expand Down
Loading
Loading