generated from toufiq-austcse/nest-boilerplate
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5 from toufiq-austcse/feature/github
Feature: Add Github Service
- Loading branch information
Showing
12 changed files
with
221 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,36 @@ | ||
import { HttpStatus, Injectable } from '@nestjs/common'; | ||
import { HttpService } from '@nestjs/axios'; | ||
import { BadRequestException, Injectable, Logger } from '@nestjs/common'; | ||
import { ValidateRepositoryResDto } from '../dto/res/repository-res.dto'; | ||
import { firstValueFrom } from 'rxjs'; | ||
import { GithubService } from '@common/http-clients/github/services/github.service'; | ||
|
||
@Injectable() | ||
export class RepositoryService { | ||
constructor(private httpService: HttpService) { | ||
constructor(private githubService: GithubService) { | ||
} | ||
|
||
async validateRepository(url: string): Promise<ValidateRepositoryResDto> { | ||
let isValidRepo = false; | ||
let repoNameWithOwner = null; | ||
parseRepoUrl(repoUrl: string): { repoName: string, repoOwner: string } { | ||
return { | ||
repoName: repoUrl.split('/').pop().replace('.git', ''), | ||
repoOwner: repoUrl.split('/').slice(-2)[0] | ||
}; | ||
} | ||
|
||
async validateRepository(repoUrl: string): Promise<ValidateRepositoryResDto> { | ||
let isValid = false; | ||
let repoFullName = null; | ||
if (!repoUrl.endsWith('.git')) { | ||
throw new BadRequestException('Invalid repository url'); | ||
} | ||
let parsedRepoUrl = this.parseRepoUrl(repoUrl); | ||
try { | ||
let res = await firstValueFrom(this.httpService.get(url)); | ||
if (res.status === HttpStatus.OK) { | ||
isValidRepo = true; | ||
repoNameWithOwner = url.split('/').slice(-2).join('/'); | ||
} | ||
let repoDetails = await this.githubService.getRepository(parsedRepoUrl.repoOwner, parsedRepoUrl.repoName); | ||
isValid = true; | ||
repoFullName = repoDetails.full_name; | ||
} catch (e) { | ||
console.log(e); | ||
Logger.log(e, 'RepositoryService.validateRepository'); | ||
} | ||
return { | ||
is_valid: isValidRepo, | ||
repo_name_with_owner: repoNameWithOwner | ||
is_valid: isValid, | ||
repo_full_name: repoFullName | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
import { HttpException, HttpStatus } from '@nestjs/common'; | ||
import { AxiosError } from 'axios'; | ||
|
||
export class AxiosErrorException extends HttpException { | ||
constructor(error: AxiosError, contextName: string) { | ||
let msg = `error in internal server communication, ${contextName}`; | ||
if (error.response) { | ||
super( | ||
{ | ||
message: msg, | ||
error: JSON.stringify(error.response.data), | ||
statusCode: error.response.status | ||
}, | ||
error.response.status | ||
); | ||
} else { | ||
super( | ||
{ | ||
message: msg, | ||
error: error.toJSON(), | ||
statusCode: HttpStatus.INTERNAL_SERVER_ERROR | ||
}, | ||
HttpStatus.INTERNAL_SERVER_ERROR | ||
); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
export interface GithubGetRepositoryRes { | ||
id: number; | ||
node_id: string; | ||
name: string; | ||
full_name: string; | ||
private: boolean; | ||
owner: Owner; | ||
html_url: string; | ||
description: null; | ||
fork: boolean; | ||
url: string; | ||
forks_url: string; | ||
keys_url: string; | ||
collaborators_url: string; | ||
teams_url: string; | ||
hooks_url: string; | ||
issue_events_url: string; | ||
events_url: string; | ||
assignees_url: string; | ||
branches_url: string; | ||
tags_url: string; | ||
blobs_url: string; | ||
git_tags_url: string; | ||
git_refs_url: string; | ||
trees_url: string; | ||
statuses_url: string; | ||
languages_url: string; | ||
stargazers_url: string; | ||
contributors_url: string; | ||
subscribers_url: string; | ||
subscription_url: string; | ||
commits_url: string; | ||
git_commits_url: string; | ||
comments_url: string; | ||
issue_comment_url: string; | ||
contents_url: string; | ||
compare_url: string; | ||
merges_url: string; | ||
archive_url: string; | ||
downloads_url: string; | ||
issues_url: string; | ||
pulls_url: string; | ||
milestones_url: string; | ||
notifications_url: string; | ||
labels_url: string; | ||
releases_url: string; | ||
deployments_url: string; | ||
created_at: Date; | ||
updated_at: Date; | ||
pushed_at: Date; | ||
git_url: string; | ||
ssh_url: string; | ||
clone_url: string; | ||
svn_url: string; | ||
homepage: null; | ||
size: number; | ||
stargazers_count: number; | ||
watchers_count: number; | ||
language: string; | ||
has_issues: boolean; | ||
has_projects: boolean; | ||
has_downloads: boolean; | ||
has_wiki: boolean; | ||
has_pages: boolean; | ||
has_discussions: boolean; | ||
forks_count: number; | ||
mirror_url: null; | ||
archived: boolean; | ||
disabled: boolean; | ||
open_issues_count: number; | ||
license: null; | ||
allow_forking: boolean; | ||
is_template: boolean; | ||
web_commit_signoff_required: boolean; | ||
topics: any[]; | ||
visibility: string; | ||
forks: number; | ||
open_issues: number; | ||
watchers: number; | ||
default_branch: string; | ||
permissions: Permissions; | ||
template_repository?: GithubGetRepositoryRes; | ||
network_count?: number; | ||
subscribers_count?: number; | ||
} | ||
|
||
export interface Owner { | ||
login: string; | ||
id: number; | ||
node_id: string; | ||
avatar_url: string; | ||
gravatar_id: string; | ||
url: string; | ||
html_url: string; | ||
followers_url: string; | ||
following_url: string; | ||
gists_url: string; | ||
starred_url: string; | ||
subscriptions_url: string; | ||
organizations_url: string; | ||
repos_url: string; | ||
events_url: string; | ||
received_events_url: string; | ||
type: string; | ||
site_admin: boolean; | ||
} | ||
|
||
export interface Permissions { | ||
admin: boolean; | ||
maintain: boolean; | ||
push: boolean; | ||
triage: boolean; | ||
pull: boolean; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import { Injectable } from '@nestjs/common'; | ||
import { HttpService } from '@nestjs/axios'; | ||
import { firstValueFrom } from 'rxjs'; | ||
import { GithubGetRepositoryRes } from '@common/http-clients/github/dto/res.dto'; | ||
import { AxiosError } from 'axios'; | ||
import { AxiosErrorException } from '@common/exceptions/axios-error.exception'; | ||
import { AppConfigService } from '@common/app-config/service/app-config.service'; | ||
|
||
@Injectable() | ||
export class GithubService { | ||
constructor(private httpService: HttpService) { | ||
} | ||
|
||
async getRepository(ownerName: string, name: string): Promise<GithubGetRepositoryRes> { | ||
try { | ||
|
||
let res = await firstValueFrom(this.httpService.get(`${AppConfigService.appConfig.GITHUB_BASE_URL}/repos/${ownerName}/${name}`, { | ||
headers: { | ||
Authorization: `Bearer ${AppConfigService.appConfig.GITHUB_API_TOKEN}` | ||
} | ||
})); | ||
return res.data; | ||
} catch (error) { | ||
if (error instanceof AxiosError) { | ||
throw new AxiosErrorException(error, GithubService.name); | ||
} | ||
throw new Error(error as any); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,13 @@ | ||
import { Module } from '@nestjs/common'; | ||
import { Global, Module } from '@nestjs/common'; | ||
import { HttpModule } from '@nestjs/axios'; | ||
import { GithubService } from '@common/http-clients/github/services/github.service'; | ||
|
||
@Module({}) | ||
@Global() | ||
@Module({ | ||
imports: [HttpModule], | ||
providers: [GithubService], | ||
exports: [GithubService] | ||
}) | ||
export class HttpClientsModule { | ||
|
||
} |