Skip to content

Commit

Permalink
fix: request #39728: If a user does not have access at all to a track…
Browse files Browse the repository at this point in the history
…er, it should not be displayed in the backlog.

Change-Id: Idb2f9f0af220ab602769745a7276a5e90118d530
  • Loading branch information
nterray committed Oct 1, 2024
1 parent ceb80c7 commit 16d9efc
Show file tree
Hide file tree
Showing 66 changed files with 350 additions and 393 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ public function process(
return;
}

$planning = $this->planning_factory->getPlanning($requested_planning['planning_id']);
$planning = $this->planning_factory->getPlanning($request->getCurrentUser(), $requested_planning['planning_id']);

if ($redirect->stayInTracker()) {
$this->saveToRequestForFutureRedirection($planning, $last_milestone_artifact, $redirect, $request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public function __construct(
*/
public function getPaginatedBacklogItemsRepresentationsForMilestone(PFUser $user, Planning_Milestone $milestone, ISearchOnStatus $criterion, $limit, $offset)
{
$backlog = $this->backlog_factory->getBacklog($milestone, $limit, $offset);
$backlog = $this->backlog_factory->getBacklog($user, $milestone, $limit, $offset);

return $this->getBacklogItemsRepresentations($user, $milestone, $backlog, $criterion, $limit, $offset);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,11 @@ public function __construct(
/**
* @return array
*/
public function getWarningsRelatedToPlanningConfiguration(Tracker $tracker)
public function getWarningsRelatedToPlanningConfiguration(\PFUser $user, Tracker $tracker)
{
$purifier = Codendi_HTMLPurifier::instance();
$warnings = [];
$planning = $this->planning_factory->getPlanningByPlanningTracker($tracker);
$planning = $this->planning_factory->getPlanningByPlanningTracker($user, $tracker);

if (! $planning) {
$warnings[] = '<li>' . dgettext('tuleap-agiledashboard', 'This tracker is not a planning tracker') . '</li>';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,10 @@ public function __construct(
);
}

public function getDescendantTrackers()
/**
* @return Tracker[]
*/
public function getDescendantTrackers(): array
{
return $this->descendant_trackers;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,11 @@ public function __construct(
$this->planning_factory = $planning_factory;
}

/**
* @return AgileDashboard_Milestone_Backlog_Backlog
*/
public function getBacklog(Planning_Milestone $milestone, $limit = null, $offset = null)
public function getBacklog(PFUser $user, Planning_Milestone $milestone, $limit = null, $offset = null): \AgileDashboard_Milestone_Backlog_Backlog
{
$backlog_trackers_children_can_manage = [];
$first_child_backlog_trackers = $this->getFirstChildBacklogTracker($milestone);
if ($first_child_backlog_trackers) {
$first_child_backlog_trackers = $this->getFirstChildBacklogTracker($user, $milestone);
if ($first_child_backlog_trackers !== null) {
$backlog_trackers_children_can_manage = array_merge($backlog_trackers_children_can_manage, $first_child_backlog_trackers);
} else {
$backlog_trackers_children_can_manage = array_merge($backlog_trackers_children_can_manage, $milestone->getPlanning()->getBacklogTrackers());
Expand Down Expand Up @@ -91,12 +88,15 @@ private function instantiateBacklog(
);
}

private function getFirstChildBacklogTracker(Planning_Milestone $milestone)
/**
* @return Tracker[]|null
*/
private function getFirstChildBacklogTracker(PFUser $user, Planning_Milestone $milestone): ?array
{
$backlog_tracker_children = $milestone->getPlanning()->getPlanningTracker()->getChildren();
if ($backlog_tracker_children) {
$first_child_tracker = current($backlog_tracker_children);
$first_child_planning = $this->planning_factory->getPlanningByPlanningTracker($first_child_tracker);
$first_child_planning = $this->planning_factory->getPlanningByPlanningTracker($user, $first_child_tracker);
if ($first_child_planning) {
return $first_child_planning->getBacklogTrackers();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ private function createCurrentContextSectionWithBacklogTrackers(

return $this->createCurrentContextSectionFromTrackers(
$milestone,
$this->backlog_factory->getBacklog($milestone)->getDescendantTrackers(),
$this->backlog_factory->getBacklog($user, $milestone)->getDescendantTrackers(),
$user,
(string) $milestone->getArtifactTitle(),
$current_context_section,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public function linkToMilestoneParent(Planning_Milestone $milestone, PFUser $use

$parent_milestone_artifact = $parent_milestone->getArtifact();

if (! $this->parentMilestoneHasItemTrackerInItsBacklogTracker($parent_milestone, $artifact_added)) {
if (! $this->parentMilestoneHasItemTrackerInItsBacklogTracker($user, $parent_milestone, $artifact_added)) {
return;
}

Expand All @@ -68,19 +68,20 @@ public function linkToMilestoneParent(Planning_Milestone $milestone, PFUser $use
}
}

private function getBacklogTrackers(Planning_Milestone $milestone)
/**
* @return Tracker[]
*/
private function getBacklogTrackers(PFUser $user, Planning_Milestone $milestone): array
{
return $this->backlog_factory->getBacklog($milestone)->getDescendantTrackers();
return $this->backlog_factory->getBacklog($user, $milestone)->getDescendantTrackers();
}

/**
* @return bool
*/
private function parentMilestoneHasItemTrackerInItsBacklogTracker(
PFUser $user,
Planning_Milestone $parent_milestone,
Artifact $artifact_added,
) {
$backlog_trackers = $this->getBacklogTrackers($parent_milestone);
): bool {
$backlog_trackers = $this->getBacklogTrackers($user, $parent_milestone);

foreach ($backlog_trackers as $backlog_tracker) {
if ($backlog_tracker->getId() === $artifact_added->getTrackerId()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,14 @@ public function __construct(
*
* @return string[]
*/
public function getSelectboxOptions(Tracker $backlog_tracker, $selected_milestone_id, PFUser $user)
public function getSelectboxOptions(Tracker $backlog_tracker, $selected_milestone_id, PFUser $user): array
{
$nearest_planning_tracker = $this->nearest_planning_tracker_provider->getNearestPlanningTracker($backlog_tracker, $this->hierarchy_factory);
if (! $nearest_planning_tracker) {
return [];
}

$planning_trackers_ids = $this->getPlanningTrackersIds($nearest_planning_tracker);
$planning_trackers_ids = $this->getPlanningTrackersIds($user, $nearest_planning_tracker);

return $this->formatAllMilestonesAsSelectboxOptions($planning_trackers_ids, $selected_milestone_id, $backlog_tracker, $user);
}
Expand Down Expand Up @@ -153,9 +153,9 @@ private function addTopBacklogPlanningEntry($selected_milestone_id, Tracker $bac
}

/** @return int[] */
private function getPlanningTrackersIds(Tracker $nearest_planning_tracker)
private function getPlanningTrackersIds(PFUser $user, Tracker $nearest_planning_tracker): array
{
$parents = $this->getParentsWithPlanningAndOrderedFromTopToBottom($nearest_planning_tracker);
$parents = $this->getParentsWithPlanningAndOrderedFromTopToBottom($user, $nearest_planning_tracker);

return array_map(
static function (Tracker $tracker) {
Expand All @@ -166,11 +166,11 @@ static function (Tracker $tracker) {
}

/** @return Tracker[] */
private function keepsTrackersUntilThereIsNoPlanning(array $list_of_trackers)
private function keepsTrackersUntilThereIsNoPlanning(PFUser $user, array $list_of_trackers): array
{
$trackers = [];
foreach ($list_of_trackers as $tracker) {
if (! $this->planning_factory->getPlanningByPlanningTracker($tracker)) {
if (! $this->planning_factory->getPlanningByPlanningTracker($user, $tracker)) {
break;
}
$trackers[] = $tracker;
Expand All @@ -179,10 +179,10 @@ private function keepsTrackersUntilThereIsNoPlanning(array $list_of_trackers)
}

/** @return Tracker[] */
private function getParentsWithPlanningAndOrderedFromTopToBottom(Tracker $nearest_planning_tracker)
private function getParentsWithPlanningAndOrderedFromTopToBottom(PFUser $user, Tracker $nearest_planning_tracker): array
{
$parents = $this->hierarchy_factory->getAllParents($nearest_planning_tracker);
$parents = $this->keepsTrackersUntilThereIsNoPlanning($parents);
$parents = $this->keepsTrackersUntilThereIsNoPlanning($user, $parents);
$parents = array_reverse($parents);
$parents[] = $nearest_planning_tracker;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public function __construct(
public function getMilestoneDetailsPresenter(PFUser $user, Planning_Milestone $milestone)
{
$redirect_parameter = new Planning_MilestoneRedirectParameter();
$backlog = $this->backlog_factory->getBacklog($milestone);
$backlog = $this->backlog_factory->getBacklog($user, $milestone);
$redirect_to_self = $redirect_parameter->getPlanningRedirectToSelf($milestone, DetailsPaneInfo::IDENTIFIER);

$descendant_trackers = $backlog->getDescendantTrackers();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public function __construct(
$this->planning_factory = $planning_factory;
}

public function findFirstSubmilestoneTracker(Planning_Milestone $milestone)
public function findFirstSubmilestoneTracker(PFUser $user, Planning_Milestone $milestone)
{
$tracker_id = $milestone->getTrackerId();
if (is_array($tracker_id)) {
Expand All @@ -59,7 +59,7 @@ public function findFirstSubmilestoneTracker(Planning_Milestone $milestone)
$milestone_backlog_trackers = $milestone->getPlanning()->getBacklogTrackers();
foreach ($milestone_backlog_trackers as $milestone_backlog_tracker) {
foreach ($children as $tracker) {
$planning = $this->planning_factory->getPlanningByPlanningTracker($tracker);
$planning = $this->planning_factory->getPlanningByPlanningTracker($user, $tracker);

if (! $planning) {
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public function build(Artifact $milestone_artifact, PFUser $user, \Project $proj
return Option::nothing(Planning_ArtifactMilestone::class);
}

$planning = $this->planning_factory->getPlanningByPlanningTracker($milestone_artifact->getTracker());
$planning = $this->planning_factory->getPlanningByPlanningTracker($user, $milestone_artifact->getTracker());
if (! $planning) {
return Option::nothing(Planning_ArtifactMilestone::class);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ public function getDetailsPaneInfo(Planning_Milestone $milestone)
return new DetailsPaneInfo($milestone);
}

public function getPlanningV2PaneInfo(Planning_Milestone $milestone)
public function getPlanningV2PaneInfo(PFUser $user, Planning_Milestone $milestone)
{
$submilestone_tracker = $this->submilestone_finder->findFirstSubmilestoneTracker($milestone);
$submilestone_tracker = $this->submilestone_finder->findFirstSubmilestoneTracker($user, $milestone);
if (! $submilestone_tracker) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ private function addPlanningOptionsForRegularMilestone(
PFUser $user,
Option $current_context_section,
): Option {
$tracker = $this->submilestone_finder->findFirstSubmilestoneTracker($milestone);
$tracker = $this->submilestone_finder->findFirstSubmilestoneTracker($user, $milestone);
if (! $tracker || ! $tracker->userCanSubmitArtifact($user)) {
return $current_context_section;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public function getMilestoneRepresentation(
$status_count = $this->milestone_factory->getMilestoneStatusCount($user, $milestone);
}

$backlog_trackers = $this->getBacklogTrackers($milestone);
$backlog_trackers = $this->getBacklogTrackers($user, $milestone);


$pane_info_collector = new \Tuleap\AgileDashboard\Milestone\Pane\PaneInfoCollector(
Expand All @@ -106,7 +106,7 @@ public function getMilestoneRepresentation(
);
$this->event_manager->processEvent($pane_info_collector);

$submilestone_tracker = $this->sub_milestone_finder->findFirstSubmilestoneTracker($milestone);
$submilestone_tracker = $this->sub_milestone_finder->findFirstSubmilestoneTracker($user, $milestone);

$original_project_collector = new OriginalProjectCollector($milestone->getArtifact(), $user);
$this->event_manager->processEvent($original_project_collector);
Expand All @@ -118,7 +118,7 @@ public function getMilestoneRepresentation(
$this->parent_tracker_retriever->getCreatableParentTrackers($milestone, $user, $backlog_trackers),
$this->milestone_factory->userCanChangePrioritiesInMilestone($milestone, $user),
$representation_type,
$this->getSubPlanning($milestone),
$this->getSubPlanning($user, $milestone),
$pane_info_collector,
$submilestone_tracker,
$original_project_collector,
Expand Down Expand Up @@ -163,15 +163,15 @@ public function buildRepresentationsFromCollection(
/**
* @return \Tracker[]
*/
private function getBacklogTrackers(\Planning_Milestone $milestone): array
private function getBacklogTrackers(\PFUser $user, \Planning_Milestone $milestone): array
{
return $this->backlog_factory->getBacklog($milestone)->getDescendantTrackers();
return $this->backlog_factory->getBacklog($user, $milestone)->getDescendantTrackers();
}

private function getSubPlanning(\Planning_Milestone $milestone): ?\Planning
private function getSubPlanning(\PFUser $user, \Planning_Milestone $milestone): ?\Planning
{
$planning = $milestone->getPlanning();

return $this->planning_factory->getChildrenPlanning($planning);
return $this->planning_factory->getChildrenPlanning($user, $planning);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1025,7 +1025,7 @@ protected function postBacklog($id, BacklogItemReference $item)
$item_id = $item->getArtifactId();
$artifact = $this->getBacklogItemAsArtifact($user, $item_id);

$allowed_trackers = $this->backlog_factory->getBacklog($milestone)->getDescendantTrackers();
$allowed_trackers = $this->backlog_factory->getBacklog($user, $milestone)->getDescendantTrackers();
if (! $this->milestone_validator->canBacklogItemBeAddedToMilestone($artifact, $allowed_trackers)) {
throw new RestException(400, "Item of type '" . $artifact->getTracker()->getName() . "' cannot be added.");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ private function validateArtifactsForMilestoneContent(array $ids, Planning_Miles
$backlog = $this->backlog_factory->getSelfBacklog($milestone);

if ($milestone->getParent()) {
$open_unplanned = $this->backlog_item_collection_factory->getUnplannedOpenCollection($user, $milestone->getParent(), $this->backlog_factory->getBacklog($milestone->getParent()), false);
$open_unplanned = $this->backlog_item_collection_factory->getUnplannedOpenCollection($user, $milestone->getParent(), $this->backlog_factory->getBacklog($user, $milestone->getParent()), false);
} else {
$top_milestone = $this->milestone_factory->getVirtualTopMilestone($user, $milestone->getProject());
$backlog_unassigned = $this->backlog_factory->getSelfBacklog($top_milestone);
Expand Down Expand Up @@ -205,7 +205,7 @@ public function validateArtifactIdsAreInUnplannedMilestone(array $ids, Planning_
{
$this->validateIdsAreUnique($ids);

$unplanned = $this->backlog_item_collection_factory->getUnplannedCollection($user, $milestone, $this->backlog_factory->getBacklog($milestone), false);
$unplanned = $this->backlog_item_collection_factory->getUnplannedCollection($user, $milestone, $this->backlog_factory->getBacklog($user, $milestone), false);

foreach ($ids as $id) {
if (! $unplanned->containsId($id)) {
Expand Down Expand Up @@ -238,7 +238,7 @@ public function validateArtifactIdsCanBeAddedToBacklog(array $to_add, Planning_M

$ids_to_add = $this->filterArtifactIdsAlreadyInBacklog($to_add, $milestone, $user);

$indexed_children_backlog_trackers = $this->getIndexedChildrenBacklogTrackers($milestone);
$indexed_children_backlog_trackers = $this->getIndexedChildrenBacklogTrackers($user, $milestone);

foreach ($ids_to_add as $id) {
$artifact = $this->tracker_artifact_factory->getArtifactById($id);
Expand All @@ -262,10 +262,10 @@ private function filterArtifactIdsAlreadyInBacklog(array $ids, Planning_Mileston
return $to_add;
}

private function getIndexedChildrenBacklogTrackers(Planning_Milestone $milestone)
private function getIndexedChildrenBacklogTrackers(PFUser $user, Planning_Milestone $milestone): array
{
$children_backlog_trackers = [];
$children_planning = $this->planning_factory->getChildrenPlanning($milestone->getPlanning());
$children_planning = $this->planning_factory->getChildrenPlanning($user, $milestone->getPlanning());
if ($children_planning) {
foreach ($children_planning->getBacklogTrackersIds() as $id) {
$children_backlog_trackers[$id] = true;
Expand All @@ -289,7 +289,7 @@ private function getMilestoneBacklogItems(PFUser $user, $milestone)
return $this->backlog_item_collection_factory->getUnplannedOpenCollection(
$user,
$milestone,
$this->backlog_factory->getBacklog($milestone),
$this->backlog_factory->getBacklog($user, $milestone),
false
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,13 @@ public function optionsForMilestones($id)
}

/**
* @param int $id
*
* @return Planning
* @throws RestException 403
* @throws RestException 404
*/
private function getPlanning($id)
private function getPlanning(int $id): Planning
{
$planning = PlanningFactory::build()->getPlanning($id);
$user = $this->getCurrentUser();
$planning = PlanningFactory::build()->getPlanning($user, $id);

if (! $planning) {
throw new RestException(404, 'Planning not found');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ private function loadBacklogForMilestoneIfNeeded(PFUser $user, Planning_Mileston

if (! isset($this->backlog_item_ids[$milestone->getArtifactId()])) {
$this->backlog_item_ids[$milestone->getArtifactId() ?? 0] = [];
$backlog = $this->backlog_factory->getBacklog($milestone);
$backlog = $this->backlog_factory->getBacklog($user, $milestone);
$backlog_artifacts = $backlog->getArtifacts($user);

$this->storeBacklogArtifacts($milestone->getArtifactId(), $backlog_artifacts);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ private function linkWithMilestoneArtifact(
$last_ancestor = $source_artifact;
if ($source_artifact) {
foreach ($source_artifact->getAllAncestors($user) as $ancestor) {
$planning = $this->planning_factory->getPlanningByPlanningTracker($ancestor->getTracker());
$planning = $this->planning_factory->getPlanningByPlanningTracker($user, $ancestor->getTracker());
if ($planning && in_array($artifact->getTracker(), $planning->getBacklogTrackers())) {
$ancestor->linkArtifact($artifact->getId(), $user);
$last_ancestor = $ancestor;
Expand Down
Loading

0 comments on commit 16d9efc

Please sign in to comment.