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

Aligment POC Lias #886

Open
wants to merge 119 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
06c5751
Finish backend implementation
lkleisa Feb 12, 2024
c883425
Finish frontend implementation
lkleisa Feb 12, 2024
6d1849d
Delete alignment on kr or ob delete
lkleisa Feb 12, 2024
4d34225
Write objectivecontroller tests
lkleisa Feb 12, 2024
0f182e2
Write ObjectiveAuthorizationService tests
lkleisa Feb 12, 2024
521683f
Write AlignmentBusinessService tests
lkleisa Feb 12, 2024
fd8a393
Write AlignmentPersistenceService tests
lkleisa Feb 12, 2024
9b6a407
Fix AlignmentPersistenceService tests
lkleisa Feb 12, 2024
d81858e
Fix frontend model error
lkleisa Feb 12, 2024
105a7d6
Write AlignmentValidationService tests
lkleisa Feb 15, 2024
5d719c9
Write test for objective form component
lkleisa Feb 15, 2024
ff20d04
Fix backend test
lkleisa Feb 15, 2024
48ce741
Fix backend tests
lkleisa Feb 15, 2024
fde9d6d
Write e2e tests
lkleisa Feb 15, 2024
ade8cf9
Fix e2e tests
lkleisa Feb 15, 2024
8a8b455
Adjust dropdown width
lkleisa Feb 15, 2024
fd9b767
Add null check for possibility length
lkleisa Feb 28, 2024
4b9666a
Fix frontend test
lkleisa Feb 28, 2024
676cce1
Fix e2e test
lkleisa Feb 28, 2024
86ae655
Remove alignment when objective quarter change
lkleisa Mar 14, 2024
65c044b
Add missing quarter in testdata and fix bug when editing alignment mu…
lkleisa Apr 25, 2024
22edb78
Add Kein Alignment for removing existing alignment
lkleisa Apr 25, 2024
62f80b1
Fix backend tests
lkleisa Apr 25, 2024
52d8110
Fix e2e tests because of new quarter
lkleisa Apr 25, 2024
fce32ca
Implement typeahead
lkleisa Apr 29, 2024
3d85282
Sort alignment possibilities alphabetically
lkleisa May 23, 2024
d692086
Use bold font for optgroup label
lkleisa May 24, 2024
6d4d977
Implement correct filter method for typeahead
lkleisa May 24, 2024
6a6365e
Fix bug with wrong quarter without queryParams
lkleisa May 24, 2024
306acd2
Add scrollLeft on input leave and adjust padding
lkleisa May 24, 2024
6fbc035
Remove unused files
lkleisa May 24, 2024
726d612
Write backend tests
lkleisa May 27, 2024
b022020
Clean up frontend
lkleisa May 27, 2024
7751a06
Adjust frontend tests
lkleisa May 27, 2024
1bb84df
Adjust e2e tests
lkleisa May 27, 2024
63eab27
Fix frontend tests
lkleisa May 29, 2024
33e7b76
Adjust filter function
lkleisa May 30, 2024
1114772
Fix bug with duplicated alignment possibilities
lkleisa Jun 3, 2024
268738e
Simplify backend function
lkleisa Jun 3, 2024
87596bc
Add check for alignment in same team
lkleisa Jun 3, 2024
ad341b0
Fix sonar code smells
lkleisa Jun 6, 2024
2ab2cdc
Clean up code
lkleisa Jun 6, 2024
c563856
Remove AlignmentSelection
lkleisa Jun 7, 2024
50cb7be
Refactor code
lkleisa Jun 12, 2024
ccc6c12
[FM] Automated formating frontend
actions-user Jun 12, 2024
2198b5d
Remove bug with duplicated alignment possibilities
lkleisa Jun 13, 2024
8f95dd1
Use object for alignedEntity
lkleisa Jun 13, 2024
798b9ff
Rename alignmentObjects
lkleisa Jun 13, 2024
8bedc87
Add new migration with AlignmentView
lkleisa Apr 4, 2024
5d6282d
Add new model AlignmentView
lkleisa Apr 4, 2024
6347fa9
Add Repository and PersistenceService for AlignmentView
lkleisa Apr 4, 2024
44eaaa5
Add validateOnAlignmentGet Method in AlignmentValidationService
lkleisa Apr 4, 2024
681b433
Use validation in AlignmentBusinessService
lkleisa Apr 4, 2024
89625d3
Filter AlignmentViews which are not matching filter
lkleisa Apr 4, 2024
7525a2e
Add alignment data for local development
lkleisa Apr 4, 2024
6d04917
Add new DTOs to return compact data
lkleisa Apr 4, 2024
b2b674d
Add equals and hashCode for AlignmentView
lkleisa Apr 4, 2024
ef19004
Add alignment_view to db schema for testing
lkleisa Apr 4, 2024
fb338d5
Implement function for getting Alignments by filters
lkleisa Apr 5, 2024
ee52cf1
Add cytoscape.js and @types/cytoscape
lkleisa Apr 5, 2024
41828d5
Implement tab-switch
lkleisa Apr 5, 2024
08c9670
Adjust uniqueId on AlignmentView for full uniqueness
lkleisa Apr 5, 2024
5cc5ad4
Add AlignmentService in and get alignment data from filters
lkleisa Apr 5, 2024
e3e9b2e
Load alignment data on filter change
lkleisa Apr 5, 2024
cc1684c
Add new DiagramComponent and draw draft diagram with real data
lkleisa Apr 5, 2024
7945785
Split up method in AlignmentBusinessService and adjust uniqueId for f…
lkleisa Apr 5, 2024
10f74cc
Remove unused check in wrongAlignments filter
lkleisa Apr 5, 2024
2bb79e4
Add check for right counterpart
lkleisa Apr 8, 2024
fdc5d24
Add SVG Styling for Diagram Nodes
lkleisa Apr 8, 2024
fb7a329
Add user information when no alignments
lkleisa Apr 8, 2024
89510dd
Add diagram click handler
lkleisa Apr 8, 2024
91e704f
Add missing quarter and move testdata to current quarter
lkleisa Apr 9, 2024
8cb5d7e
Fix bug when no KeyResult in AlignmentData
lkleisa Apr 9, 2024
4ed68f9
Write unit test for AlignmentBusinessService
lkleisa Apr 9, 2024
ee13bc4
Write unit test for AlignmentValidationService
lkleisa Apr 9, 2024
0e86972
Write integration tests for AlignmentBusinessService
lkleisa Apr 9, 2024
0ef9040
Adjust foreign key in testdata
lkleisa Apr 9, 2024
2319f15
Write integration tests for AlignmentViewPersistenceService
lkleisa Apr 9, 2024
d977bfc
Fix failing backend tests
lkleisa Apr 9, 2024
38717c1
Add current quarter id to url on application launch
lkleisa Apr 9, 2024
303e700
Fix frontend e2e tests
lkleisa Apr 9, 2024
0074278
Fix frontend unit tests for quarter-filter
lkleisa Apr 10, 2024
0779055
Add frontend e2e tests for diagram
lkleisa Apr 10, 2024
ca19980
Rename function for replacing non ascii characters
lkleisa Apr 10, 2024
c2d3310
Write unit tests for DiagramComponent
lkleisa Apr 10, 2024
b11c892
Add validation check for final AlignmentViewList on same amout of sou…
lkleisa Apr 10, 2024
f98d83a
Write unit tests for new validation check
lkleisa Apr 10, 2024
df61df5
Add translation for new backend error ALIGNMENT_DATA_FAIL
lkleisa Apr 10, 2024
ac18530
Add unit tests for AlignmentService
lkleisa Apr 11, 2024
2879b33
Adjust height of commit icon in node
lkleisa Apr 11, 2024
dd789f3
Escape html tags in object title
lkleisa Apr 12, 2024
b78be09
Return empty list when empty teamfilter is set
lkleisa Apr 22, 2024
ccd34b3
Do not reload diagram when closing dialog with cancel
lkleisa Apr 22, 2024
af679ca
Do not change data when click already active diagram tab
lkleisa Apr 22, 2024
7e94b3b
Fix backend unit tests and e2e tests
lkleisa Apr 24, 2024
d135b88
Remove reload of diagram when closing dialog
lkleisa Apr 24, 2024
8902ae6
[FM] Automated formating frontend
actions-user Apr 29, 2024
a72f2c0
Use current quarter for alignments when no quarterFilter is set
lkleisa Apr 29, 2024
b6bfdd8
Rename diagramm to network and k to kr
lkleisa May 6, 2024
9fe9e7d
Add wheel sensitivity for diagram
lkleisa May 6, 2024
99f7696
Keep diagram on tab switch alive
lkleisa May 23, 2024
eeca673
Remove icon on kr bubble
lkleisa May 23, 2024
9fb6cb8
Adjust quarter fk in newquarterdata
lkleisa May 23, 2024
52f67f2
Adjust testdata after rebase
lkleisa May 30, 2024
4f91761
Adjust testdata after rebase
lkleisa May 31, 2024
534105e
Change KR state on checkin edit
lkleisa May 31, 2024
a702edf
Use another method to convert svg
lkleisa Jun 3, 2024
1b7baba
Fix failing tests
lkleisa Jun 3, 2024
5c91e5e
[FM] Automated formating backend
actions-user Jun 3, 2024
8436030
Add hyphens to svg bubble on word break
lkleisa Jun 5, 2024
21bbd76
Clean up code
lkleisa Jun 5, 2024
5fc5d36
Fix sonar code smells
lkleisa Jun 6, 2024
73a17d5
Refactor code
lkleisa Jun 6, 2024
1a35974
Adjust height of diagram
lkleisa Jun 6, 2024
d4cba31
[FM] Automated formating backend
actions-user Jun 13, 2024
3de5fda
Rename variable
lkleisa Jun 13, 2024
89de0e4
Refactor frontend code
Jun 14, 2024
6b9a56b
Use second refresh subject
lkleisa Jun 19, 2024
bec586c
add newer quarters to testdata and change CSP to allow image blobs
nevio18324 Nov 21, 2024
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
3 changes: 3 additions & 0 deletions backend/src/main/java/ch/puzzle/okr/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@ private Constants() {
public static final String KEY_RESULT_TYPE_METRIC = "metric";
public static final String KEY_RESULT_TYPE_ORDINAL = "ordinal";
public static final String OBJECTIVE = "Objective";
public static final String OBJECTIVE_LOWERCASE = "objective";
public static final String STATE_DRAFT = "Draft";
public static final String KEY_RESULT = "KeyResult";
public static final String CHECK_IN = "Check-in";
public static final String ACTION = "Action";
public static final String ALIGNMENT = "Alignment";
public static final String ALIGNMENT_VIEW = "AlignmentView";
public static final String ALIGNED_OBJECTIVE_ID = "alignedObjectiveId";
public static final String COMPLETED = "Completed";
public static final String ORGANISATION = "Organisation";
public static final String QUARTER = "Quarter";
Expand Down
2 changes: 1 addition & 1 deletion backend/src/main/java/ch/puzzle/okr/ErrorKey.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ public enum ErrorKey {
ATTRIBUTE_NULL, ATTRIBUTE_CHANGED, ATTRIBUTE_SET_FORBIDDEN, ATTRIBUTE_NOT_SET, ATTRIBUTE_CANNOT_CHANGE,
ATTRIBUTE_MUST_BE_DRAFT, KEY_RESULT_CONVERSION, ALREADY_EXISTS_SAME_NAME, CONVERT_TOKEN, DATA_HAS_BEEN_UPDATED,
MODEL_NULL, MODEL_WITH_ID_NOT_FOUND, NOT_AUTHORIZED_TO_READ, NOT_AUTHORIZED_TO_WRITE, NOT_AUTHORIZED_TO_DELETE,
TOKEN_NULL
TOKEN_NULL, NOT_LINK_YOURSELF, NOT_LINK_IN_SAME_TEAM, ALIGNMENT_ALREADY_EXISTS, ALIGNMENT_DATA_FAIL
}
5 changes: 3 additions & 2 deletions backend/src/main/java/ch/puzzle/okr/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ private HttpSecurity setHeaders(HttpSecurity http) throws Exception {
+ "script-src 'self' 'unsafe-inline';" + " style-src 'self' 'unsafe-inline';"
+ " object-src 'none';" + " base-uri 'self';"
+ " connect-src 'self' https://sso.puzzle.ch http://localhost:8544;"
+ " font-src 'self';" + " frame-src 'self';" + " img-src 'self' data: ;"
+ " manifest-src 'self';" + " media-src 'self';" + " worker-src 'none';"))
+ " font-src 'self';" + " frame-src 'self';"
+ " img-src 'self' data: blob:;" + " manifest-src 'self';"
+ " media-src 'self';" + " worker-src 'none';"))
.crossOriginEmbedderPolicy(coepCustomizer -> coepCustomizer
.policy(CrossOriginEmbedderPolicyHeaderWriter.CrossOriginEmbedderPolicy.REQUIRE_CORP))
.crossOriginOpenerPolicy(coopCustomizer -> coopCustomizer
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package ch.puzzle.okr.controller;

import ch.puzzle.okr.dto.alignment.AlignmentObjectiveDto;
import ch.puzzle.okr.mapper.AlignmentSelectionMapper;
import ch.puzzle.okr.service.business.AlignmentSelectionBusinessService;
import ch.puzzle.okr.dto.alignment.AlignmentLists;
import ch.puzzle.okr.service.business.AlignmentBusinessService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
Expand All @@ -20,26 +19,23 @@
@RestController
@RequestMapping("api/v2/alignments")
public class AlignmentController {
private final AlignmentSelectionMapper alignmentSelectionMapper;
private final AlignmentSelectionBusinessService alignmentSelectionBusinessService;
private final AlignmentBusinessService alignmentBusinessService;

public AlignmentController(AlignmentSelectionMapper alignmentSelectionMapper,
AlignmentSelectionBusinessService alignmentSelectionBusinessService) {
this.alignmentSelectionMapper = alignmentSelectionMapper;
this.alignmentSelectionBusinessService = alignmentSelectionBusinessService;
public AlignmentController(AlignmentBusinessService alignmentBusinessService) {
this.alignmentBusinessService = alignmentBusinessService;
}

@Operation(summary = "Get all objectives and their key results to select the alignment", description = "Get a list of objectives with their key results to select the alignment")
@Operation(summary = "Get AlignmentLists from filter", description = "Get a list of AlignmentObjects with all AlignmentConnections, which match current quarter, team and objective filter")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Returned a list of objectives with their key results to select the alignment", content = {
@Content(mediaType = "application/json", schema = @Schema(implementation = AlignmentObjectiveDto.class)) }),
@ApiResponse(responseCode = "400", description = "Can't return list of objectives with their key results to select the alignment", content = @Content) })
@GetMapping("/selections")
public ResponseEntity<List<AlignmentObjectiveDto>> getAlignmentSelections(
@RequestParam(required = false, defaultValue = "", name = "quarter") Long quarterFilter,
@RequestParam(required = false, defaultValue = "", name = "team") Long teamFilter) {
@ApiResponse(responseCode = "200", description = "Returned AlignmentLists, which match current filters", content = {
@Content(mediaType = "application/json", schema = @Schema(implementation = AlignmentLists.class)) }),
@ApiResponse(responseCode = "400", description = "Can't generate AlignmentLists from current filters", content = @Content) })
@GetMapping("/alignmentLists")
public ResponseEntity<AlignmentLists> getAlignments(
@RequestParam(required = false, defaultValue = "", name = "teamFilter") List<Long> teamFilter,
@RequestParam(required = false, defaultValue = "", name = "quarterFilter") Long quarterFilter,
@RequestParam(required = false, defaultValue = "", name = "objectiveQuery") String objectiveQuery) {
return ResponseEntity.status(HttpStatus.OK)
.body(alignmentSelectionMapper.toDto(alignmentSelectionBusinessService
.getAlignmentSelectionByQuarterIdAndTeamIdNot(quarterFilter, teamFilter)));
.body(alignmentBusinessService.getAlignmentListsByFilters(quarterFilter, teamFilter, objectiveQuery));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ch.puzzle.okr.controller;

import ch.puzzle.okr.dto.AlignmentDto;
import ch.puzzle.okr.dto.ObjectiveDto;
import ch.puzzle.okr.mapper.ObjectiveMapper;
import ch.puzzle.okr.models.Objective;
Expand All @@ -14,6 +15,8 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import static org.springframework.http.HttpStatus.IM_USED;
import static org.springframework.http.HttpStatus.OK;

Expand Down Expand Up @@ -42,6 +45,19 @@ public ResponseEntity<ObjectiveDto> getObjective(
.body(objectiveMapper.toDto(objectiveAuthorizationService.getEntityById(id)));
}

@Operation(summary = "Get Alignment possibilities", description = "Get all possibilities to create an Alignment")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Returned all Alignment possibilities for an Objective", content = {
@Content(mediaType = "application/json", schema = @Schema(implementation = AlignmentDto.class)) }),
@ApiResponse(responseCode = "401", description = "Not authorized to get Alignment possibilities", content = @Content),
@ApiResponse(responseCode = "404", description = "Did not find any possibilities to create an Alignment", content = @Content) })
@GetMapping("/alignmentPossibilities/{quarterId}")
public ResponseEntity<List<AlignmentDto>> getAlignmentPossibilities(
@Parameter(description = "The Quarter ID for getting Alignment possibilities.", required = true) @PathVariable Long quarterId) {
return ResponseEntity.status(HttpStatus.OK)
.body(objectiveAuthorizationService.getAlignmentPossibilities(quarterId));
}

