143 lines
4.7 KiB
JavaScript
143 lines
4.7 KiB
JavaScript
'use strict'
|
|
const knex = require('@/db/knex')
|
|
const { getStreamBranchByNameFactory } = require('@/modules/core/repositories/branches')
|
|
const {
|
|
getBranchCommitsTotalCountFactory,
|
|
getPaginatedBranchCommitsItemsFactory
|
|
} = require('@/modules/core/repositories/commits')
|
|
|
|
const Commits = () => knex('commits')
|
|
const StreamCommits = () => knex('stream_commits')
|
|
const { clamp } = require('lodash')
|
|
|
|
const getCommitsByUserIdBase = ({ userId, publicOnly, streamIdWhitelist }) => {
|
|
publicOnly = publicOnly !== false
|
|
|
|
const query = Commits()
|
|
.columns([
|
|
{ id: 'commits.id' },
|
|
'message',
|
|
'referencedObject',
|
|
'sourceApplication',
|
|
'totalChildrenCount',
|
|
'parents',
|
|
'commits.createdAt',
|
|
{ branchName: 'branches.name' },
|
|
{ streamId: 'stream_commits.streamId' },
|
|
{ streamName: 'streams.name' },
|
|
{ authorName: 'users.name' },
|
|
{ authorId: 'users.id' },
|
|
{ authorAvatar: 'users.avatar' }
|
|
])
|
|
.select()
|
|
.join('stream_commits', 'commits.id', 'stream_commits.commitId')
|
|
.join('streams', 'stream_commits.streamId', 'streams.id')
|
|
.join('branch_commits', 'commits.id', 'branch_commits.commitId')
|
|
.join('branches', 'branches.id', 'branch_commits.branchId')
|
|
.leftJoin('users', 'commits.author', 'users.id')
|
|
.where('author', userId)
|
|
|
|
if (publicOnly) query.andWhere('streams.isPublic', true)
|
|
if (streamIdWhitelist?.length) query.whereIn('streams.streamId', streamIdWhitelist)
|
|
|
|
return query
|
|
}
|
|
|
|
module.exports = {
|
|
async getCommitsTotalCountByBranchName({ streamId, branchName }) {
|
|
branchName = branchName.toLowerCase()
|
|
const getStreamBranchByName = getStreamBranchByNameFactory({ db: knex })
|
|
const myBranch = await getStreamBranchByName(streamId, branchName)
|
|
|
|
if (!myBranch) throw new Error(`Failed to find branch with name ${branchName}.`)
|
|
|
|
const getBranchCommitsTotalCount = getBranchCommitsTotalCountFactory({ db: knex })
|
|
|
|
return getBranchCommitsTotalCount({ branchId: myBranch.id })
|
|
},
|
|
|
|
async getCommitsByBranchName({ streamId, branchName, limit, cursor }) {
|
|
branchName = branchName.toLowerCase()
|
|
const getStreamBranchByName = getStreamBranchByNameFactory({ db: knex })
|
|
const myBranch = await getStreamBranchByName(streamId, branchName)
|
|
|
|
if (!myBranch) throw new Error(`Failed to find branch with name ${branchName}.`)
|
|
|
|
const getPaginatedBranchCommits = getPaginatedBranchCommitsItemsFactory({
|
|
db: knex
|
|
})
|
|
return getPaginatedBranchCommits({ branchId: myBranch.id, limit, cursor })
|
|
},
|
|
|
|
/**
|
|
* @returns {Promise<{
|
|
* commits: import('@/modules/core/helpers/types').CommitRecord[],
|
|
* cursor: string | null
|
|
* }>}
|
|
*/
|
|
async getCommitsByStreamId({ streamId, limit, cursor, ignoreGlobalsBranch }) {
|
|
limit = clamp(limit || 25, 0, 100)
|
|
if (!limit) return { commits: [], cursor: null }
|
|
|
|
const query = StreamCommits()
|
|
.columns([
|
|
{ id: 'commits.id' },
|
|
'message',
|
|
'referencedObject',
|
|
'sourceApplication',
|
|
'totalChildrenCount',
|
|
'parents',
|
|
'commits.createdAt',
|
|
{ branchName: 'branches.name' },
|
|
{ authorName: 'users.name' },
|
|
{ authorId: 'users.id' },
|
|
{ authorAvatar: 'users.avatar' },
|
|
knex.raw(`?? as "author"`, ['users.id'])
|
|
])
|
|
.select()
|
|
.join('commits', 'commits.id', 'stream_commits.commitId')
|
|
.join('branch_commits', 'commits.id', 'branch_commits.commitId')
|
|
.join('branches', 'branches.id', 'branch_commits.branchId')
|
|
.leftJoin('users', 'commits.author', 'users.id')
|
|
.where('stream_commits.streamId', streamId)
|
|
|
|
if (ignoreGlobalsBranch) query.andWhere('branches.name', '!=', 'globals')
|
|
|
|
if (cursor) query.andWhere('commits.createdAt', '<', cursor)
|
|
|
|
query.orderBy('commits.createdAt', 'desc').limit(limit)
|
|
|
|
const rows = await query
|
|
return {
|
|
commits: rows,
|
|
cursor: rows.length > 0 ? rows[rows.length - 1].createdAt.toISOString() : null
|
|
}
|
|
},
|
|
|
|
async getCommitsByUserId({ userId, limit, cursor, publicOnly, streamIdWhitelist }) {
|
|
limit = limit || 25
|
|
publicOnly = publicOnly !== false
|
|
|
|
const query = getCommitsByUserIdBase({ userId, publicOnly, streamIdWhitelist })
|
|
|
|
if (cursor) query.andWhere('commits.createdAt', '<', cursor)
|
|
|
|
query.orderBy('commits.createdAt', 'desc').limit(limit)
|
|
|
|
const rows = await query
|
|
return {
|
|
commits: rows,
|
|
cursor: rows.length > 0 ? rows[rows.length - 1].createdAt.toISOString() : null
|
|
}
|
|
},
|
|
|
|
async getCommitsTotalCountByUserId({ userId, publicOnly, streamIdWhitelist }) {
|
|
const query = getCommitsByUserIdBase({ userId, publicOnly, streamIdWhitelist })
|
|
query.clearSelect()
|
|
query.select(knex.raw('COUNT(*) as count'))
|
|
|
|
const [res] = await query
|
|
return parseInt(res.count)
|
|
}
|
|
}
|