Skip to content

Commit

Permalink
Refactor endpoint and DTO to only transmit Theia Config
Browse files Browse the repository at this point in the history
  • Loading branch information
iyannsch committed Feb 18, 2025
1 parent 2df48e6 commit 69a685f
Show file tree
Hide file tree
Showing 7 changed files with 27 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public record ProgrammingExerciseBuildConfigDTO(String theiaImage) {
public record ProgrammingExerciseTheiaConfigDTO(String theiaImage) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@
import de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage;
import de.tum.cit.aet.artemis.programming.dto.BuildLogStatisticsDTO;
import de.tum.cit.aet.artemis.programming.dto.CheckoutDirectoriesDTO;
import de.tum.cit.aet.artemis.programming.dto.ProgrammingExerciseBuildConfigDTO;
import de.tum.cit.aet.artemis.programming.dto.ProgrammingExerciseResetOptionsDTO;
import de.tum.cit.aet.artemis.programming.dto.ProgrammingExerciseTestCaseStateDTO;
import de.tum.cit.aet.artemis.programming.dto.ProgrammingExerciseTheiaConfigDTO;
import de.tum.cit.aet.artemis.programming.repository.BuildLogStatisticsEntryRepository;
import de.tum.cit.aet.artemis.programming.repository.ProgrammingExerciseBuildConfigRepository;
import de.tum.cit.aet.artemis.programming.repository.ProgrammingExerciseRepository;
Expand Down Expand Up @@ -500,18 +500,18 @@ public ResponseEntity<ProgrammingExercise> getProgrammingExercise(@PathVariable
}

/**
* GET /programming-exercises/:exerciseId/build-config : get the build config of "exerciseId" programmingExercise.
* GET /programming-exercises/:exerciseId/theia-config : get the theia config for the programmingExercise.
*
* @param exerciseId the id of the programmingExercise to retrieve the config for
* @return the ResponseEntity with status 200 (OK) and with body the programmingExerciseBuildConfig, or with status 404 (Not Found)
* @param exerciseId the id of the programmingExercise to retrieve the configuration for
* @return the ResponseEntity with status 200 (OK) and with body the TheiaConfigDTO, or with status 404 (Not Found)
*/
@GetMapping("programming-exercises/{exerciseId}/build-config")
@GetMapping("programming-exercises/{exerciseId}/theia-config")
@EnforceAtLeastStudentInExercise
public ResponseEntity<ProgrammingExerciseBuildConfigDTO> getBuildConfig(@PathVariable long exerciseId) {
log.debug("REST request to get build config of ProgrammingExercise : {}", exerciseId);
var buildConfig = new ProgrammingExerciseBuildConfigDTO(programmingExerciseBuildConfigRepository.getTheiaImageByProgrammingExerciseId(exerciseId));
public ResponseEntity<ProgrammingExerciseTheiaConfigDTO> getBuildConfig(@PathVariable long exerciseId) {
log.debug("REST request to get theia image of ProgrammingExercise : {}", exerciseId);
var imageDTO = new ProgrammingExerciseTheiaConfigDTO(programmingExerciseBuildConfigRepository.getTheiaImageByProgrammingExerciseId(exerciseId));

return ResponseEntity.ok().body(buildConfig);
return ResponseEntity.ok().body(imageDTO);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export class ProgrammingExerciseTheiaConfig {
public theiaImage?: string;
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ import { Participation } from 'app/entities/participation/participation.model';
import { PlagiarismResultDTO } from 'app/exercises/shared/plagiarism/types/PlagiarismResultDTO';
import { ImportOptions } from 'app/types/programming-exercises';
import { CheckoutDirectoriesDto } from 'app/entities/programming/checkout-directories-dto';
import { ProgrammingExerciseBuildConfig } from 'app/entities/programming/programming-exercise-build.config';
import { RepositoryType } from 'app/exercises/programming/shared/code-editor/model/code-editor.model';
import { ProgrammingExerciseTheiaConfig } from 'app/entities/programming/programming-exercise-theia.config';

export type EntityResponseType = HttpResponse<ProgrammingExercise>;
export type EntityArrayResponseType = HttpResponse<ProgrammingExercise[]>;
Expand Down Expand Up @@ -619,8 +619,8 @@ export class ProgrammingExerciseService {
return this.http.get<BuildLogStatisticsDTO>(`${this.resourceUrl}/${exerciseId}/build-log-statistics`);
}

getBuildConfig(exerciseId: number): Observable<ProgrammingExerciseBuildConfig> {
return this.http.get<ProgrammingExerciseBuildConfig>(`${this.resourceUrl}/${exerciseId}/build-config`);
getTheiaConfig(exerciseId: number): Observable<ProgrammingExerciseTheiaConfig> {
return this.http.get<ProgrammingExerciseTheiaConfig>(`${this.resourceUrl}/${exerciseId}/theia-config`);
}

/** Imports a programming exercise from a given zip file **/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -446,9 +446,10 @@ export class CodeButtonComponent implements OnInit {
if (profileInfo.activeProfiles?.includes(PROFILE_THEIA) && this.exercise()) {
// Theia requires the Build Config of the programming exercise to be set
// @ts-expect-error (The exercise is not undefined here)
this.programmingExerciseSerice.getBuildConfig(this.exercise().id!).subscribe((buildConfig) => {
this.programmingExerciseSerice.getTheiaConfig(this.exercise().id!).subscribe((theiaConfig) => {
// Merge the theiaConfig (containing the theiaImage) into the buildConfig
// @ts-expect-error (The exercise is not undefined here)
this.exercise().buildConfig = buildConfig;
this.exercise().buildConfig = { ...this.exercise()?.buildConfig, ...theiaConfig };

// Set variables now, sanitize later on
this.theiaPortalURL = profileInfo.theiaPortalURL ?? '';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import de.tum.cit.aet.artemis.core.util.RequestUtilService;
import de.tum.cit.aet.artemis.exercise.participation.util.ParticipationUtilService;
import de.tum.cit.aet.artemis.programming.domain.ProgrammingExercise;
import de.tum.cit.aet.artemis.programming.dto.ProgrammingExerciseBuildConfigDTO;
import de.tum.cit.aet.artemis.programming.dto.ProgrammingExerciseTheiaConfigDTO;
import de.tum.cit.aet.artemis.programming.repository.ProgrammingExerciseBuildConfigRepository;
import de.tum.cit.aet.artemis.programming.util.ProgrammingExerciseUtilService;
import de.tum.cit.aet.artemis.shared.base.AbstractSpringIntegrationIndependentTest;
Expand Down Expand Up @@ -71,10 +71,10 @@ void setup() {
@Test
@WithMockUser(username = TEST_PREFIX + "student1", roles = { "USER", "STUDENT" })
void testBuildConfigOnlyReturnsRestrictedSetOfInformation() throws Exception {
ProgrammingExerciseBuildConfigDTO buildConfig = request.get("/api/programming-exercises/" + programmingExercise.getId() + "/build-config", HttpStatus.OK,
ProgrammingExerciseBuildConfigDTO.class);
ProgrammingExerciseTheiaConfigDTO imageDTO = request.get("/api/programming-exercises/" + programmingExercise.getId() + "/theia-config", HttpStatus.OK,
ProgrammingExerciseTheiaConfigDTO.class);

// Count the number of fields in the record, this makes sure that only the expected fields are returned
assertThat(buildConfig.getClass().getDeclaredFields().length).isEqualTo(1);
assertThat(imageDTO.getClass().getDeclaredFields().length).isEqualTo(1);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { ExerciseActionButtonComponent } from '../../../../../main/webapp/app/sh
import { ProgrammingExerciseService } from 'app/exercises/programming/manage/services/programming-exercise.service';
import { ProgrammingExerciseBuildConfig } from 'app/entities/programming/programming-exercise-build.config';

Check failure on line 22 in src/test/javascript/spec/component/shared/code-button.component.spec.ts

View workflow job for this annotation

GitHub Actions / client-tests

'ProgrammingExerciseBuildConfig' is declared but its value is never read.

Check failure on line 22 in src/test/javascript/spec/component/shared/code-button.component.spec.ts

View workflow job for this annotation

GitHub Actions / client-tests-selected

'ProgrammingExerciseBuildConfig' is declared but its value is never read.
import { PROFILE_THEIA } from 'app/app.constants';
import { ProgrammingExerciseTheiaConfig } from 'app/entities/programming/programming-exercise-theia.config';

describe('CodeButtonComponent', () => {
let component: CodeButtonComponent;
Expand Down Expand Up @@ -455,12 +456,12 @@ describe('CodeButtonComponent', () => {
},
false,
],
])('%s', async (description, profileInfo, programmingExercise, buildConfig, expectedVisibility) => {
])('%s', async (description, profileInfo, programmingExercise, theiaConfig, expectedVisibility) => {
const getProfileInfoStub = jest.spyOn(profileService, 'getProfileInfo');
getProfileInfoStub.mockReturnValue(of(profileInfo as ProfileInfo));

const getBuildconfigStub = jest.spyOn(programmingExerciseService, 'getBuildConfig');
getBuildconfigStub.mockReturnValue(of(buildConfig as ProgrammingExerciseBuildConfig));
const getTheiaConfigStub = jest.spyOn(programmingExerciseService, 'getTheiaConfig');
getTheiaConfigStub.mockReturnValue(of(theiaConfig as ProgrammingExerciseTheiaConfig));

// Expand the programmingExercise by given properties
fixture.componentRef.setInput('exercise', {
Expand Down

0 comments on commit 69a685f

Please sign in to comment.