@Operation(summary = "Delete Objective by ID", description = "Delete Objective by ID")
@ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Deleted Objective by ID"),
@ApiResponse(responseCode = "401", description = "Not authorized to delete an Objective", content = @Content),
Expand Down
6 changes: 6 additions & 0 deletions backend/src/main/java/ch/puzzle/okr/dto/AlignmentDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ch.puzzle.okr.dto;

import java.util.List;

public record AlignmentDto(Long teamId, String teamName, List<AlignmentObjectDto> alignmentObjects) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package ch.puzzle.okr.dto;

public record AlignmentObjectDto(Long objectId, String objectTitle, String objectType) {
}
4 changes: 3 additions & 1 deletion backend/src/main/java/ch/puzzle/okr/dto/ObjectiveDto.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package ch.puzzle.okr.dto;

import ch.puzzle.okr.dto.alignment.AlignedEntityDto;
import ch.puzzle.okr.models.State;

import java.time.LocalDateTime;

public record ObjectiveDto(Long id, int version, String title, Long teamId, Long quarterId, String quarterLabel,
String description, State state, LocalDateTime createdOn, LocalDateTime modifiedOn, boolean writeable) {
String description, State state, LocalDateTime createdOn, LocalDateTime modifiedOn, boolean writeable,
AlignedEntityDto alignedEntity) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package ch.puzzle.okr.dto.alignment;

