Initial Implementation of Project Cards

This commit is contained in:
2023-12-28 21:28:36 -03:00
parent f6c0cb1ca1
commit 12e8aadf7b
18 changed files with 376 additions and 8 deletions

View File

@@ -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',

View 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();
});
});

View 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`;
}
}

View 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;
}