Skip to content

Commit

Permalink
Meta Endpoint with repositories
Browse files Browse the repository at this point in the history
  • Loading branch information
GODrums committed Oct 12, 2024
1 parent 24e8840 commit 6eff609
Show file tree
Hide file tree
Showing 15 changed files with 308 additions and 12 deletions.
19 changes: 19 additions & 0 deletions server/application-server/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,18 @@ paths:
type: array
items:
$ref: "#/components/schemas/PullRequest"
/meta:
get:
tags:
- meta
operationId: getMetaData
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/MetaDataDTO"
/leaderboard:
get:
tags:
Expand Down Expand Up @@ -474,6 +486,13 @@ components:
type: array
items:
$ref: "#/components/schemas/PullRequestReview"
MetaDataDTO:
type: object
properties:
repositoriesToMonitor:
type: array
items:
type: string
LeaderboardEntry:
type: object
properties:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package de.tum.in.www1.hephaestus.meta;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/meta")
public class MetaController {

private final MetaService metaService;

public MetaController(MetaService metaService) {
this.metaService = metaService;
}

@GetMapping
public ResponseEntity<MetaDataDTO> getMetaData() {
return ResponseEntity.ok(metaService.getMetaData());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package de.tum.in.www1.hephaestus.meta;

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public record MetaDataDTO(String[] repositoriesToMonitor) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package de.tum.in.www1.hephaestus.meta;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class MetaService {
private static final Logger logger = LoggerFactory.getLogger(MetaService.class);

@Value("${monitoring.repositories}")
private String[] repositoriesToMonitor;

public MetaDataDTO getMetaData() {
logger.info("Getting meta data...");
return new MetaDataDTO(repositoriesToMonitor);
}
}
3 changes: 3 additions & 0 deletions webapp/src/app/core/modules/openapi/.openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ api/admin.serviceInterface.ts
api/api.ts
api/leaderboard.service.ts
api/leaderboard.serviceInterface.ts
api/meta.service.ts
api/meta.serviceInterface.ts
api/pull-request.service.ts
api/pull-request.serviceInterface.ts
api/user.service.ts
Expand All @@ -18,6 +20,7 @@ index.ts
model/issue-comment-dto.ts
model/issue-comment.ts
model/leaderboard-entry.ts
model/meta-data-dto.ts
model/models.ts
model/pull-request-dto.ts
model/pull-request-label.ts
Expand Down
5 changes: 4 additions & 1 deletion webapp/src/app/core/modules/openapi/api/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@ export * from './admin.serviceInterface';
export * from './leaderboard.service';
import { LeaderboardService } from './leaderboard.service';
export * from './leaderboard.serviceInterface';
export * from './meta.service';
import { MetaService } from './meta.service';
export * from './meta.serviceInterface';
export * from './pull-request.service';
import { PullRequestService } from './pull-request.service';
export * from './pull-request.serviceInterface';
export * from './user.service';
import { UserService } from './user.service';
export * from './user.serviceInterface';
export const APIS = [AdminService, LeaderboardService, PullRequestService, UserService];
export const APIS = [AdminService, LeaderboardService, MetaService, PullRequestService, UserService];
157 changes: 157 additions & 0 deletions webapp/src/app/core/modules/openapi/api/meta.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
/**
* Hephaestus API
* API documentation for the Hephaestus application server.
*
* The version of the OpenAPI document: 0.0.1
* Contact: [email protected]
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
/* tslint:disable:no-unused-variable member-ordering */

import { Inject, Injectable, Optional } from '@angular/core';
import { HttpClient, HttpHeaders, HttpParams,
HttpResponse, HttpEvent, HttpParameterCodec, HttpContext
} from '@angular/common/http';
import { CustomHttpParameterCodec } from '../encoder';
import { Observable } from 'rxjs';

// @ts-ignore
import { MetaDataDTO } from '../model/meta-data-dto';

// @ts-ignore
import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
import { Configuration } from '../configuration';
import {
MetaServiceInterface
} from './meta.serviceInterface';



@Injectable({
providedIn: 'root'
})
export class MetaService implements MetaServiceInterface {

protected basePath = 'http://localhost';
public defaultHeaders = new HttpHeaders();
public configuration = new Configuration();
public encoder: HttpParameterCodec;

constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) {
if (configuration) {
this.configuration = configuration;
}
if (typeof this.configuration.basePath !== 'string') {
const firstBasePath = Array.isArray(basePath) ? basePath[0] : undefined;
if (firstBasePath != undefined) {
basePath = firstBasePath;
}

if (typeof basePath !== 'string') {
basePath = this.basePath;
}
this.configuration.basePath = basePath;
}
this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
}


// @ts-ignore
private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams {
if (typeof value === "object" && value instanceof Date === false) {
httpParams = this.addToHttpParamsRecursive(httpParams, value);
} else {
httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
}
return httpParams;
}

private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams {
if (value == null) {
return httpParams;
}

if (typeof value === "object") {
if (Array.isArray(value)) {
(value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key));
} else if (value instanceof Date) {
if (key != null) {
httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10));
} else {
throw Error("key may not be null if value is Date");
}
} else {
Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive(
httpParams, value[k], key != null ? `${key}.${k}` : k));
}
} else if (key != null) {
httpParams = httpParams.append(key, value);
} else {
throw Error("key may not be null if value is not object or array");
}
return httpParams;
}

