Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Locking and Deployment information changes #276

Merged
merged 49 commits into from
Feb 3, 2025
Merged
Changes from 1 commit
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
9fb2c5c
added get user object using github_id in jwt
TurkerKoc Jan 26, 2025
8be6b03
changed get username to get user object
TurkerKoc Jan 26, 2025
9ffdcfc
openapi update
TurkerKoc Jan 26, 2025
6d2b3de
added user avatar to the environment list
TurkerKoc Jan 26, 2025
b6aa222
added user avatar in activity history page
TurkerKoc Jan 26, 2025
f419c82
deployment state tag update
TurkerKoc Jan 26, 2025
fa18c91
Environment list view navigate to locking user github profile
TurkerKoc Jan 26, 2025
54ad1bd
change comment
TurkerKoc Jan 26, 2025
1c5a89e
linter fix
TurkerKoc Jan 26, 2025
18af68e
activity history with user github profile link
TurkerKoc Jan 26, 2025
a833409
changed environment list user check with keycloak
TurkerKoc Jan 26, 2025
c4064fd
fix deployment status tag
TurkerKoc Jan 26, 2025
b0d46f9
generalize time since locked and generalize it with UI updates
TurkerKoc Jan 26, 2025
4a21e92
latest deployment information in environment list
TurkerKoc Jan 27, 2025
7914e4d
last deployment date format changed
TurkerKoc Jan 27, 2025
ec7e57d
added creator of deployment information
TurkerKoc Jan 27, 2025
feddd97
fix deploy button not showed
TurkerKoc Jan 27, 2025
25a0991
showin who triggered last deployment
TurkerKoc Jan 27, 2025
d8065d2
deployment info tag updated
TurkerKoc Jan 28, 2025
8ab5a8b
Merge branch 'main' into feat/locking-deployment-info
TurkerKoc Jan 28, 2025
e959253
removed unecessary unit test for small component
TurkerKoc Jan 28, 2025
4191fc6
last deployment info ui alignment
TurkerKoc Jan 28, 2025
861c9fa
vscode extension recommendations
TurkerKoc Jan 30, 2025
43b4810
Using HeliosDeployment and Deployment entities together for immediate…
TurkerKoc Jan 30, 2025
34ff4e4
github deployment sync bug fix
TurkerKoc Jan 31, 2025
a0e5d92
convert helios deployments to locking user
TurkerKoc Jan 31, 2025
1507a7d
openapi
TurkerKoc Jan 31, 2025
217096b
activity history with immediate latest deployment information
TurkerKoc Jan 31, 2025
6e8a118
openapi
TurkerKoc Jan 31, 2025
cfbc091
Merge branch 'main' into feat/locking-deployment-info
TurkerKoc Feb 1, 2025
b88b4b1
openapi and some comments removed
TurkerKoc Feb 1, 2025
725500f
added migration script
TurkerKoc Feb 2, 2025
55715c8
checkstyle fix
TurkerKoc Feb 2, 2025
818808c
deployment status tag updated and state matching moved to HeliosDeplo…
TurkerKoc Feb 2, 2025
190a711
generalized user avatar component
TurkerKoc Feb 2, 2025
6f6ce5d
workflowrun helios deployment matching bug fix
TurkerKoc Feb 2, 2025
ebc0a87
review fix
TurkerKoc Feb 2, 2025
d6de889
client side clean up
TurkerKoc Feb 2, 2025
e8eff9e
server side review clean up
TurkerKoc Feb 2, 2025
7f60572
server side review clean up and updates
TurkerKoc Feb 2, 2025
c48f944
workflow run helios deployment sync
TurkerKoc Feb 2, 2025
0e63331
latest deployment information changed to createdAt
TurkerKoc Feb 2, 2025
4aa1be3
Merge remote-tracking branch 'origin/main' into feat/locking-deployme…
TurkerKoc Feb 2, 2025
0f27130
do not set user in deployment if already set
TurkerKoc Feb 2, 2025
8b44b98
Merge remote-tracking branch 'origin/main' into feat/locking-deployme…
TurkerKoc Feb 2, 2025
9277949
environment list view ui changes
TurkerKoc Feb 2, 2025
bbb76e4
environment-list view layout
TurkerKoc Feb 3, 2025
c25b510
expanded environment list view ui update
TurkerKoc Feb 3, 2025
a070ec6
comment deleted
TurkerKoc Feb 3, 2025
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
Prev Previous commit
Next Next commit
activity history with immediate latest deployment information
TurkerKoc committed Jan 31, 2025
commit 217096b0af20551a0ddfe685d189545506dcf66e
Original file line number Diff line number Diff line change
@@ -74,43 +74,60 @@
<i-tabler name="git-commit"></i-tabler>
{{ combinedHistory.sha?.slice(0, 7) }}
</li>
<li class="flex align-items-center gap-2 mt-2">
@if (combinedHistory.user?.avatarUrl) {
<p-avatar
class="w-6 h-6"
shape="circle"
size="normal"
[image]="combinedHistory.user?.avatarUrl"
[pTooltip]="keycloakService.isCurrentUser(combinedHistory.user?.login) ? 'You' : combinedHistory.user?.name"
[styleClass]="getAvatarBorderClass(combinedHistory.user?.login || '')"
(click)="openUserProfile(combinedHistory.user?.login || '')"
>
</p-avatar>
} @else {
<i-tabler name="user" class="w-6 h-6 text-gray-600" />
}
<span>{{ combinedHistory.user?.name }}</span>
</li>
</ul>
} @else if (combinedHistory.type === 'LOCK_EVENT') {
<div class="flex gap-1 items-center">
@if (combinedHistory.lockedBy?.avatarUrl) {
@if (combinedHistory.user?.avatarUrl) {
<p-avatar
class="w-6 h-6"
shape="circle"
size="normal"
[image]="combinedHistory.lockedBy?.avatarUrl"
[pTooltip]="keycloakService.isCurrentUser(combinedHistory.lockedBy?.login) ? 'You' : combinedHistory.lockedBy?.name"
[styleClass]="getAvatarBorderClass(combinedHistory.lockedBy?.login || '')"
(click)="openUserProfile(combinedHistory.lockedBy?.login || '')"
[image]="combinedHistory.user?.avatarUrl"
[pTooltip]="keycloakService.isCurrentUser(combinedHistory.user?.login) ? 'You' : combinedHistory.user?.name"
[styleClass]="getAvatarBorderClass(combinedHistory.user?.login || '')"
(click)="openUserProfile(combinedHistory.user?.login || '')"
>
</p-avatar>
} @else {
<i-tabler name="user" class="w-6 h-6 text-gray-600" />
}
</div>
<span>{{ combinedHistory.lockedBy?.name }}</span>
<span>{{ combinedHistory.user?.name }}</span>
} @else if (combinedHistory.type === 'UNLOCK_EVENT') {
<div class="flex gap-1 items-center">
@if (combinedHistory.lockedBy?.avatarUrl) {
@if (combinedHistory.user?.avatarUrl) {
<p-avatar
class="w-6 h-6"
shape="circle"
size="normal"
[image]="combinedHistory.lockedBy?.avatarUrl"
[pTooltip]="keycloakService.isCurrentUser(combinedHistory.lockedBy?.login) ? 'You' : combinedHistory.lockedBy?.name"
[styleClass]="getAvatarBorderClass(combinedHistory.lockedBy?.login || '')"
(click)="openUserProfile(combinedHistory.lockedBy?.login || '')"
[image]="combinedHistory.user?.avatarUrl"
[pTooltip]="keycloakService.isCurrentUser(combinedHistory.user?.login) ? 'You' : combinedHistory.user?.name"
[styleClass]="getAvatarBorderClass(combinedHistory.user?.login || '')"
(click)="openUserProfile(combinedHistory.user?.login || '')"
>
</p-avatar>
} @else {
<i-tabler name="user" class="w-6 h-6 text-gray-600" />
}
</div>
<span>{{ combinedHistory.lockedBy?.name }}</span>
<span>{{ combinedHistory.user?.name }}</span>
}
</div>
</td>
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import de.tum.cit.aet.helios.environment.EnvironmentLockHistory;
import de.tum.cit.aet.helios.gitrepo.RepositoryInfoDto;
import de.tum.cit.aet.helios.user.User;
import de.tum.cit.aet.helios.user.UserInfoDto;
import java.time.OffsetDateTime;

@JsonInclude(JsonInclude.Include.NON_EMPTY)
@@ -14,12 +14,32 @@ public record ActivityHistoryDto(
Deployment.State state,
String sha,
String ref,
User lockedBy,
UserInfoDto user,
OffsetDateTime timestamp,
OffsetDateTime createdAt,
OffsetDateTime updatedAt
) {

OffsetDateTime updatedAt) {

public static ActivityHistoryDto fromLatestDeploymentUnion(
String type, LatestDeploymentUnion union) {
// You could unify HeliosDeployment.Status -> Deployment.State, etc.
return new ActivityHistoryDto(
"DEPLOYMENT", // e.g. "LATEST_DEPLOYMENT"
union.getId(), // union returns the ID (Helios or real)
union.isNone()
? null
: RepositoryInfoDto.fromRepository(
union.isRealDeployment()
? union.getRealDeployment().getRepository()
: union.getHeliosDeployment().getEnvironment().getRepository()),
union.getState(), // mapped state
union.getSha(), // real or helios
union.getRef(), // branchName or real ref
UserInfoDto.fromUser(union.getCreator()),
union.getCreatedAt(), // we’ll consider “timestamp” = createdAt
union.getCreatedAt(),
union.getUpdatedAt());
}

public static ActivityHistoryDto fromDeployment(Deployment deployment) {
return new ActivityHistoryDto(
"DEPLOYMENT",
@@ -28,7 +48,7 @@ public static ActivityHistoryDto fromDeployment(Deployment deployment) {
deployment.getState(),
deployment.getSha(),
deployment.getRef(),
null,
UserInfoDto.fromUser(deployment.getCreator()),
deployment.getCreatedAt(),
deployment.getCreatedAt(),
deployment.getUpdatedAt());
@@ -43,9 +63,9 @@ public static ActivityHistoryDto fromEnvironmentLockHistory(
null,
null,
null,
environmentLockHistory.getLockedBy(),
"UNLOCK_EVENT".equals(type)
? environmentLockHistory.getUnlockedAt()
UserInfoDto.fromUser(environmentLockHistory.getLockedBy()),
"UNLOCK_EVENT".equals(type)
? environmentLockHistory.getUnlockedAt()
: environmentLockHistory.getLockedAt(),
null,
null);
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@
import de.tum.cit.aet.helios.environment.Environment;
import de.tum.cit.aet.helios.environment.EnvironmentLockHistory;
import de.tum.cit.aet.helios.environment.EnvironmentLockHistoryRepository;
import de.tum.cit.aet.helios.environment.EnvironmentRepository;
import de.tum.cit.aet.helios.environment.EnvironmentService;
import de.tum.cit.aet.helios.github.GitHubService;
import de.tum.cit.aet.helios.heliosdeployment.HeliosDeployment;
@@ -41,6 +42,7 @@ public class DeploymentService {
private final PullRequestRepository pullRequestRepository;
private final BranchService branchService;
private final EnvironmentLockHistoryRepository lockHistoryRepository;
private final EnvironmentRepository environmentRepository;

public DeploymentService(
DeploymentRepository deploymentRepository,
@@ -51,7 +53,8 @@ public DeploymentService(
HeliosDeploymentRepository heliosDeploymentRepository,
PullRequestRepository pullRequestRepository,
BranchService branchService,
EnvironmentLockHistoryRepository lockHistoryRepository) {
EnvironmentLockHistoryRepository lockHistoryRepository,
EnvironmentRepository environmentRepository) {
this.deploymentRepository = deploymentRepository;
this.gitHubService = gitHubService;
this.environmentService = environmentService;
@@ -61,6 +64,7 @@ public DeploymentService(
this.pullRequestRepository = pullRequestRepository;
this.branchService = branchService;
this.lockHistoryRepository = lockHistoryRepository;
this.environmentRepository = environmentRepository;
}

public Optional<DeploymentDto> getDeploymentById(Long id) {
@@ -214,26 +218,21 @@ private boolean canRedeploy(Environment environment, long timeoutMinutes) {
}

public List<ActivityHistoryDto> getActivityHistoryByEnvironmentId(Long environmentId) {
// 1) Fetch deployments and map
// 1) Real deployments
List<Deployment> deployments =
deploymentRepository.findByEnvironmentIdOrderByCreatedAtDesc(environmentId);

List<ActivityHistoryDto> deploymentDtos =
deployments.stream().map(ActivityHistoryDto::fromDeployment).toList();

// 2) Fetch lock history and map to one or two items per entry
// 3) Lock history (lock/unlock)
List<EnvironmentLockHistory> lockHistories =
lockHistoryRepository.findLockHistoriesByEnvironment(environmentId);

List<ActivityHistoryDto> lockDtos =
lockHistories.stream()
.flatMap(
lock -> {
// LOCK_EVENT
ActivityHistoryDto lockEvent =
ActivityHistoryDto.fromEnvironmentLockHistory("LOCK_EVENT", lock);

// If unlockedAt is present, also create UNLOCK_EVENT
if (lock.getUnlockedAt() != null) {
ActivityHistoryDto unlockEvent =
ActivityHistoryDto.fromEnvironmentLockHistory("UNLOCK_EVENT", lock);
@@ -244,26 +243,35 @@ public List<ActivityHistoryDto> getActivityHistoryByEnvironmentId(Long environme
})
.toList();

// 3) Combine everything
// 4) Combine the lists
List<ActivityHistoryDto> combined = new ArrayList<>();
combined.addAll(deploymentDtos);
// combined.addAll(heliosDtos);
combined.addAll(lockDtos);

// 4) Sort by 'timestamp' descending
// 4a) Add heliosDeployment if it's the latest
var environment = environmentRepository.findById(environmentId).orElse(null);
if (environment != null) {
LatestDeploymentUnion latestUnion = environmentService.findLatestDeployment(environment);
if (!latestUnion.isNone() && latestUnion.isHeliosDeployment()) {
if (deploymentDtos.isEmpty()
|| latestUnion.getUpdatedAt().isAfter(deploymentDtos.get(0).updatedAt())) {
ActivityHistoryDto latestItem =
ActivityHistoryDto.fromLatestDeploymentUnion("DEPLOYMENT", latestUnion);
combined.add(latestItem);
}
}
}

// 5) Sort by timestamp descending
combined.sort(
(a, b) -> {
OffsetDateTime timeA = a.timestamp();
OffsetDateTime timeB = b.timestamp();
if (timeA == null && timeB == null) {
return 0;
}
if (timeA == null) {
return 1; // place null timestamps last
}
if (timeB == null) {
return -1;
}
return timeB.compareTo(timeA); // descending
if (timeA == null && timeB == null) return 0;
if (timeA == null) return 1;
if (timeB == null) return -1;
return timeB.compareTo(timeA);
});

return combined;
Original file line number Diff line number Diff line change
@@ -88,7 +88,7 @@ private Optional<Deployment> findDeploymentById(Environment environment, Long de
* <p>Returns a small wrapper object with either a real Deployment or a HeliosDeployment. This
* helps unify your "latest" logic into one place.
*/
private LatestDeploymentUnion findLatestDeployment(Environment env) {
public LatestDeploymentUnion findLatestDeployment(Environment env) {
// (A) Check if we have a HeliosDeployment
var maybeHelios = heliosDeploymentRepository.findTopByEnvironmentOrderByCreatedAtDesc(env);
if (maybeHelios.isPresent()) {