diff --git a/src/api/db/build.ts b/src/api/db/build.ts index 598bac844..4a77d5e97 100644 --- a/src/api/db/build.ts +++ b/src/api/db/build.ts @@ -12,14 +12,14 @@ export function getBuilds( .query(q => { if (userId) { q.innerJoin('repositories', 'repositories.id', 'builds.repositories_id') - .innerJoin('permissions', 'permissions.repositories_id', 'repositories.id') - .where('permissions.users_id', userId) - .andWhere(function() { - this.where('permissions.permission', true).orWhere('repositories.public', true); - }); + .innerJoin('permissions', 'permissions.repositories_id', 'repositories.id') + .where('permissions.users_id', userId) + .andWhere(function () { + this.where('permissions.permission', true).orWhere('repositories.public', true); + }); } else { q.innerJoin('repositories', 'repositories.id', 'builds.repositories_id') - .where('repositories.public', true); + .where('repositories.public', true); } if (filter === 'pr') { @@ -29,10 +29,10 @@ export function getBuilds( } q.orderBy('id', 'DESC') - .offset(offset) - .limit(limit); + .offset(offset) + .limit(limit); }) - .fetchAll({ withRelated: ['repository.permissions', 'jobs.runs' ]}) + .fetchAll({ withRelated: ['repository.permissions', 'jobs.runs'] }) .then(builds => { if (!builds) { reject(); @@ -48,6 +48,7 @@ export function getBuilds( job.status = job.runs[job.runs.length - 1].status; } + delete job.runs; return job; }); @@ -75,17 +76,19 @@ export function getBuild(id: number, userId?: number): Promise { return new Promise((resolve, reject) => { new Build() .query(q => q.where('id', id)) - .fetch({ withRelated: [{'repository.permissions': (query) => { + .fetch({ + withRelated: [{ + 'repository.permissions': (query) => { if (userId) { query.where('permissions.users_id', userId) - .andWhere('permissions.permission', true) - .orWhere('public', true); + .andWhere('permissions.permission', true) + .orWhere('public', true); } } }, - 'repository.access_token', - 'jobs.runs', - 'runs.job_runs'] + 'repository.access_token', + 'jobs.runs', + 'runs.job_runs'] }) .then(build => { if (!build) { @@ -140,13 +143,13 @@ export function getBuild(id: number, userId?: number): Promise { new BuildRun() .query(q => { q.innerJoin('builds', 'builds.id', 'build_runs.build_id') - .where('builds.repositories_id', build.repositories_id) - .andWhere('builds.id', '<=', build.id) - .whereNotNull('build_runs.start_time') - .whereNotNull('build_runs.end_time') - .orderBy('build_runs.id', 'desc'); + .where('builds.repositories_id', build.repositories_id) + .andWhere('builds.id', '<=', build.id) + .whereNotNull('build_runs.start_time') + .whereNotNull('build_runs.end_time') + .orderBy('build_runs.id', 'desc'); }) - .fetch({ withRelated: 'job_runs'}) + .fetch({ withRelated: 'job_runs' }) .then(lastBuild => { if (lastBuild) { build.lastBuild = lastBuild.toJSON(); @@ -165,45 +168,48 @@ export function getBuild(id: number, userId?: number): Promise { export function getLastBuild(userId?: number): Promise { return new Promise((resolve, reject) => { new Build().query(q => q.orderBy('id', 'desc')) - .fetch({ withRelated: [{'repository.permissions': (query) => { - if (userId) { - query.where('permissions.users_id', userId) - .andWhere('permissions.permission', true) - .orWhere('public', true); + .fetch({ + withRelated: [{ + 'repository.permissions': (query) => { + if (userId) { + query.where('permissions.users_id', userId) + .andWhere('permissions.permission', true) + .orWhere('public', true); + } } + }, + 'jobs.runs'] + }) + .then(build => { + if (!build) { + reject(build); } - }, - 'jobs.runs']}) - .then(build => { - if (!build) { - reject(build); - } - build = build.toJSON(); - build.jobs = build.jobs.map(job => { - if (job.runs.length > 0) { - job.end_time = job.runs[job.runs.length - 1].end_time; - job.start_time = job.runs[job.runs.length - 1].start_time; - job.status = job.runs[job.runs.length - 1].status; - } + build = build.toJSON(); + build.jobs = build.jobs.map(job => { + if (job.runs.length > 0) { + job.end_time = job.runs[job.runs.length - 1].end_time; + job.start_time = job.runs[job.runs.length - 1].start_time; + job.status = job.runs[job.runs.length - 1].status; + } - return job; - }); + return job; + }); - userId = parseInt(userId, 10); - if (build.repository.permissions && build.repository.permissions.length) { - let index = build.repository.permissions.findIndex(p => p.users_id === userId); - if (index !== -1 && build.repository.permissions[index].permission) { - build.hasPermission = true; + userId = parseInt(userId, 10); + if (build.repository.permissions && build.repository.permissions.length) { + let index = build.repository.permissions.findIndex(p => p.users_id === userId); + if (index !== -1 && build.repository.permissions[index].permission) { + build.hasPermission = true; + } else { + build.hasPermission = false; + } } else { build.hasPermission = false; } - } else { - build.hasPermission = false; - } - resolve(build); - }); + resolve(build); + }); }); } @@ -254,7 +260,7 @@ export function updateBuild(data: any): Promise { export function getBuildRepositoryId(buildId: number): Promise { return new Promise((resolve, reject) => { new Build({ id: buildId }).fetch() - .then(build => !build ? reject(build) : resolve(build.toJSON().repositories_id)); + .then(build => !build ? reject(build) : resolve(build.toJSON().repositories_id)); }); } @@ -274,50 +280,50 @@ export function getBuildStatus(buildId: number): Promise { return curr; } else if (curr === 'success' && accu !== 'failed' && accu !== 'running' && accu !== 'queued') { - return curr; + return curr; } return accu; }))); }); - }); + }); } export function getDepracatedBuilds(build: any): Promise { return new Promise((resolve, reject) => { new Build({ repositories_id: build.repositories_id }) - .query(q => { - q.whereNull('end_time') - .andWhereNot('id', build.id); + .query(q => { + q.whereNull('end_time') + .andWhereNot('id', build.id); - if (build.pr) { - q.where('pr', build.pr); - } - }) - .fetchAll() - .then(builds => { - if (!builds) { - reject(); - } + if (build.pr) { + q.where('pr', build.pr); + } + }) + .fetchAll() + .then(builds => { + if (!builds) { + reject(); + } - builds = builds.toJSON(); - if (!build.pr) { - builds = builds.filter(b => { - if (build.data.before) { - return build.data.before === b.data.before; - } else if (build.data.before_sha) { - return build.data.before_sha === b.data.before_sha; - } else if (build.data.object_attributes && build.data.object_attributes.before_sha) { - return build.data.object_attributes.before_sha - === b.data.object_attributes.before_sha; - } + builds = builds.toJSON(); + if (!build.pr) { + builds = builds.filter(b => { + if (build.data.before) { + return build.data.before === b.data.before; + } else if (build.data.before_sha) { + return build.data.before_sha === b.data.before_sha; + } else if (build.data.object_attributes && build.data.object_attributes.before_sha) { + return build.data.object_attributes.before_sha + === b.data.object_attributes.before_sha; + } - return false; - }); - } - builds = builds.map(b => b.id); + return false; + }); + } + builds = builds.map(b => b.id); - resolve(builds); - }); + resolve(builds); + }); }); } diff --git a/src/api/db/repository.ts b/src/api/db/repository.ts index 18f7a4c73..a7c7f673d 100644 --- a/src/api/db/repository.ts +++ b/src/api/db/repository.ts @@ -6,7 +6,7 @@ import { URL } from 'url'; export function getRepository(id: number, userId?: string): Promise { return new Promise((resolve, reject) => { new Repository({ id: id }) - .fetch({ withRelated: [ 'access_token', 'variables', 'permissions' ] }) + .fetch({ withRelated: ['access_token', 'variables', 'permissions'] }) .then(repo => { if (!repo) { reject(repo); @@ -31,7 +31,12 @@ export function getRepository(id: number, userId?: string): Promise { }); } -export function getRepositoryBuilds(id: number, limit: number, offset: number): Promise { +export function getRepositoryBuilds( + id: number, + limit: number, + offset: number, + userid: number +): Promise { return new Promise((resolve, reject) => { new Build().query(qb => { qb.where('repositories_id', id); @@ -39,29 +44,42 @@ export function getRepositoryBuilds(id: number, limit: number, offset: number): qb.limit(limit); qb.offset(offset); }) - .fetchAll({ withRelated: ['jobs.runs', 'repository.permissions'] }) - .then(builds => { - if (!builds) { - reject(); - } + .fetchAll({ withRelated: ['jobs.runs', 'repository.permissions'] }) + .then(builds => { + if (!builds) { + reject(); + } + + builds = builds.toJSON(); + builds = builds.map(build => { + build.jobs = build.jobs.map(job => { + if (job.runs.length > 0) { + job.end_time = job.runs[job.runs.length - 1].end_time; + job.start_time = job.runs[job.runs.length - 1].start_time; + job.status = job.runs[job.runs.length - 1].status; + } + + delete job.runs; + return job; + }); - builds = builds.toJSON(); - builds = builds.map(build => { - build.jobs = build.jobs.map(job => { - if (job.runs.length > 0) { - job.end_time = job.runs[job.runs.length - 1].end_time; - job.start_time = job.runs[job.runs.length - 1].start_time; - job.status = job.runs[job.runs.length - 1].status; + userid = Number(userid); + if (build.repository.permissions && build.repository.permissions.length) { + const index = build.repository.permissions.findIndex(p => p.users_id === userid); + if (index !== -1 && build.repository.permissions[index].permission) { + build.hasPermission = true; + } else { + build.hasPermission = false; + } + } else { + build.hasPermission = false; } - return job; + return build; }); - return build; - }); - - resolve(builds); - }).catch(err => reject(err)); + resolve(builds); + }).catch(err => reject(err)); }); } @@ -148,28 +166,32 @@ export function getRepositories(keyword: string, userId?: string): Promise { - if (userId) { - query.where('permissions.users_id', userId); - } else { - return false; - } - }}] }) - .then(repos => { - if (!repos) { - reject(); - } - repos = repos.toJSON(); + }).fetchAll({ + withRelated: [{ + 'permissions': (query) => { + if (userId) { + query.where('permissions.users_id', userId); + } else { + return false; + } + } + }] + }) + .then(repos => { + if (!repos) { + reject(); + } + repos = repos.toJSON(); - resolve(repos); - }); + resolve(repos); + }); }); } @@ -243,27 +265,27 @@ export function pingGitHubRepository(data: any): Promise { .then(repo => { if (!repo) { new Repository().save(saveData, { method: 'insert' }) - .then(result => { - if (!result) { - reject(result); - } else { - let repository = result.toJSON(); - return addRepositoryPermissionToEveryone(result.id) - .then(() => resolve(repository)) - .catch(err => reject(err)); - } - }) - .catch(err => reject(err)); - } else { - repo.save(saveData, { method: 'update', require: false }) - .then(result => { - if (!result) { - reject(result); - } else { - resolve(result.toJSON()); - } - }) - .catch(err => reject(err)); + .then(result => { + if (!result) { + reject(result); + } else { + let repository = result.toJSON(); + return addRepositoryPermissionToEveryone(result.id) + .then(() => resolve(repository)) + .catch(err => reject(err)); + } + }) + .catch(err => reject(err)); + } else { + repo.save(saveData, { method: 'update', require: false }) + .then(result => { + if (!result) { + reject(result); + } else { + resolve(result.toJSON()); + } + }) + .catch(err => reject(err)); } }); }); @@ -296,42 +318,42 @@ export function pingBitbucketRepository(data: any): Promise { } }) .catch(err => reject(err)); - } - }); -}); + } + }); + }); } export function pingGitLabRepository(data: any): Promise { return new Promise((resolve, reject) => { const saveData = generateGitLabRepositoryData(data); new Repository().where({ gitlab_id: saveData.gitlab_id }).fetch() - .then(repo => { - if (!repo) { - new Repository().save(saveData, { method: 'insert' }) - .then(result => { - if (!result) { - reject(result); - } else { - let repository = result.toJSON(); + .then(repo => { + if (!repo) { + new Repository().save(saveData, { method: 'insert' }) + .then(result => { + if (!result) { + reject(result); + } else { + let repository = result.toJSON(); - return addRepositoryPermissionToEveryone(repository.id) - .then(() => resolve(repository)) + return addRepositoryPermissionToEveryone(repository.id) + .then(() => resolve(repository)) + .catch(err => reject(err)); + } + }) + .catch(err => reject(err)); + } else { + repo.save(saveData, { method: 'update', require: false }) + .then(result => { + if (!result) { + reject(result); + } else { + resolve(result.toJSON()); + } + }) .catch(err => reject(err)); } - }) - .catch(err => reject(err)); - } else { - repo.save(saveData, { method: 'update', require: false }) - .then(result => { - if (!result) { - reject(result); - } else { - resolve(result.toJSON()); - } - }) - .catch(err => reject(err)); - } - }); + }); }); } @@ -342,28 +364,28 @@ export function pingGogsRepository(data: any): Promise { .then(repo => { if (!repo) { new Repository().save(saveData, { method: 'insert' }) - .then(result => { - if (!result) { - reject(result); - } else { - let repository = result.toJSON(); + .then(result => { + if (!result) { + reject(result); + } else { + let repository = result.toJSON(); - return addRepositoryPermissionToEveryone(repository.id) - .then(() => resolve(repository)) - .catch(err => reject(err)); - } - }) - .catch(err => reject(err)); - } else { - repo.save(saveData, { method: 'update', require: false }) - .then(result => { - if (!result) { - reject(result); - } else { - resolve(result.toJSON()); - } - }) - .catch(err => reject(err)); + return addRepositoryPermissionToEveryone(repository.id) + .then(() => resolve(repository)) + .catch(err => reject(err)); + } + }) + .catch(err => reject(err)); + } else { + repo.save(saveData, { method: 'update', require: false }) + .then(result => { + if (!result) { + reject(result); + } else { + resolve(result.toJSON()); + } + }) + .catch(err => reject(err)); } }); }); diff --git a/src/api/server-routes.ts b/src/api/server-routes.ts index 37709d701..84dfac479 100644 --- a/src/api/server-routes.ts +++ b/src/api/server-routes.ts @@ -294,11 +294,12 @@ export function repositoryRoutes(): express.Router { } }); - router.get('/:id/builds/:limit/:offset', (req: express.Request, res: express.Response) => { - getRepositoryBuilds(req.params.id, req.params.limit, req.params.offset) - .then(builds => res.status(200).json({ data: builds })) - .catch(err => res.status(200).json({ status: false })); - }); + router.get('/:id/builds/:limit/:offset/:userid?', + (req: express.Request, res: express.Response) => { + getRepositoryBuilds(req.params.id, req.params.limit, req.params.offset, req.params.userid) + .then(builds => res.status(200).json({ data: builds })) + .catch(err => res.status(200).json({ status: false })); + }); router.post('/add', (req: express.Request, res: express.Response) => { checkApiRequestAuth(req) diff --git a/src/app/components/app-build-item/app-build-item.component.html b/src/app/components/app-build-item/app-build-item.component.html index 0db9af41d..f1f5c855e 100644 --- a/src/app/components/app-build-item/app-build-item.component.html +++ b/src/app/components/app-build-item/app-build-item.component.html @@ -53,7 +53,7 @@ {{ currentTime - build?.minRunningJobStartTime | toTime }} {{ build?.maxCompletedJobTime | toTime }} -
+
diff --git a/src/app/components/app-repository/app-repository.component.ts b/src/app/components/app-repository/app-repository.component.ts index c7e01655c..df676d73a 100644 --- a/src/app/components/app-repository/app-repository.component.ts +++ b/src/app/components/app-repository/app-repository.component.ts @@ -81,7 +81,7 @@ export class AppRepositoryComponent implements OnInit, OnDestroy { }; this.accessTokensOptions = []; - this.yesNoOptions = [ { key: 0, value: 'No' }, { key: 1, value: 'Yes' } ]; + this.yesNoOptions = [{ key: 0, value: 'No' }, { key: 1, value: 'Yes' }]; this.repositoryProviders = [ { key: 'github', value: 'GitHub' }, { key: 'gitlab', value: 'GitLab' }, @@ -126,7 +126,7 @@ export class AppRepositoryComponent implements OnInit, OnDestroy { } if (event.data === 'build added' && event.repository_id - && event.repository_id === this.id && event.additionalData) { + && event.repository_id === this.id && event.additionalData) { if (!this.repo.builds) { this.repo.builds = []; } @@ -144,22 +144,22 @@ export class AppRepositoryComponent implements OnInit, OnDestroy { case 'job succeded': status = 'success'; this.repo.builds[index].jobs[jobIndex].end_time = event.additionalData; - break; + break; case 'job queued': status = 'queued'; - break; + break; case 'job started': status = 'running'; this.repo.builds[index].jobs[jobIndex].start_time = event.additionalData; - break; + break; case 'job failed': status = 'failed'; this.repo.builds[index].jobs[jobIndex].start_time = event.additionalData; - break; + break; case 'job stopped': status = 'failed'; this.repo.builds[index].jobs[jobIndex].end_time = event.additionalData; - break; + break; } this.repo.builds[index].jobs[jobIndex].status = status; @@ -219,14 +219,14 @@ export class AppRepositoryComponent implements OnInit, OnDestroy { }); } - fetchBuilds(e?: MouseEvent): void { + fetchBuilds(e?: Event): void { if (e && e.preventDefault) { e.preventDefault(); e.stopPropagation(); } this.fetching = true; - this.api.getRepositoryBuilds(this.id, this.limit, this.offset).subscribe(builds => { + this.api.getRepositoryBuilds(this.id, this.limit, this.offset, this.userId || null).subscribe(builds => { if (!this.repo.builds) { this.repo.builds = []; } diff --git a/src/app/services/api.service.ts b/src/app/services/api.service.ts index 13e5fb557..3b5b79d28 100644 --- a/src/app/services/api.service.ts +++ b/src/app/services/api.service.ts @@ -67,8 +67,12 @@ export class ApiService { return this.get(`${this.url}/repositories/id/${id}`, null, true); } - getRepositoryBuilds(id: string, limit: number, offset: number): Observable { - return this.get(`${this.url}/repositories/${id}/builds/${limit}/${offset}`, null, true); + getRepositoryBuilds(id: string, limit: number, offset: number, userId: string): Observable { + if (userId) { + return this.get(`${this.url}/repositories/${id}/builds/${limit}/${offset}/${userId}`, null, true); + } else { + return this.get(`${this.url}/repositories/${id}/builds/${limit}/${offset}`, null, true); + } } addRepository(data: any): Observable {