public record AlignedEntityDto(Long id, String type) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

package ch.puzzle.okr.dto.alignment;

public record AlignmentConnectionDto(Long alignedObjectiveId, Long targetObjectiveId, Long targetKeyResultId) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ch.puzzle.okr.dto.alignment;

import java.util.List;

public record AlignmentLists(List<AlignmentObjectDto> alignmentObjectDtoList,
List<AlignmentConnectionDto> alignmentConnectionDtoList) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ch.puzzle.okr.dto.alignment;

public record AlignmentObjectDto(Long objectId, String objectTitle, String objectTeamName, String objectState,
String objectType) {
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,21 @@ public ObjectiveMapper(TeamBusinessService teamBusinessService, QuarterBusinessS
this.quarterBusinessService = quarterBusinessService;
}

// TODO: Adjust Unit Tests of ObjectiveMapper after merge of multitenancy-main

public ObjectiveDto toDto(Objective objective) {
return new ObjectiveDto(objective.getId(), objective.getVersion(), objective.getTitle(),
objective.getTeam().getId(), objective.getQuarter().getId(), objective.getQuarter().getLabel(),
objective.getDescription(), objective.getState(), objective.getCreatedOn(), objective.getModifiedOn(),
objective.isWriteable());
objective.isWriteable(), objective.getAlignedEntity());
}

