Initial Implementation of Project Cards
This commit is contained in:
@@ -2,19 +2,15 @@ import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import {
|
||||
first,
|
||||
firstValueFrom,
|
||||
map,
|
||||
Observable,
|
||||
of,
|
||||
Subject,
|
||||
take,
|
||||
tap,
|
||||
} from 'rxjs';
|
||||
import { catchError } from 'rxjs/operators';
|
||||
import { environment } from 'src/environments/environment';
|
||||
import { HttpError } from '../model/httpError/httpError.model';
|
||||
import { User } from '../model/user/user.model';
|
||||
import * as http from 'http';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
|
||||
16
src/app/shared/github-service/github.service.spec.ts
Normal file
16
src/app/shared/github-service/github.service.spec.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
|
||||
import { GithubServiceService } from './github.service';
|
||||
|
||||
describe('GithubServiceService', () => {
|
||||
let service: GithubServiceService;
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({});
|
||||
service = TestBed.inject(GithubServiceService);
|
||||
});
|
||||
|
||||
it('should be created', () => {
|
||||
expect(service).toBeTruthy();
|
||||
});
|
||||
});
|
||||
78
src/app/shared/github-service/github.service.ts
Normal file
78
src/app/shared/github-service/github.service.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import {Language, Project} from "../model/project/project.model";
|
||||
import {HttpClient} from "@angular/common/http";
|
||||
import {
|
||||
map, mergeMap,
|
||||
Observable,
|
||||
pipe, switchMap, take
|
||||
} from 'rxjs';
|
||||
import { environment } from 'src/environments/environment';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class GithubService {
|
||||
|
||||
GITHUB_API_URL = 'https://api.github.com';
|
||||
|
||||
GITHUB_USER = environment.githubUser;
|
||||
|
||||
constructor(private http: HttpClient) { }
|
||||
|
||||
getProjects(): Observable<Project> {
|
||||
return this.http.get(this.apiReposString()).pipe(
|
||||
map((projects: any) => {
|
||||
return projects.map((project: any) => {
|
||||
return {
|
||||
name: project.name,
|
||||
description: project.description,
|
||||
license: project.license?.key,
|
||||
link: project.html_url,
|
||||
|
||||
stars: project.stargazers_count,
|
||||
forks: project.forks_count,
|
||||
watchers: project.watchers_count
|
||||
} as Project;
|
||||
}).filter((project: Project) => {
|
||||
return project.name !== this.GITHUB_USER;
|
||||
});
|
||||
}),
|
||||
switchMap((projects: Project[]) => {
|
||||
return new Observable<Project>((observer) => {
|
||||
projects.forEach((project: Project, index: number) => {
|
||||
this.getProjectLanguage(project).subscribe((languages: Language[]) => {
|
||||
project.languages = languages;
|
||||
observer.next(project);
|
||||
});
|
||||
});
|
||||
});
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
private getProjectLanguage(project: Project): Observable<Language[]> {
|
||||
return this.http.get(this.apiRepoLanguagesString(project.name)).pipe(
|
||||
map((languages: any) => {
|
||||
let totalBytes = 0;
|
||||
Object.keys(languages).forEach((language: string) => {
|
||||
totalBytes += languages[language];
|
||||
});
|
||||
|
||||
return Object.keys(languages).map((language: string) => {
|
||||
return {
|
||||
name: language,
|
||||
percentage: (languages[language]/totalBytes)*100
|
||||
} as Language;
|
||||
});
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
private apiReposString() {
|
||||
return `${this.GITHUB_API_URL}/users/${this.GITHUB_USER}/repos`;
|
||||
}
|
||||
|
||||
private apiRepoLanguagesString(repoName: string) {
|
||||
return `${this.GITHUB_API_URL}/repos/${this.GITHUB_USER}/${repoName}/languages`;
|
||||
}
|
||||
}
|
||||
17
src/app/shared/model/project/project.model.ts
Normal file
17
src/app/shared/model/project/project.model.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export type Language = {
|
||||
name: string;
|
||||
percentage: number;
|
||||
}
|
||||
|
||||
export type Project = {
|
||||
name: string;
|
||||
description: string;
|
||||
link: string;
|
||||
|
||||
license?: string;
|
||||
languages?: Language[];
|
||||
|
||||
stars: number;
|
||||
forks: number;
|
||||
watchers: number;
|
||||
}
|
||||
Reference in New Issue
Block a user