/**
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
*/
public getMetaData(observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<MetaDataDTO>;
public getMetaData(observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<MetaDataDTO>>;
public getMetaData(observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<MetaDataDTO>>;
public getMetaData(observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<any> {

let localVarHeaders = this.defaultHeaders;

let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
if (localVarHttpHeaderAcceptSelected === undefined) {
// to determine the Accept header
const httpHeaderAccepts: string[] = [
'application/json'
];
localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
}
if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
}

let localVarHttpContext: HttpContext | undefined = options && options.context;
if (localVarHttpContext === undefined) {
localVarHttpContext = new HttpContext();
}

let localVarTransferCache: boolean | undefined = options && options.transferCache;
if (localVarTransferCache === undefined) {
localVarTransferCache = true;
}


let responseType_: 'text' | 'json' | 'blob' = 'json';
if (localVarHttpHeaderAcceptSelected) {
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
responseType_ = 'text';
} else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
responseType_ = 'json';
} else {
responseType_ = 'blob';
}
}

let localVarPath = `/meta`;
return this.httpClient.request<MetaDataDTO>('get', `${this.configuration.basePath}${localVarPath}`,
{
context: localVarHttpContext,
responseType: <any>responseType_,
withCredentials: this.configuration.withCredentials,
headers: localVarHeaders,
observe: observe,
transferCache: localVarTransferCache,
reportProgress: reportProgress
}
);
}

}
33 changes: 33 additions & 0 deletions webapp/src/app/core/modules/openapi/api/meta.serviceInterface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/**
* Hephaestus API
* API documentation for the Hephaestus application server.
*
* The version of the OpenAPI document: 0.0.1
* Contact: [email protected]
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { HttpHeaders } from '@angular/common/http';

import { Observable } from 'rxjs';

import { MetaDataDTO } from '../model/models';


import { Configuration } from '../configuration';



export interface MetaServiceInterface {
defaultHeaders: HttpHeaders;
configuration: Configuration;

/**
*
*
*/
getMetaData(extraHttpRequestParams?: any): Observable<MetaDataDTO>;

}
17 changes: 17 additions & 0 deletions webapp/src/app/core/modules/openapi/model/meta-data-dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/**
* Hephaestus API
* API documentation for the Hephaestus application server.
*
* The version of the OpenAPI document: 0.0.1
* Contact: [email protected]
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/


export interface MetaDataDTO {
repositoriesToMonitor?: Array<string>;
}

1 change: 1 addition & 0 deletions webapp/src/app/core/modules/openapi/model/models.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export * from './issue-comment';
export * from './issue-comment-dto';
export * from './leaderboard-entry';
export * from './meta-data-dto';
export * from './pull-request';
export * from './pull-request-dto';
export * from './pull-request-label';
Expand Down
2 changes: 1 addition & 1 deletion webapp/src/app/home/home.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ <h1 class="text-3xl font-bold">Artemis Leaderboard</h1>
<h2 class="text-xl text-muted-foreground">Hi {{ userValue.name }} 👋</h2>
}
</div>
<app-leaderboard-filter />
<app-leaderboard-filter [metaData]="metaQuery.data()" />
</div>
<div class="col-span-2">
@if (query.error()) {
Expand Down
7 changes: 7 additions & 0 deletions webapp/src/app/home/home.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { LeaderboardComponent } from '@app/home/leaderboard/leaderboard.componen
import { LeaderboardFilterComponent } from './leaderboard/filter/filter.component';
import { SecurityStore } from '@app/core/security/security-store.service';
import { HlmAlertModule } from '@spartan-ng/ui-alert-helm';
import { MetaService } from '@app/core/modules/openapi';

dayjs.extend(isoWeek);

Expand All @@ -24,6 +25,7 @@ export class HomeComponent {
protected CircleX = CircleX;

securityStore = inject(SecurityStore);
metaService = inject(MetaService);
leaderboardService = inject(LeaderboardService);

signedIn = this.securityStore.signedIn;
Expand All @@ -44,4 +46,9 @@ export class HomeComponent {
)
)
}));

metaQuery = injectQuery(() => ({
queryKey: ['meta'],
queryFn: async () => lastValueFrom(this.metaService.getMetaData())
}));
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ <h3 class="text-base font-semibold tracking-wide">Filter</h3>
</span>
<form ngForm class="flex xl:flex-col gap-4">
<app-leaderboard-filter-timeframe />
<app-leaderboard-filter-repository />
<app-leaderboard-filter-repository [repositories]="metaData()?.repositoriesToMonitor" />
</form>
</div>
5 changes: 4 additions & 1 deletion webapp/src/app/home/leaderboard/filter/filter.component.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Component } from '@angular/core';
import { Component, input } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { ListFilter, LucideAngularModule } from 'lucide-angular';
import { LeaderboardFilterTimeframeComponent } from './timeframe/timeframe.component';
import { LeaderboardFilterRepositoryComponent } from './repository/repository.component';
import { MetaDataDTO } from '@app/core/modules/openapi';

@Component({
selector: 'app-leaderboard-filter',
Expand All @@ -12,4 +13,6 @@ import { LeaderboardFilterRepositoryComponent } from './repository/repository.co
})
export class LeaderboardFilterComponent {
protected ListFilter = ListFilter;

metaData = input<MetaDataDTO>();
}
Loading

0 comments on commit 6eff609

Please sign in to comment.