public Objective toObjective(ObjectiveDto objectiveDto) {
return Objective.Builder.builder().withId(objectiveDto.id()).withVersion(objectiveDto.version())
.withTitle(objectiveDto.title()).withTeam(teamBusinessService.getTeamById(objectiveDto.teamId()))
.withDescription(objectiveDto.description()).withModifiedOn(LocalDateTime.now())
.withState(objectiveDto.state()).withCreatedOn(objectiveDto.createdOn())
.withQuarter(quarterBusinessService.getQuarterById(objectiveDto.quarterId())).build();
.withQuarter(quarterBusinessService.getQuarterById(objectiveDto.quarterId()))
.withAlignedEntity(objectiveDto.alignedEntity()).build();
}
}
19 changes: 18 additions & 1 deletion backend/src/main/java/ch/puzzle/okr/models/Objective.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ch.puzzle.okr.models;

import ch.puzzle.okr.dto.alignment.AlignedEntityDto;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
Expand Down Expand Up @@ -52,6 +53,7 @@ public class Objective implements WriteableInterface {
private User modifiedBy;

private transient boolean writeable;
private transient AlignedEntityDto alignedEntity;

public Objective() {
}
Expand All @@ -68,6 +70,7 @@ private Objective(Builder builder) {
setState(builder.state);
setCreatedOn(builder.createdOn);
setModifiedBy(builder.modifiedBy);
setAlignedEntity(builder.alignedEntity);
}

public Long getId() {
Expand Down Expand Up @@ -160,12 +163,20 @@ public void setWriteable(boolean writeable) {
this.writeable = writeable;
}

public AlignedEntityDto getAlignedEntity() {
return alignedEntity;
}

public void setAlignedEntity(AlignedEntityDto alignedEntity) {
this.alignedEntity = alignedEntity;
}

@Override
public String toString() {
return "Objective{" + "id=" + id + ", version=" + version + ", title='" + title + '\'' + ", createdBy="
+ createdBy + ", team=" + team + ", quarter=" + quarter + ", description='" + description + '\''
+ ", modifiedOn=" + modifiedOn + ", state=" + state + ", createdOn=" + createdOn + ", modifiedBy="
+ modifiedBy + ", writeable=" + writeable + '\'' + '}';
+ modifiedBy + ", writeable=" + writeable + ", alignedEntity=" + alignedEntity + '\'' + '}';
}

@Override
Expand Down Expand Up @@ -201,6 +212,7 @@ public static final class Builder {
private State state;
private LocalDateTime createdOn;
private User modifiedBy;
private AlignedEntityDto alignedEntity;

private Builder() {
}
Expand Down Expand Up @@ -264,6 +276,11 @@ public Builder withModifiedBy(User modifiedBy) {
return this;
}

public Builder withAlignedEntity(AlignedEntityDto alignedEntity) {
this.alignedEntity = alignedEntity;
return this;
}

public Objective build() {
return new Objective(this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public int getVersion() {
return version;
}
Expand Down
Loading
Loading