Newer
Older

Eduard Frankford
committed
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { ApplicationConfigService } from 'app/core/config/application-config.service';

Eduard Frankford
committed
import { LikesService } from 'app/entities/likes/likes.service';

Eduard Frankford
committed
import { StatisticsService } from 'app/entities/statistics/statistics.service';

Eduard Frankford
committed
import { SearchService } from 'app/search/service/search-service';
import { ArtemisExerciseInfo } from 'app/shared/model/artemis-exercise-info.model';
import { ExtendedSearchResultDTO, SearchResultDTO } from 'app/shared/model/search/search-result-dto.model';

Eduard Frankford
committed
import { Statistics } from 'app/shared/model/statistics.model';
import { Observable } from 'rxjs';
public resourceUrl = this.applicationConfigService.getEndpointFor('api/exerciseFile/');
public exerciseUrl: string = this.applicationConfigService.getEndpointFor('api/exercise/');

Eduard Frankford
committed
constructor(
private http: HttpClient,
private likesService: LikesService,
private searchService: SearchService,
private statisticsService: StatisticsService,
private applicationConfigService: ApplicationConfigService

Eduard Frankford
committed
) {}

Eduard Frankford
committed
public loadExerciseFile(exerciseId: string, filePath: string): Observable<string> {
const headers = new HttpHeaders(); // .set('Content-Type', 'text/plain; charset=utf-8');
const options: HttpParams = new HttpParams();
options.append('filePath', filePath);
return this.http.get<string>(this.resourceUrl + encodeURIforExerciseId(exerciseId), {

Eduard Frankford
committed
headers,
params: new HttpParams().set('filePath', filePath),
responseType: 'text' as 'json',
});
}
public loadExercise(exerciseId: string): Observable<SearchResultDTO> {
return this.http.get<SearchResultDTO>(this.exerciseUrl + encodeURIforExerciseId(exerciseId));

Eduard Frankford
committed
}
populateExerciseWithData(exercise: SearchResultDTO): ExtendedSearchResultDTO {
const result: ExtendedSearchResultDTO = {
...exercise,
numberOfWatchlistEntries: 0,
badgeRewarded: false,
numberOfLikes: 0,
userHasLiked: false,
views: 0,
downloads: 0,
};

Eduard Frankford
committed
if (exercise !== undefined) {
exercise.views = 0;
exercise.downloads = 0;
this.likesService.getLikesForexerciseID(exercise.exerciseId).subscribe({
next: (data: number) => {
result.numberOfLikes = data;

Eduard Frankford
committed
},
error: () => console.warn('Could not load number of likes'),
});

Eduard Frankford
committed
this.statisticsService.getNumberOfWatchListEntriesForExerciseID(result.exerciseId).subscribe({
next: (data: number) => {
result.numberOfWatchlistEntries = data;

Eduard Frankford
committed
},
error: () => console.warn('Could not load number of watchlists'),
});

Eduard Frankford
committed
this.likesService.hasLiked(exercise.exerciseId).subscribe({
next: (data: boolean) => {
result.userHasLiked = data;

Eduard Frankford
committed
},
error: () => console.warn('Could not load if user has liked or not'),
});
this.searchService.getStatisticsForExercise(exercise.exerciseId).subscribe({
next: (data: Statistics) => {
result.views = data.views!;
result.downloads = data.downloads!;
result.badgeRewarded = data.badgeRewarded!;

Eduard Frankford
committed
},
error: () => console.warn('Could not load exercise statistics'),
});

Eduard Frankford
committed
}

Eduard Frankford
committed
/**
* Used on init of import page, this function passes the retrieved (from Artemis)
* exerciseUrl to the server
* @param exerciseUrl
*/
public importExerciseInfoFromArtemis(exerciseToken: string): Observable<ArtemisExerciseInfo> {
return this.http.get<ArtemisExerciseInfo>(`${this.exerciseUrl}imported-exercise-info/${exerciseToken}`);
}
/**
* Submits an ArtemisExerciseInfo object to server and triggers its import
* @param exerciseInfo to submit and import
*/
public submitExerciseInfoForImport(
exerciseInfo: ArtemisExerciseInfo,
exerciseToken: string,
gitlabGroupId: number
): Observable<ArtemisExerciseInfo> {
return this.http.post<ArtemisExerciseInfo>(`${this.exerciseUrl}import-exercise/${exerciseToken}/${gitlabGroupId}`, exerciseInfo);
/**
* POST request validating the ExerciseInfo provided on the server side
* @param exerciseInfo to validate
*/
public validateExerciseInfo(exerciseInfo: ArtemisExerciseInfo): Observable<string> {
return this.http.post<string>(`${this.exerciseUrl}validate-exercise-info`, exerciseInfo);
}
/*
* behind the apache reverse proxy, encoded slashes are not working.
* I have not found a good way to repair this. So we unencode the slashes here.
*/
export function encodeURIforExerciseId(exerciseId: string): string {
const encodedURL = encodeURIComponent(exerciseId);
return encodedURL.replace('%2F', '/').replace('%2f', '/');