mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 13:35:50 +01:00
(refs #341) Migrate service package.
This commit is contained in:
@@ -13,17 +13,17 @@ trait ActivityComponent extends TemplateComponent { self: Profile =>
|
|||||||
val message = column[String]("MESSAGE")
|
val message = column[String]("MESSAGE")
|
||||||
val additionalInfo = column[String]("ADDITIONAL_INFO")
|
val additionalInfo = column[String]("ADDITIONAL_INFO")
|
||||||
val activityDate = column[java.util.Date]("ACTIVITY_DATE")
|
val activityDate = column[java.util.Date]("ACTIVITY_DATE")
|
||||||
def * = (activityId, userName, repositoryName, activityUserName, activityType, message, additionalInfo.?, activityDate) <> (Activity.tupled, Activity.unapply)
|
def * = (userName, repositoryName, activityUserName, activityType, message, additionalInfo.?, activityDate, activityId) <> (Activity.tupled, Activity.unapply)
|
||||||
}
|
}
|
||||||
|
|
||||||
case class Activity(
|
case class Activity(
|
||||||
activityId: Int,
|
|
||||||
userName: String,
|
userName: String,
|
||||||
repositoryName: String,
|
repositoryName: String,
|
||||||
activityUserName: String,
|
activityUserName: String,
|
||||||
activityType: String,
|
activityType: String,
|
||||||
message: String,
|
message: String,
|
||||||
additionalInfo: Option[String],
|
additionalInfo: Option[String],
|
||||||
activityDate: java.util.Date
|
activityDate: java.util.Date,
|
||||||
|
activityId: Int = 0
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ trait IssueCommentComponent extends TemplateComponent { self: Profile =>
|
|||||||
userName: String,
|
userName: String,
|
||||||
repositoryName: String,
|
repositoryName: String,
|
||||||
issueId: Int,
|
issueId: Int,
|
||||||
commentId: Int,
|
commentId: Int = 0,
|
||||||
action: String,
|
action: String,
|
||||||
commentedUserName: String,
|
commentedUserName: String,
|
||||||
content: String,
|
content: String,
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ trait LabelComponent extends TemplateComponent { self: Profile =>
|
|||||||
case class Label(
|
case class Label(
|
||||||
userName: String,
|
userName: String,
|
||||||
repositoryName: String,
|
repositoryName: String,
|
||||||
labelId: Int,
|
labelId: Int = 0,
|
||||||
labelName: String,
|
labelName: String,
|
||||||
color: String){
|
color: String){
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ trait MilestoneComponent extends TemplateComponent { self: Profile =>
|
|||||||
case class Milestone(
|
case class Milestone(
|
||||||
userName: String,
|
userName: String,
|
||||||
repositoryName: String,
|
repositoryName: String,
|
||||||
milestoneId: Int,
|
milestoneId: Int = 0,
|
||||||
title: String,
|
title: String,
|
||||||
description: Option[String],
|
description: Option[String],
|
||||||
dueDate: Option[java.util.Date],
|
dueDate: Option[java.util.Date],
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package model
|
|||||||
|
|
||||||
import slick.driver.JdbcProfile
|
import slick.driver.JdbcProfile
|
||||||
|
|
||||||
//private[model]
|
|
||||||
trait Profile {
|
trait Profile {
|
||||||
val profile: JdbcProfile
|
val profile: JdbcProfile
|
||||||
import profile.simple._
|
import profile.simple._
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import model._
|
import model._
|
||||||
import scala.slick.driver.H2Driver.simple._
|
import profile.simple._
|
||||||
import Database.threadLocalSession
|
|
||||||
import service.SystemSettingsService.SystemSettings
|
import service.SystemSettingsService.SystemSettings
|
||||||
import util.StringUtil._
|
import util.StringUtil._
|
||||||
import model.GroupMember
|
|
||||||
import scala.Some
|
|
||||||
import model.Account
|
|
||||||
import util.LDAPUtil
|
import util.LDAPUtil
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
|
||||||
@@ -15,7 +11,7 @@ trait AccountService {
|
|||||||
|
|
||||||
private val logger = LoggerFactory.getLogger(classOf[AccountService])
|
private val logger = LoggerFactory.getLogger(classOf[AccountService])
|
||||||
|
|
||||||
def authenticate(settings: SystemSettings, userName: String, password: String): Option[Account] =
|
def authenticate(settings: SystemSettings, userName: String, password: String)(implicit s: Session): Option[Account] =
|
||||||
if(settings.ldapAuthentication){
|
if(settings.ldapAuthentication){
|
||||||
ldapAuthentication(settings, userName, password)
|
ldapAuthentication(settings, userName, password)
|
||||||
} else {
|
} else {
|
||||||
@@ -25,7 +21,7 @@ trait AccountService {
|
|||||||
/**
|
/**
|
||||||
* Authenticate by internal database.
|
* Authenticate by internal database.
|
||||||
*/
|
*/
|
||||||
private def defaultAuthentication(userName: String, password: String) = {
|
private def defaultAuthentication(userName: String, password: String)(implicit s: Session) = {
|
||||||
getAccountByUserName(userName).collect {
|
getAccountByUserName(userName).collect {
|
||||||
case account if(!account.isGroupAccount && account.password == sha1(password)) => Some(account)
|
case account if(!account.isGroupAccount && account.password == sha1(password)) => Some(account)
|
||||||
} getOrElse None
|
} getOrElse None
|
||||||
@@ -34,7 +30,8 @@ trait AccountService {
|
|||||||
/**
|
/**
|
||||||
* Authenticate by LDAP.
|
* Authenticate by LDAP.
|
||||||
*/
|
*/
|
||||||
private def ldapAuthentication(settings: SystemSettings, userName: String, password: String): Option[Account] = {
|
private def ldapAuthentication(settings: SystemSettings, userName: String, password: String)
|
||||||
|
(implicit s: Session): Option[Account] = {
|
||||||
LDAPUtil.authenticate(settings.ldap.get, userName, password) match {
|
LDAPUtil.authenticate(settings.ldap.get, userName, password) match {
|
||||||
case Right(ldapUserInfo) => {
|
case Right(ldapUserInfo) => {
|
||||||
// Create or update account by LDAP information
|
// Create or update account by LDAP information
|
||||||
@@ -70,20 +67,21 @@ trait AccountService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def getAccountByUserName(userName: String, includeRemoved: Boolean = false): Option[Account] =
|
def getAccountByUserName(userName: String, includeRemoved: Boolean = false)(implicit s: Session): Option[Account] =
|
||||||
Query(Accounts) filter(t => (t.userName is userName.bind) && (t.removed is false.bind, !includeRemoved)) firstOption
|
Accounts filter(t => (t.userName is userName.bind) && (t.removed is false.bind, !includeRemoved)) firstOption
|
||||||
|
|
||||||
def getAccountByMailAddress(mailAddress: String, includeRemoved: Boolean = false): Option[Account] =
|
def getAccountByMailAddress(mailAddress: String, includeRemoved: Boolean = false)(implicit s: Session): Option[Account] =
|
||||||
Query(Accounts) filter(t => (t.mailAddress.toLowerCase is mailAddress.toLowerCase.bind) && (t.removed is false.bind, !includeRemoved)) firstOption
|
Accounts filter(t => (t.mailAddress.toLowerCase is mailAddress.toLowerCase.bind) && (t.removed is false.bind, !includeRemoved)) firstOption
|
||||||
|
|
||||||
def getAllUsers(includeRemoved: Boolean = true): List[Account] =
|
def getAllUsers(includeRemoved: Boolean = true)(implicit s: Session): List[Account] =
|
||||||
if(includeRemoved){
|
if(includeRemoved){
|
||||||
Query(Accounts) sortBy(_.userName) list
|
Accounts sortBy(_.userName) list
|
||||||
} else {
|
} else {
|
||||||
Query(Accounts) filter (_.removed is false.bind) sortBy(_.userName) list
|
Accounts filter (_.removed is false.bind) sortBy(_.userName) list
|
||||||
}
|
}
|
||||||
|
|
||||||
def createAccount(userName: String, password: String, fullName: String, mailAddress: String, isAdmin: Boolean, url: Option[String]): Unit =
|
def createAccount(userName: String, password: String, fullName: String, mailAddress: String, isAdmin: Boolean, url: Option[String])
|
||||||
|
(implicit s: Session): Unit =
|
||||||
Accounts insert Account(
|
Accounts insert Account(
|
||||||
userName = userName,
|
userName = userName,
|
||||||
password = password,
|
password = password,
|
||||||
@@ -98,10 +96,10 @@ trait AccountService {
|
|||||||
isGroupAccount = false,
|
isGroupAccount = false,
|
||||||
isRemoved = false)
|
isRemoved = false)
|
||||||
|
|
||||||
def updateAccount(account: Account): Unit =
|
def updateAccount(account: Account)(implicit s: Session): Unit =
|
||||||
Accounts
|
Accounts
|
||||||
.filter { a => a.userName is account.userName.bind }
|
.filter { a => a.userName is account.userName.bind }
|
||||||
.map { a => a.password ~ a.fullName ~ a.mailAddress ~ a.isAdmin ~ a.url.? ~ a.registeredDate ~ a.updatedDate ~ a.lastLoginDate.? ~ a.removed }
|
.map { a => (a.password, a.fullName, a.mailAddress, a.isAdmin, a.url.?, a.registeredDate, a.updatedDate, a.lastLoginDate.?, a.removed) }
|
||||||
.update (
|
.update (
|
||||||
account.password,
|
account.password,
|
||||||
account.fullName,
|
account.fullName,
|
||||||
@@ -113,13 +111,13 @@ trait AccountService {
|
|||||||
account.lastLoginDate,
|
account.lastLoginDate,
|
||||||
account.isRemoved)
|
account.isRemoved)
|
||||||
|
|
||||||
def updateAvatarImage(userName: String, image: Option[String]): Unit =
|
def updateAvatarImage(userName: String, image: Option[String])(implicit s: Session): Unit =
|
||||||
Accounts.filter(_.userName is userName.bind).map(_.image.?).update(image)
|
Accounts.filter(_.userName is userName.bind).map(_.image.?).update(image)
|
||||||
|
|
||||||
def updateLastLoginDate(userName: String): Unit =
|
def updateLastLoginDate(userName: String)(implicit s: Session): Unit =
|
||||||
Accounts.filter(_.userName is userName.bind).map(_.lastLoginDate).update(currentDate)
|
Accounts.filter(_.userName is userName.bind).map(_.lastLoginDate).update(currentDate)
|
||||||
|
|
||||||
def createGroup(groupName: String, url: Option[String]): Unit =
|
def createGroup(groupName: String, url: Option[String])(implicit s: Session): Unit =
|
||||||
Accounts insert Account(
|
Accounts insert Account(
|
||||||
userName = groupName,
|
userName = groupName,
|
||||||
password = "",
|
password = "",
|
||||||
@@ -134,33 +132,33 @@ trait AccountService {
|
|||||||
isGroupAccount = true,
|
isGroupAccount = true,
|
||||||
isRemoved = false)
|
isRemoved = false)
|
||||||
|
|
||||||
def updateGroup(groupName: String, url: Option[String], removed: Boolean): Unit =
|
def updateGroup(groupName: String, url: Option[String], removed: Boolean)(implicit s: Session): Unit =
|
||||||
Accounts.filter(_.userName is groupName.bind).map(t => t.url.? ~ t.removed).update(url, removed)
|
Accounts.filter(_.userName is groupName.bind).map(t => t.url.? -> t.removed).update(url, removed)
|
||||||
|
|
||||||
def updateGroupMembers(groupName: String, members: List[(String, Boolean)]): Unit = {
|
def updateGroupMembers(groupName: String, members: List[(String, Boolean)])(implicit s: Session): Unit = {
|
||||||
Query(GroupMembers).filter(_.groupName is groupName.bind).delete
|
GroupMembers.filter(_.groupName is groupName.bind).delete
|
||||||
members.foreach { case (userName, isManager) =>
|
members.foreach { case (userName, isManager) =>
|
||||||
GroupMembers insert GroupMember (groupName, userName, isManager)
|
GroupMembers insert GroupMember (groupName, userName, isManager)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def getGroupMembers(groupName: String): List[GroupMember] =
|
def getGroupMembers(groupName: String)(implicit s: Session): List[GroupMember] =
|
||||||
Query(GroupMembers)
|
GroupMembers
|
||||||
.filter(_.groupName is groupName.bind)
|
.filter(_.groupName is groupName.bind)
|
||||||
.sortBy(_.userName)
|
.sortBy(_.userName)
|
||||||
.list
|
.list
|
||||||
|
|
||||||
def getGroupsByUserName(userName: String): List[String] =
|
def getGroupsByUserName(userName: String)(implicit s: Session): List[String] =
|
||||||
Query(GroupMembers)
|
GroupMembers
|
||||||
.filter(_.userName is userName.bind)
|
.filter(_.userName is userName.bind)
|
||||||
.sortBy(_.groupName)
|
.sortBy(_.groupName)
|
||||||
.map(_.groupName)
|
.map(_.groupName)
|
||||||
.list
|
.list
|
||||||
|
|
||||||
def removeUserRelatedData(userName: String): Unit = {
|
def removeUserRelatedData(userName: String)(implicit s: Session): Unit = {
|
||||||
Query(GroupMembers).filter(_.userName is userName.bind).delete
|
GroupMembers.filter(_.userName is userName.bind).delete
|
||||||
Query(Collaborators).filter(_.collaboratorName is userName.bind).delete
|
Collaborators.filter(_.collaboratorName is userName.bind).delete
|
||||||
Query(Repositories).filter(_.userName is userName.bind).delete
|
Repositories.filter(_.userName is userName.bind).delete
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import model._
|
import model._
|
||||||
import scala.slick.driver.H2Driver.simple._
|
import profile.simple._
|
||||||
import Database.threadLocalSession
|
|
||||||
|
|
||||||
trait ActivityService {
|
trait ActivityService {
|
||||||
|
|
||||||
def getActivitiesByUser(activityUserName: String, isPublic: Boolean): List[Activity] =
|
def getActivitiesByUser(activityUserName: String, isPublic: Boolean)(implicit s: Session): List[Activity] =
|
||||||
Activities
|
Activities
|
||||||
.innerJoin(Repositories).on((t1, t2) => t1.byRepository(t2.userName, t2.repositoryName))
|
.innerJoin(Repositories).on((t1, t2) => t1.byRepository(t2.userName, t2.repositoryName))
|
||||||
.filter { case (t1, t2) =>
|
.filter { case (t1, t2) =>
|
||||||
@@ -21,7 +20,7 @@ trait ActivityService {
|
|||||||
.take(30)
|
.take(30)
|
||||||
.list
|
.list
|
||||||
|
|
||||||
def getRecentActivities(): List[Activity] =
|
def getRecentActivities(implicit s: Session): List[Activity] =
|
||||||
Activities
|
Activities
|
||||||
.innerJoin(Repositories).on((t1, t2) => t1.byRepository(t2.userName, t2.repositoryName))
|
.innerJoin(Repositories).on((t1, t2) => t1.byRepository(t2.userName, t2.repositoryName))
|
||||||
.filter { case (t1, t2) => t2.isPrivate is false.bind }
|
.filter { case (t1, t2) => t2.isPrivate is false.bind }
|
||||||
@@ -30,124 +29,136 @@ trait ActivityService {
|
|||||||
.take(30)
|
.take(30)
|
||||||
.list
|
.list
|
||||||
|
|
||||||
|
def recordCreateRepositoryActivity(userName: String, repositoryName: String, activityUserName: String)
|
||||||
def recordCreateRepositoryActivity(userName: String, repositoryName: String, activityUserName: String): Unit =
|
(implicit s: Session): Unit =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"create_repository",
|
"create_repository",
|
||||||
s"[user:${activityUserName}] created [repo:${userName}/${repositoryName}]",
|
s"[user:${activityUserName}] created [repo:${userName}/${repositoryName}]",
|
||||||
None,
|
None,
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCreateIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
def recordCreateIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"open_issue",
|
"open_issue",
|
||||||
s"[user:${activityUserName}] opened issue [issue:${userName}/${repositoryName}#${issueId}]",
|
s"[user:${activityUserName}] opened issue [issue:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(title),
|
Some(title),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCloseIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
def recordCloseIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"close_issue",
|
"close_issue",
|
||||||
s"[user:${activityUserName}] closed issue [issue:${userName}/${repositoryName}#${issueId}]",
|
s"[user:${activityUserName}] closed issue [issue:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(title),
|
Some(title),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordClosePullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
def recordClosePullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"close_issue",
|
"close_issue",
|
||||||
s"[user:${activityUserName}] closed pull request [pullreq:${userName}/${repositoryName}#${issueId}]",
|
s"[user:${activityUserName}] closed pull request [pullreq:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(title),
|
Some(title),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordReopenIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
def recordReopenIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"reopen_issue",
|
"reopen_issue",
|
||||||
s"[user:${activityUserName}] reopened issue [issue:${userName}/${repositoryName}#${issueId}]",
|
s"[user:${activityUserName}] reopened issue [issue:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(title),
|
Some(title),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCommentIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, comment: String): Unit =
|
def recordCommentIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, comment: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"comment_issue",
|
"comment_issue",
|
||||||
s"[user:${activityUserName}] commented on issue [issue:${userName}/${repositoryName}#${issueId}]",
|
s"[user:${activityUserName}] commented on issue [issue:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(cut(comment, 200)),
|
Some(cut(comment, 200)),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCommentPullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, comment: String): Unit =
|
def recordCommentPullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, comment: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"comment_issue",
|
"comment_issue",
|
||||||
s"[user:${activityUserName}] commented on pull request [pullreq:${userName}/${repositoryName}#${issueId}]",
|
s"[user:${activityUserName}] commented on pull request [pullreq:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(cut(comment, 200)),
|
Some(cut(comment, 200)),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCreateWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String) =
|
def recordCreateWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"create_wiki",
|
"create_wiki",
|
||||||
s"[user:${activityUserName}] created the [repo:${userName}/${repositoryName}] wiki",
|
s"[user:${activityUserName}] created the [repo:${userName}/${repositoryName}] wiki",
|
||||||
Some(pageName),
|
Some(pageName),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordEditWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String, commitId: String) =
|
def recordEditWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String, commitId: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"edit_wiki",
|
"edit_wiki",
|
||||||
s"[user:${activityUserName}] edited the [repo:${userName}/${repositoryName}] wiki",
|
s"[user:${activityUserName}] edited the [repo:${userName}/${repositoryName}] wiki",
|
||||||
Some(pageName + ":" + commitId),
|
Some(pageName + ":" + commitId),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordPushActivity(userName: String, repositoryName: String, activityUserName: String,
|
def recordPushActivity(userName: String, repositoryName: String, activityUserName: String,
|
||||||
branchName: String, commits: List[util.JGitUtil.CommitInfo]) =
|
branchName: String, commits: List[util.JGitUtil.CommitInfo])(implicit s: Session): Unit =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"push",
|
"push",
|
||||||
s"[user:${activityUserName}] pushed to [branch:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]",
|
s"[user:${activityUserName}] pushed to [branch:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]",
|
||||||
Some(commits.map { commit => commit.id + ":" + commit.shortMessage }.mkString("\n")),
|
Some(commits.map { commit => commit.id + ":" + commit.shortMessage }.mkString("\n")),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCreateTagActivity(userName: String, repositoryName: String, activityUserName: String,
|
def recordCreateTagActivity(userName: String, repositoryName: String, activityUserName: String,
|
||||||
tagName: String, commits: List[util.JGitUtil.CommitInfo]) =
|
tagName: String, commits: List[util.JGitUtil.CommitInfo])(implicit s: Session): Unit =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"create_tag",
|
"create_tag",
|
||||||
s"[user:${activityUserName}] created tag [tag:${userName}/${repositoryName}#${tagName}] at [repo:${userName}/${repositoryName}]",
|
s"[user:${activityUserName}] created tag [tag:${userName}/${repositoryName}#${tagName}] at [repo:${userName}/${repositoryName}]",
|
||||||
None,
|
None,
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordDeleteTagActivity(userName: String, repositoryName: String, activityUserName: String,
|
def recordDeleteTagActivity(userName: String, repositoryName: String, activityUserName: String,
|
||||||
tagName: String, commits: List[util.JGitUtil.CommitInfo]) =
|
tagName: String, commits: List[util.JGitUtil.CommitInfo])(implicit s: Session): Unit =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"delete_tag",
|
"delete_tag",
|
||||||
s"[user:${activityUserName}] deleted tag ${tagName} at [repo:${userName}/${repositoryName}]",
|
s"[user:${activityUserName}] deleted tag ${tagName} at [repo:${userName}/${repositoryName}]",
|
||||||
None,
|
None,
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCreateBranchActivity(userName: String, repositoryName: String, activityUserName: String, branchName: String) =
|
def recordCreateBranchActivity(userName: String, repositoryName: String, activityUserName: String, branchName: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"create_branch",
|
"create_branch",
|
||||||
s"[user:${activityUserName}] created branch [branch:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]",
|
s"[user:${activityUserName}] created branch [branch:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]",
|
||||||
None,
|
None,
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordDeleteBranchActivity(userName: String, repositoryName: String, activityUserName: String, branchName: String) =
|
def recordDeleteBranchActivity(userName: String, repositoryName: String, activityUserName: String, branchName: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"delete_branch",
|
"delete_branch",
|
||||||
s"[user:${activityUserName}] deleted branch ${branchName} at [repo:${userName}/${repositoryName}]",
|
s"[user:${activityUserName}] deleted branch ${branchName} at [repo:${userName}/${repositoryName}]",
|
||||||
None,
|
None,
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordForkActivity(userName: String, repositoryName: String, activityUserName: String) =
|
def recordForkActivity(userName: String, repositoryName: String, activityUserName: String)(implicit s: Session): Unit =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"fork",
|
"fork",
|
||||||
s"[user:${activityUserName}] forked [repo:${userName}/${repositoryName}] to [repo:${activityUserName}/${repositoryName}]",
|
s"[user:${activityUserName}] forked [repo:${userName}/${repositoryName}] to [repo:${activityUserName}/${repositoryName}]",
|
||||||
None,
|
None,
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordPullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
def recordPullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"open_pullreq",
|
"open_pullreq",
|
||||||
s"[user:${activityUserName}] opened pull request [pullreq:${userName}/${repositoryName}#${issueId}]",
|
s"[user:${activityUserName}] opened pull request [pullreq:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(title),
|
Some(title),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordMergeActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, message: String): Unit =
|
def recordMergeActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, message: String)
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
(implicit s: Session): Unit =
|
||||||
|
Activities insert Activity(userName, repositoryName, activityUserName,
|
||||||
"merge_pullreq",
|
"merge_pullreq",
|
||||||
s"[user:${activityUserName}] merged pull request [pullreq:${userName}/${repositoryName}#${issueId}]",
|
s"[user:${activityUserName}] merged pull request [pullreq:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(message),
|
Some(message),
|
||||||
|
|||||||
@@ -1,33 +1,32 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import scala.slick.driver.H2Driver.simple._
|
|
||||||
import Database.threadLocalSession
|
|
||||||
import scala.slick.jdbc.{StaticQuery => Q}
|
import scala.slick.jdbc.{StaticQuery => Q}
|
||||||
import Q.interpolation
|
import Q.interpolation
|
||||||
|
|
||||||
import model._
|
import model._
|
||||||
|
import profile.simple._
|
||||||
import util.Implicits._
|
import util.Implicits._
|
||||||
import util.StringUtil._
|
import util.StringUtil._
|
||||||
|
|
||||||
trait IssuesService {
|
trait IssuesService {
|
||||||
import IssuesService._
|
import IssuesService._
|
||||||
|
|
||||||
def getIssue(owner: String, repository: String, issueId: String) =
|
def getIssue(owner: String, repository: String, issueId: String)(implicit s: Session) =
|
||||||
if (issueId forall (_.isDigit))
|
if (issueId forall (_.isDigit))
|
||||||
Query(Issues) filter (_.byPrimaryKey(owner, repository, issueId.toInt)) firstOption
|
Issues filter (_.byPrimaryKey(owner, repository, issueId.toInt)) firstOption
|
||||||
else None
|
else None
|
||||||
|
|
||||||
def getComments(owner: String, repository: String, issueId: Int) =
|
def getComments(owner: String, repository: String, issueId: Int)(implicit s: Session) =
|
||||||
Query(IssueComments) filter (_.byIssue(owner, repository, issueId)) list
|
IssueComments filter (_.byIssue(owner, repository, issueId)) list
|
||||||
|
|
||||||
def getComment(owner: String, repository: String, commentId: String) =
|
def getComment(owner: String, repository: String, commentId: String)(implicit s: Session) =
|
||||||
if (commentId forall (_.isDigit))
|
if (commentId forall (_.isDigit))
|
||||||
Query(IssueComments) filter { t =>
|
IssueComments filter { t =>
|
||||||
t.byPrimaryKey(commentId.toInt) && t.byRepository(owner, repository)
|
t.byPrimaryKey(commentId.toInt) && t.byRepository(owner, repository)
|
||||||
} firstOption
|
} firstOption
|
||||||
else None
|
else None
|
||||||
|
|
||||||
def getIssueLabels(owner: String, repository: String, issueId: Int) =
|
def getIssueLabels(owner: String, repository: String, issueId: Int)(implicit s: Session) =
|
||||||
IssueLabels
|
IssueLabels
|
||||||
.innerJoin(Labels).on { (t1, t2) =>
|
.innerJoin(Labels).on { (t1, t2) =>
|
||||||
t1.byLabel(t2.userName, t2.repositoryName, t2.labelId)
|
t1.byLabel(t2.userName, t2.repositoryName, t2.labelId)
|
||||||
@@ -36,8 +35,8 @@ trait IssuesService {
|
|||||||
.map ( _._2 )
|
.map ( _._2 )
|
||||||
.list
|
.list
|
||||||
|
|
||||||
def getIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int) =
|
def getIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int)(implicit s: Session) =
|
||||||
Query(IssueLabels) filter (_.byPrimaryKey(owner, repository, issueId, labelId)) firstOption
|
IssueLabels filter (_.byPrimaryKey(owner, repository, issueId, labelId)) firstOption
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the count of the search result against issues.
|
* Returns the count of the search result against issues.
|
||||||
@@ -49,7 +48,8 @@ trait IssuesService {
|
|||||||
* @return the count of the search result
|
* @return the count of the search result
|
||||||
*/
|
*/
|
||||||
def countIssue(condition: IssueSearchCondition, filterUser: Map[String, String], onlyPullRequest: Boolean,
|
def countIssue(condition: IssueSearchCondition, filterUser: Map[String, String], onlyPullRequest: Boolean,
|
||||||
repos: (String, String)*): Int =
|
repos: (String, String)*)(implicit s: Session): Int =
|
||||||
|
// TODO check SQL
|
||||||
Query(searchIssueQuery(repos, condition, filterUser, onlyPullRequest).length).first
|
Query(searchIssueQuery(repos, condition, filterUser, onlyPullRequest).length).first
|
||||||
/**
|
/**
|
||||||
* Returns the Map which contains issue count for each labels.
|
* Returns the Map which contains issue count for each labels.
|
||||||
@@ -61,7 +61,7 @@ trait IssuesService {
|
|||||||
* @return the Map which contains issue count for each labels (key is label name, value is issue count)
|
* @return the Map which contains issue count for each labels (key is label name, value is issue count)
|
||||||
*/
|
*/
|
||||||
def countIssueGroupByLabels(owner: String, repository: String, condition: IssueSearchCondition,
|
def countIssueGroupByLabels(owner: String, repository: String, condition: IssueSearchCondition,
|
||||||
filterUser: Map[String, String]): Map[String, Int] = {
|
filterUser: Map[String, String])(implicit s: Session): Map[String, Int] = {
|
||||||
|
|
||||||
searchIssueQuery(Seq(owner -> repository), condition.copy(labels = Set.empty), filterUser, false)
|
searchIssueQuery(Seq(owner -> repository), condition.copy(labels = Set.empty), filterUser, false)
|
||||||
.innerJoin(IssueLabels).on { (t1, t2) =>
|
.innerJoin(IssueLabels).on { (t1, t2) =>
|
||||||
@@ -74,7 +74,7 @@ trait IssuesService {
|
|||||||
t3.labelName
|
t3.labelName
|
||||||
}
|
}
|
||||||
.map { case (labelName, t) =>
|
.map { case (labelName, t) =>
|
||||||
labelName ~ t.length
|
labelName -> t.length
|
||||||
}
|
}
|
||||||
.toMap
|
.toMap
|
||||||
}
|
}
|
||||||
@@ -90,13 +90,13 @@ trait IssuesService {
|
|||||||
*/
|
*/
|
||||||
def countIssueGroupByRepository(
|
def countIssueGroupByRepository(
|
||||||
condition: IssueSearchCondition, filterUser: Map[String, String], onlyPullRequest: Boolean,
|
condition: IssueSearchCondition, filterUser: Map[String, String], onlyPullRequest: Boolean,
|
||||||
repos: (String, String)*): List[(String, String, Int)] = {
|
repos: (String, String)*)(implicit s: Session): List[(String, String, Int)] = {
|
||||||
searchIssueQuery(repos, condition.copy(repo = None), filterUser, onlyPullRequest)
|
searchIssueQuery(repos, condition.copy(repo = None), filterUser, onlyPullRequest)
|
||||||
.groupBy { t =>
|
.groupBy { t =>
|
||||||
t.userName ~ t.repositoryName
|
t.userName -> t.repositoryName
|
||||||
}
|
}
|
||||||
.map { case (repo, t) =>
|
.map { case (repo, t) =>
|
||||||
repo ~ t.length
|
repo -> t.length
|
||||||
}
|
}
|
||||||
.sortBy(_._3 desc)
|
.sortBy(_._3 desc)
|
||||||
.list
|
.list
|
||||||
@@ -114,7 +114,8 @@ trait IssuesService {
|
|||||||
* @return the search result (list of tuples which contain issue, labels and comment count)
|
* @return the search result (list of tuples which contain issue, labels and comment count)
|
||||||
*/
|
*/
|
||||||
def searchIssue(condition: IssueSearchCondition, filterUser: Map[String, String], onlyPullRequest: Boolean,
|
def searchIssue(condition: IssueSearchCondition, filterUser: Map[String, String], onlyPullRequest: Boolean,
|
||||||
offset: Int, limit: Int, repos: (String, String)*): List[(Issue, List[Label], Int)] = {
|
offset: Int, limit: Int, repos: (String, String)*)
|
||||||
|
(implicit s: Session): List[(Issue, List[Label], Int)] = {
|
||||||
|
|
||||||
// get issues and comment count and labels
|
// get issues and comment count and labels
|
||||||
searchIssueQuery(repos, condition, filterUser, onlyPullRequest)
|
searchIssueQuery(repos, condition, filterUser, onlyPullRequest)
|
||||||
@@ -157,8 +158,8 @@ trait IssuesService {
|
|||||||
* Assembles query for conditional issue searching.
|
* Assembles query for conditional issue searching.
|
||||||
*/
|
*/
|
||||||
private def searchIssueQuery(repos: Seq[(String, String)], condition: IssueSearchCondition,
|
private def searchIssueQuery(repos: Seq[(String, String)], condition: IssueSearchCondition,
|
||||||
filterUser: Map[String, String], onlyPullRequest: Boolean) =
|
filterUser: Map[String, String], onlyPullRequest: Boolean)(implicit s: Session) =
|
||||||
Query(Issues) filter { t1 =>
|
Issues filter { t1 =>
|
||||||
condition.repo
|
condition.repo
|
||||||
.map { _.split('/') match { case array => Seq(array(0) -> array(1)) } }
|
.map { _.split('/') match { case array => Seq(array(0) -> array(1)) } }
|
||||||
.getOrElse (repos)
|
.getOrElse (repos)
|
||||||
@@ -182,7 +183,8 @@ trait IssuesService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def createIssue(owner: String, repository: String, loginUser: String, title: String, content: Option[String],
|
def createIssue(owner: String, repository: String, loginUser: String, title: String, content: Option[String],
|
||||||
assignedUserName: Option[String], milestoneId: Option[Int], isPullRequest: Boolean = false) =
|
assignedUserName: Option[String], milestoneId: Option[Int],
|
||||||
|
isPullRequest: Boolean = false)(implicit s: Session) =
|
||||||
// next id number
|
// next id number
|
||||||
sql"SELECT ISSUE_ID + 1 FROM ISSUE_ID WHERE USER_NAME = $owner AND REPOSITORY_NAME = $repository FOR UPDATE".as[Int]
|
sql"SELECT ISSUE_ID + 1 FROM ISSUE_ID WHERE USER_NAME = $owner AND REPOSITORY_NAME = $repository FOR UPDATE".as[Int]
|
||||||
.firstOption.filter { id =>
|
.firstOption.filter { id =>
|
||||||
@@ -207,55 +209,57 @@ trait IssuesService {
|
|||||||
.update (id) > 0
|
.update (id) > 0
|
||||||
} get
|
} get
|
||||||
|
|
||||||
def registerIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int) =
|
def registerIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int)(implicit s: Session) =
|
||||||
IssueLabels insert (IssueLabel(owner, repository, issueId, labelId))
|
IssueLabels insert IssueLabel(owner, repository, issueId, labelId)
|
||||||
|
|
||||||
def deleteIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int) =
|
def deleteIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int)(implicit s: Session) =
|
||||||
IssueLabels filter(_.byPrimaryKey(owner, repository, issueId, labelId)) delete
|
IssueLabels filter(_.byPrimaryKey(owner, repository, issueId, labelId)) delete
|
||||||
|
|
||||||
def createComment(owner: String, repository: String, loginUser: String,
|
def createComment(owner: String, repository: String, loginUser: String,
|
||||||
issueId: Int, content: String, action: String) =
|
issueId: Int, content: String, action: String)(implicit s: Session): Int =
|
||||||
IssueComments.autoInc insert (
|
IssueComments.autoInc insert IssueComment(
|
||||||
owner,
|
userName = owner,
|
||||||
repository,
|
repositoryName = repository,
|
||||||
issueId,
|
issueId = issueId,
|
||||||
action,
|
action = action,
|
||||||
loginUser,
|
commentedUserName = loginUser,
|
||||||
content,
|
content = content,
|
||||||
currentDate,
|
registeredDate = currentDate,
|
||||||
currentDate)
|
updatedDate = currentDate)
|
||||||
|
|
||||||
def updateIssue(owner: String, repository: String, issueId: Int,
|
def updateIssue(owner: String, repository: String, issueId: Int,
|
||||||
title: String, content: Option[String]) =
|
title: String, content: Option[String])(implicit s: Session) =
|
||||||
Issues
|
Issues
|
||||||
.filter (_.byPrimaryKey(owner, repository, issueId))
|
.filter (_.byPrimaryKey(owner, repository, issueId))
|
||||||
.map { t =>
|
.map { t =>
|
||||||
t.title ~ t.content.? ~ t.updatedDate
|
(t.title, t.content.?, t.updatedDate)
|
||||||
}
|
}
|
||||||
.update (title, content, currentDate)
|
.update (title, content, currentDate)
|
||||||
|
|
||||||
def updateAssignedUserName(owner: String, repository: String, issueId: Int, assignedUserName: Option[String]) =
|
def updateAssignedUserName(owner: String, repository: String, issueId: Int,
|
||||||
|
assignedUserName: Option[String])(implicit s: Session) =
|
||||||
Issues.filter (_.byPrimaryKey(owner, repository, issueId)).map(_.assignedUserName?).update (assignedUserName)
|
Issues.filter (_.byPrimaryKey(owner, repository, issueId)).map(_.assignedUserName?).update (assignedUserName)
|
||||||
|
|
||||||
def updateMilestoneId(owner: String, repository: String, issueId: Int, milestoneId: Option[Int]) =
|
def updateMilestoneId(owner: String, repository: String, issueId: Int,
|
||||||
|
milestoneId: Option[Int])(implicit s: Session) =
|
||||||
Issues.filter (_.byPrimaryKey(owner, repository, issueId)).map(_.milestoneId?).update (milestoneId)
|
Issues.filter (_.byPrimaryKey(owner, repository, issueId)).map(_.milestoneId?).update (milestoneId)
|
||||||
|
|
||||||
def updateComment(commentId: Int, content: String) =
|
def updateComment(commentId: Int, content: String)(implicit s: Session) =
|
||||||
IssueComments
|
IssueComments
|
||||||
.filter (_.byPrimaryKey(commentId))
|
.filter (_.byPrimaryKey(commentId))
|
||||||
.map { t =>
|
.map { t =>
|
||||||
t.content ~ t.updatedDate
|
t.content -> t.updatedDate
|
||||||
}
|
}
|
||||||
.update (content, currentDate)
|
.update (content, currentDate)
|
||||||
|
|
||||||
def deleteComment(commentId: Int) =
|
def deleteComment(commentId: Int)(implicit s: Session) =
|
||||||
IssueComments filter (_.byPrimaryKey(commentId)) delete
|
IssueComments filter (_.byPrimaryKey(commentId)) delete
|
||||||
|
|
||||||
def updateClosed(owner: String, repository: String, issueId: Int, closed: Boolean) =
|
def updateClosed(owner: String, repository: String, issueId: Int, closed: Boolean)(implicit s: Session) =
|
||||||
Issues
|
Issues
|
||||||
.filter (_.byPrimaryKey(owner, repository, issueId))
|
.filter (_.byPrimaryKey(owner, repository, issueId))
|
||||||
.map { t =>
|
.map { t =>
|
||||||
t.closed ~ t.updatedDate
|
t.closed -> t.updatedDate
|
||||||
}
|
}
|
||||||
.update (closed, currentDate)
|
.update (closed, currentDate)
|
||||||
|
|
||||||
@@ -267,8 +271,9 @@ trait IssuesService {
|
|||||||
* @param query the keywords separated by whitespace.
|
* @param query the keywords separated by whitespace.
|
||||||
* @return issues with comment count and matched content of issue or comment
|
* @return issues with comment count and matched content of issue or comment
|
||||||
*/
|
*/
|
||||||
def searchIssuesByKeyword(owner: String, repository: String, query: String): List[(Issue, Int, String)] = {
|
def searchIssuesByKeyword(owner: String, repository: String, query: String)
|
||||||
import scala.slick.driver.H2Driver.likeEncode
|
(implicit s: Session): List[(Issue, Int, String)] = {
|
||||||
|
import slick.driver.JdbcDriver.likeEncode
|
||||||
val keywords = splitWords(query.toLowerCase)
|
val keywords = splitWords(query.toLowerCase)
|
||||||
|
|
||||||
// Search Issue
|
// Search Issue
|
||||||
@@ -304,7 +309,7 @@ trait IssuesService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issues.union(comments).sortBy { case (issue, commentId, _, _) =>
|
issues.union(comments).sortBy { case (issue, commentId, _, _) =>
|
||||||
issue.issueId ~ commentId
|
issue.issueId -> commentId
|
||||||
}.list.splitWith { case ((issue1, _, _, _), (issue2, _, _, _)) =>
|
}.list.splitWith { case ((issue1, _, _, _), (issue2, _, _, _)) =>
|
||||||
issue1.issueId == issue2.issueId
|
issue1.issueId == issue2.issueId
|
||||||
}.map { _.head match {
|
}.map { _.head match {
|
||||||
@@ -313,7 +318,7 @@ trait IssuesService {
|
|||||||
}.toList
|
}.toList
|
||||||
}
|
}
|
||||||
|
|
||||||
def closeIssuesFromMessage(message: String, userName: String, owner: String, repository: String) = {
|
def closeIssuesFromMessage(message: String, userName: String, owner: String, repository: String)(implicit s: Session) = {
|
||||||
extractCloseId(message).foreach { issueId =>
|
extractCloseId(message).foreach { issueId =>
|
||||||
for(issue <- getIssue(owner, repository, issueId) if !issue.closed){
|
for(issue <- getIssue(owner, repository, issueId) if !issue.closed){
|
||||||
createComment(owner, repository, userName, issue.issueId, "Close", "close")
|
createComment(owner, repository, userName, issue.issueId, "Close", "close")
|
||||||
|
|||||||
@@ -1,26 +1,31 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import scala.slick.driver.H2Driver.simple._
|
|
||||||
import Database.threadLocalSession
|
|
||||||
|
|
||||||
import model._
|
import model._
|
||||||
|
import profile.simple._
|
||||||
|
|
||||||
trait LabelsService {
|
trait LabelsService {
|
||||||
|
|
||||||
def getLabels(owner: String, repository: String): List[Label] =
|
def getLabels(owner: String, repository: String)(implicit s: Session): List[Label] =
|
||||||
Query(Labels).filter(_.byRepository(owner, repository)).sortBy(_.labelName asc).list
|
Labels.filter(_.byRepository(owner, repository)).sortBy(_.labelName asc).list
|
||||||
|
|
||||||
def getLabel(owner: String, repository: String, labelId: Int): Option[Label] =
|
def getLabel(owner: String, repository: String, labelId: Int)(implicit s: Session): Option[Label] =
|
||||||
Query(Labels).filter(_.byPrimaryKey(owner, repository, labelId)).firstOption
|
Labels.filter(_.byPrimaryKey(owner, repository, labelId)).firstOption
|
||||||
|
|
||||||
def createLabel(owner: String, repository: String, labelName: String, color: String): Unit =
|
def createLabel(owner: String, repository: String, labelName: String, color: String)(implicit s: Session): Unit =
|
||||||
Labels.ins insert (owner, repository, labelName, color)
|
Labels insert Label(
|
||||||
|
userName = owner,
|
||||||
|
repositoryName = repository,
|
||||||
|
labelName = labelName,
|
||||||
|
color = color
|
||||||
|
)
|
||||||
|
|
||||||
def updateLabel(owner: String, repository: String, labelId: Int, labelName: String, color: String): Unit =
|
def updateLabel(owner: String, repository: String, labelId: Int, labelName: String, color: String)
|
||||||
Labels.filter(_.byPrimaryKey(owner, repository, labelId)).map(t => t.labelName ~ t.color)
|
(implicit s: Session): Unit =
|
||||||
|
Labels.filter(_.byPrimaryKey(owner, repository, labelId))
|
||||||
|
.map(t => t.labelName -> t.color)
|
||||||
.update(labelName, color)
|
.update(labelName, color)
|
||||||
|
|
||||||
def deleteLabel(owner: String, repository: String, labelId: Int): Unit = {
|
def deleteLabel(owner: String, repository: String, labelId: Int)(implicit s: Session): Unit = {
|
||||||
IssueLabels.filter(_.byLabel(owner, repository, labelId)).delete
|
IssueLabels.filter(_.byLabel(owner, repository, labelId)).delete
|
||||||
Labels.filter(_.byPrimaryKey(owner, repository, labelId)).delete
|
Labels.filter(_.byPrimaryKey(owner, repository, labelId)).delete
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,39 +1,46 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import scala.slick.driver.H2Driver.simple._
|
|
||||||
import Database.threadLocalSession
|
|
||||||
|
|
||||||
import model._
|
import model._
|
||||||
|
import profile.simple._
|
||||||
|
|
||||||
trait MilestonesService {
|
trait MilestonesService {
|
||||||
|
|
||||||
def createMilestone(owner: String, repository: String, title: String, description: Option[String],
|
def createMilestone(owner: String, repository: String, title: String, description: Option[String],
|
||||||
dueDate: Option[java.util.Date]): Unit =
|
dueDate: Option[java.util.Date])(implicit s: Session): Unit =
|
||||||
Milestones.ins insert (owner, repository, title, description, dueDate, None)
|
Milestones insert Milestone(
|
||||||
|
userName = owner,
|
||||||
|
repositoryName = repository,
|
||||||
|
title = title,
|
||||||
|
description = description,
|
||||||
|
dueDate = dueDate,
|
||||||
|
closedDate = None
|
||||||
|
)
|
||||||
|
|
||||||
def updateMilestone(milestone: Milestone): Unit =
|
def updateMilestone(milestone: Milestone)(implicit s: Session): Unit =
|
||||||
Milestones
|
Milestones
|
||||||
.filter (t => t.byPrimaryKey(milestone.userName, milestone.repositoryName, milestone.milestoneId))
|
.filter (t => t.byPrimaryKey(milestone.userName, milestone.repositoryName, milestone.milestoneId))
|
||||||
.map (t => t.title ~ t.description.? ~ t.dueDate.? ~ t.closedDate.?)
|
.map (t => (t.title, t.description.?, t.dueDate.?, t.closedDate.?))
|
||||||
.update (milestone.title, milestone.description, milestone.dueDate, milestone.closedDate)
|
.update (milestone.title, milestone.description, milestone.dueDate, milestone.closedDate)
|
||||||
|
|
||||||
def openMilestone(milestone: Milestone): Unit = updateMilestone(milestone.copy(closedDate = None))
|
def openMilestone(milestone: Milestone)(implicit s: Session): Unit =
|
||||||
|
updateMilestone(milestone.copy(closedDate = None))
|
||||||
|
|
||||||
def closeMilestone(milestone: Milestone): Unit = updateMilestone(milestone.copy(closedDate = Some(currentDate)))
|
def closeMilestone(milestone: Milestone)(implicit s: Session): Unit =
|
||||||
|
updateMilestone(milestone.copy(closedDate = Some(currentDate)))
|
||||||
|
|
||||||
def deleteMilestone(owner: String, repository: String, milestoneId: Int): Unit = {
|
def deleteMilestone(owner: String, repository: String, milestoneId: Int)(implicit s: Session): Unit = {
|
||||||
Issues.filter(_.byMilestone(owner, repository, milestoneId)).map(_.milestoneId.?).update(None)
|
Issues.filter(_.byMilestone(owner, repository, milestoneId)).map(_.milestoneId.?).update(None)
|
||||||
Milestones.filter(_.byPrimaryKey(owner, repository, milestoneId)).delete
|
Milestones.filter(_.byPrimaryKey(owner, repository, milestoneId)).delete
|
||||||
}
|
}
|
||||||
|
|
||||||
def getMilestone(owner: String, repository: String, milestoneId: Int): Option[Milestone] =
|
def getMilestone(owner: String, repository: String, milestoneId: Int)(implicit s: Session): Option[Milestone] =
|
||||||
Query(Milestones).filter(_.byPrimaryKey(owner, repository, milestoneId)).firstOption
|
Milestones.filter(_.byPrimaryKey(owner, repository, milestoneId)).firstOption
|
||||||
|
|
||||||
def getMilestonesWithIssueCount(owner: String, repository: String): List[(Milestone, Int, Int)] = {
|
def getMilestonesWithIssueCount(owner: String, repository: String)(implicit s: Session): List[(Milestone, Int, Int)] = {
|
||||||
val counts = Issues
|
val counts = Issues
|
||||||
.filter { t => (t.byRepository(owner, repository)) && (t.milestoneId isNotNull) }
|
.filter { t => (t.byRepository(owner, repository)) && (t.milestoneId isNotNull) }
|
||||||
.groupBy { t => t.milestoneId ~ t.closed }
|
.groupBy { t => t.milestoneId -> t.closed }
|
||||||
.map { case (t1, t2) => (t1._1 ~ t1._2) -> t2.length }
|
.map { case (t1, t2) => t1._1 -> t1._2 -> t2.length }
|
||||||
.toMap
|
.toMap
|
||||||
|
|
||||||
getMilestones(owner, repository).map { milestone =>
|
getMilestones(owner, repository).map { milestone =>
|
||||||
@@ -41,6 +48,7 @@ trait MilestonesService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def getMilestones(owner: String, repository: String): List[Milestone] =
|
def getMilestones(owner: String, repository: String)(implicit s: Session): List[Milestone] =
|
||||||
Query(Milestones).filter(_.byRepository(owner, repository)).sortBy(_.milestoneId asc).list
|
Milestones.filter(_.byRepository(owner, repository)).sortBy(_.milestoneId asc).list
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,28 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import scala.slick.driver.H2Driver.simple._
|
|
||||||
import Database.threadLocalSession
|
|
||||||
import model._
|
import model._
|
||||||
|
import profile.simple._
|
||||||
|
|
||||||
trait PullRequestService { self: IssuesService =>
|
trait PullRequestService { self: IssuesService =>
|
||||||
import PullRequestService._
|
import PullRequestService._
|
||||||
|
|
||||||
def getPullRequest(owner: String, repository: String, issueId: Int): Option[(Issue, PullRequest)] =
|
def getPullRequest(owner: String, repository: String, issueId: Int)
|
||||||
|
(implicit s: Session): Option[(Issue, PullRequest)] =
|
||||||
getIssue(owner, repository, issueId.toString).flatMap{ issue =>
|
getIssue(owner, repository, issueId.toString).flatMap{ issue =>
|
||||||
Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId)).firstOption.map{
|
PullRequests.filter(_.byPrimaryKey(owner, repository, issueId)).firstOption.map{
|
||||||
pullreq => (issue, pullreq)
|
pullreq => (issue, pullreq)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def updateCommitId(owner: String, repository: String, issueId: Int, commitIdTo: String, commitIdFrom: String): Unit =
|
def updateCommitId(owner: String, repository: String, issueId: Int, commitIdTo: String, commitIdFrom: String)
|
||||||
Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId))
|
(implicit s: Session): Unit =
|
||||||
.map(pr => pr.commitIdTo ~ pr.commitIdFrom)
|
PullRequests.filter(_.byPrimaryKey(owner, repository, issueId))
|
||||||
|
.map(pr => pr.commitIdTo -> pr.commitIdFrom)
|
||||||
.update((commitIdTo, commitIdFrom))
|
.update((commitIdTo, commitIdFrom))
|
||||||
|
|
||||||
def getPullRequestCountGroupByUser(closed: Boolean, owner: String, repository: Option[String]): List[PullRequestCount] =
|
def getPullRequestCountGroupByUser(closed: Boolean, owner: String, repository: Option[String])
|
||||||
Query(PullRequests)
|
(implicit s: Session): List[PullRequestCount] =
|
||||||
|
PullRequests
|
||||||
.innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) }
|
.innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) }
|
||||||
.filter { case (t1, t2) =>
|
.filter { case (t1, t2) =>
|
||||||
(t2.closed is closed.bind) &&
|
(t2.closed is closed.bind) &&
|
||||||
@@ -28,15 +30,15 @@ trait PullRequestService { self: IssuesService =>
|
|||||||
(t1.repositoryName is repository.get.bind, repository.isDefined)
|
(t1.repositoryName is repository.get.bind, repository.isDefined)
|
||||||
}
|
}
|
||||||
.groupBy { case (t1, t2) => t2.openedUserName }
|
.groupBy { case (t1, t2) => t2.openedUserName }
|
||||||
.map { case (userName, t) => userName ~ t.length }
|
.map { case (userName, t) => userName -> t.length }
|
||||||
.sortBy(_._2 desc)
|
.sortBy(_._2 desc)
|
||||||
.list
|
.list
|
||||||
.map { x => PullRequestCount(x._1, x._2) }
|
.map { x => PullRequestCount(x._1, x._2) }
|
||||||
|
|
||||||
def createPullRequest(originUserName: String, originRepositoryName: String, issueId: Int,
|
def createPullRequest(originUserName: String, originRepositoryName: String, issueId: Int,
|
||||||
originBranch: String, requestUserName: String, requestRepositoryName: String, requestBranch: String,
|
originBranch: String, requestUserName: String, requestRepositoryName: String, requestBranch: String,
|
||||||
commitIdFrom: String, commitIdTo: String): Unit =
|
commitIdFrom: String, commitIdTo: String)(implicit s: Session): Unit =
|
||||||
PullRequests insert (PullRequest(
|
PullRequests insert PullRequest(
|
||||||
originUserName,
|
originUserName,
|
||||||
originRepositoryName,
|
originRepositoryName,
|
||||||
issueId,
|
issueId,
|
||||||
@@ -45,10 +47,11 @@ trait PullRequestService { self: IssuesService =>
|
|||||||
requestRepositoryName,
|
requestRepositoryName,
|
||||||
requestBranch,
|
requestBranch,
|
||||||
commitIdFrom,
|
commitIdFrom,
|
||||||
commitIdTo))
|
commitIdTo)
|
||||||
|
|
||||||
def getPullRequestsByRequest(userName: String, repositoryName: String, branch: String, closed: Boolean): List[PullRequest] =
|
def getPullRequestsByRequest(userName: String, repositoryName: String, branch: String, closed: Boolean)
|
||||||
Query(PullRequests)
|
(implicit s: Session): List[PullRequest] =
|
||||||
|
PullRequests
|
||||||
.innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) }
|
.innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) }
|
||||||
.filter { case (t1, t2) =>
|
.filter { case (t1, t2) =>
|
||||||
(t1.requestUserName is userName.bind) &&
|
(t1.requestUserName is userName.bind) &&
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import model._
|
import model._
|
||||||
import scala.slick.driver.H2Driver.simple._
|
import profile.simple._
|
||||||
import Database.threadLocalSession
|
|
||||||
import util.JGitUtil
|
import util.JGitUtil
|
||||||
|
|
||||||
trait RepositoryService { self: AccountService =>
|
trait RepositoryService { self: AccountService =>
|
||||||
@@ -20,7 +19,8 @@ trait RepositoryService { self: AccountService =>
|
|||||||
*/
|
*/
|
||||||
def createRepository(repositoryName: String, userName: String, description: Option[String], isPrivate: Boolean,
|
def createRepository(repositoryName: String, userName: String, description: Option[String], isPrivate: Boolean,
|
||||||
originRepositoryName: Option[String] = None, originUserName: Option[String] = None,
|
originRepositoryName: Option[String] = None, originUserName: Option[String] = None,
|
||||||
parentRepositoryName: Option[String] = None, parentUserName: Option[String] = None): Unit = {
|
parentRepositoryName: Option[String] = None, parentUserName: Option[String] = None)
|
||||||
|
(implicit s: Session): Unit = {
|
||||||
Repositories insert
|
Repositories insert
|
||||||
Repository(
|
Repository(
|
||||||
userName = userName,
|
userName = userName,
|
||||||
@@ -39,33 +39,34 @@ trait RepositoryService { self: AccountService =>
|
|||||||
IssueId insert (userName, repositoryName, 0)
|
IssueId insert (userName, repositoryName, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
def renameRepository(oldUserName: String, oldRepositoryName: String, newUserName: String, newRepositoryName: String): Unit = {
|
def renameRepository(oldUserName: String, oldRepositoryName: String, newUserName: String, newRepositoryName: String)
|
||||||
|
(implicit s: Session): Unit = {
|
||||||
getAccountByUserName(newUserName).foreach { account =>
|
getAccountByUserName(newUserName).foreach { account =>
|
||||||
(Query(Repositories) filter { t => t.byRepository(oldUserName, oldRepositoryName) } firstOption).map { repository =>
|
(Repositories filter { t => t.byRepository(oldUserName, oldRepositoryName) } firstOption).map { repository =>
|
||||||
Repositories insert repository.copy(userName = newUserName, repositoryName = newRepositoryName)
|
Repositories insert repository.copy(userName = newUserName, repositoryName = newRepositoryName)
|
||||||
|
|
||||||
val webHooks = Query(WebHooks ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val webHooks = WebHooks .filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val milestones = Query(Milestones ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val milestones = Milestones .filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val issueId = Query(IssueId ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val issueId = IssueId .filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val issues = Query(Issues ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val issues = Issues .filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val pullRequests = Query(PullRequests ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val pullRequests = PullRequests .filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val labels = Query(Labels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val labels = Labels .filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val issueComments = Query(IssueComments).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val issueComments = IssueComments.filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val issueLabels = Query(IssueLabels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val issueLabels = IssueLabels .filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val activities = Query(Activities ).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val activities = Activities .filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
val collaborators = Query(Collaborators).filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
val collaborators = Collaborators.filter(_.byRepository(oldUserName, oldRepositoryName)).list
|
||||||
|
|
||||||
Repositories.filter { t =>
|
Repositories.filter { t =>
|
||||||
(t.originUserName is oldUserName.bind) && (t.originRepositoryName is oldRepositoryName.bind)
|
(t.originUserName is oldUserName.bind) && (t.originRepositoryName is oldRepositoryName.bind)
|
||||||
}.map { t => t.originUserName ~ t.originRepositoryName }.update(newUserName, newRepositoryName)
|
}.map { t => t.originUserName -> t.originRepositoryName }.update(newUserName, newRepositoryName)
|
||||||
|
|
||||||
Repositories.filter { t =>
|
Repositories.filter { t =>
|
||||||
(t.parentUserName is oldUserName.bind) && (t.parentRepositoryName is oldRepositoryName.bind)
|
(t.parentUserName is oldUserName.bind) && (t.parentRepositoryName is oldRepositoryName.bind)
|
||||||
}.map { t => t.originUserName ~ t.originRepositoryName }.update(newUserName, newRepositoryName)
|
}.map { t => t.originUserName -> t.originRepositoryName }.update(newUserName, newRepositoryName)
|
||||||
|
|
||||||
PullRequests.filter { t =>
|
PullRequests.filter { t =>
|
||||||
t.requestRepositoryName is oldRepositoryName.bind
|
t.requestRepositoryName is oldRepositoryName.bind
|
||||||
}.map { t => t.requestUserName ~ t.requestRepositoryName }.update(newUserName, newRepositoryName)
|
}.map { t => t.requestUserName -> t.requestRepositoryName }.update(newUserName, newRepositoryName)
|
||||||
|
|
||||||
deleteRepository(oldUserName, oldRepositoryName)
|
deleteRepository(oldUserName, oldRepositoryName)
|
||||||
|
|
||||||
@@ -88,7 +89,7 @@ trait RepositoryService { self: AccountService =>
|
|||||||
val updateActivities = Activities.filter { t =>
|
val updateActivities = Activities.filter { t =>
|
||||||
(t.message like s"%:${oldUserName}/${oldRepositoryName}]%") ||
|
(t.message like s"%:${oldUserName}/${oldRepositoryName}]%") ||
|
||||||
(t.message like s"%:${oldUserName}/${oldRepositoryName}#%")
|
(t.message like s"%:${oldUserName}/${oldRepositoryName}#%")
|
||||||
}.map { t => t.activityId ~ t.message }.list
|
}.map { t => t.activityId -> t.message }.list
|
||||||
|
|
||||||
updateActivities.foreach { case (activityId, message) =>
|
updateActivities.foreach { case (activityId, message) =>
|
||||||
Activities.filter(_.activityId is activityId.bind).map(_.message).update(
|
Activities.filter(_.activityId is activityId.bind).map(_.message).update(
|
||||||
@@ -104,7 +105,7 @@ trait RepositoryService { self: AccountService =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def deleteRepository(userName: String, repositoryName: String): Unit = {
|
def deleteRepository(userName: String, repositoryName: String)(implicit s: Session): Unit = {
|
||||||
Activities .filter(_.byRepository(userName, repositoryName)).delete
|
Activities .filter(_.byRepository(userName, repositoryName)).delete
|
||||||
Collaborators .filter(_.byRepository(userName, repositoryName)).delete
|
Collaborators .filter(_.byRepository(userName, repositoryName)).delete
|
||||||
IssueLabels .filter(_.byRepository(userName, repositoryName)).delete
|
IssueLabels .filter(_.byRepository(userName, repositoryName)).delete
|
||||||
@@ -124,8 +125,8 @@ trait RepositoryService { self: AccountService =>
|
|||||||
* @param userName the user name of repository owner
|
* @param userName the user name of repository owner
|
||||||
* @return the list of repository names
|
* @return the list of repository names
|
||||||
*/
|
*/
|
||||||
def getRepositoryNamesOfUser(userName: String): List[String] =
|
def getRepositoryNamesOfUser(userName: String)(implicit s: Session): List[String] =
|
||||||
Query(Repositories) filter(_.userName is userName.bind) map (_.repositoryName) list
|
Repositories filter(_.userName is userName.bind) map (_.repositoryName) list
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the specified repository information.
|
* Returns the specified repository information.
|
||||||
@@ -135,10 +136,10 @@ trait RepositoryService { self: AccountService =>
|
|||||||
* @param baseUrl the base url of this application
|
* @param baseUrl the base url of this application
|
||||||
* @return the repository information
|
* @return the repository information
|
||||||
*/
|
*/
|
||||||
def getRepository(userName: String, repositoryName: String, baseUrl: String): Option[RepositoryInfo] = {
|
def getRepository(userName: String, repositoryName: String, baseUrl: String)(implicit s: Session): Option[RepositoryInfo] = {
|
||||||
(Query(Repositories) filter { t => t.byRepository(userName, repositoryName) } firstOption) map { repository =>
|
(Repositories filter { t => t.byRepository(userName, repositoryName) } firstOption) map { repository =>
|
||||||
// for getting issue count and pull request count
|
// for getting issue count and pull request count
|
||||||
val issues = Query(Issues).filter { t =>
|
val issues = Issues.filter { t =>
|
||||||
t.byRepository(repository.userName, repository.repositoryName) && (t.closed is false.bind)
|
t.byRepository(repository.userName, repository.repositoryName) && (t.closed is false.bind)
|
||||||
}.map(_.pullRequest).list
|
}.map(_.pullRequest).list
|
||||||
|
|
||||||
@@ -155,10 +156,10 @@ trait RepositoryService { self: AccountService =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def getUserRepositories(userName: String, baseUrl: String): List[RepositoryInfo] = {
|
def getUserRepositories(userName: String, baseUrl: String)(implicit s: Session): List[RepositoryInfo] = {
|
||||||
Query(Repositories).filter { t1 =>
|
Repositories.filter { t1 =>
|
||||||
(t1.userName is userName.bind) ||
|
(t1.userName is userName.bind) ||
|
||||||
(Query(Collaborators).filter { t2 => t2.byRepository(t1.userName, t1.repositoryName) && (t2.collaboratorName is userName.bind)} exists)
|
(Collaborators.filter { t2 => t2.byRepository(t1.userName, t1.repositoryName) && (t2.collaboratorName is userName.bind)} exists)
|
||||||
}.sortBy(_.lastActivityDate desc).list.map{ repository =>
|
}.sortBy(_.lastActivityDate desc).list.map{ repository =>
|
||||||
new RepositoryInfo(
|
new RepositoryInfo(
|
||||||
JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl),
|
JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl),
|
||||||
@@ -180,17 +181,18 @@ trait RepositoryService { self: AccountService =>
|
|||||||
* @param repositoryUserName the repository owner (if None then returns all repositories which are visible for logged in user)
|
* @param repositoryUserName the repository owner (if None then returns all repositories which are visible for logged in user)
|
||||||
* @return the repository information which is sorted in descending order of lastActivityDate.
|
* @return the repository information which is sorted in descending order of lastActivityDate.
|
||||||
*/
|
*/
|
||||||
def getVisibleRepositories(loginAccount: Option[Account], baseUrl: String, repositoryUserName: Option[String] = None): List[RepositoryInfo] = {
|
def getVisibleRepositories(loginAccount: Option[Account], baseUrl: String, repositoryUserName: Option[String] = None)
|
||||||
|
(implicit s: Session): List[RepositoryInfo] = {
|
||||||
(loginAccount match {
|
(loginAccount match {
|
||||||
// for Administrators
|
// for Administrators
|
||||||
case Some(x) if(x.isAdmin) => Query(Repositories)
|
case Some(x) if(x.isAdmin) => Repositories
|
||||||
// for Normal Users
|
// for Normal Users
|
||||||
case Some(x) if(!x.isAdmin) =>
|
case Some(x) if(!x.isAdmin) =>
|
||||||
Query(Repositories) filter { t => (t.isPrivate is false.bind) || (t.userName is x.userName) ||
|
Repositories filter { t => (t.isPrivate is false.bind) || (t.userName is x.userName) ||
|
||||||
(Query(Collaborators).filter { t2 => t2.byRepository(t.userName, t.repositoryName) && (t2.collaboratorName is x.userName.bind)} exists)
|
(Collaborators.filter { t2 => t2.byRepository(t.userName, t.repositoryName) && (t2.collaboratorName is x.userName.bind)} exists)
|
||||||
}
|
}
|
||||||
// for Guests
|
// for Guests
|
||||||
case None => Query(Repositories) filter(_.isPrivate is false.bind)
|
case None => Repositories filter(_.isPrivate is false.bind)
|
||||||
}).filter { t =>
|
}).filter { t =>
|
||||||
repositoryUserName.map { userName => t.userName is userName.bind } getOrElse ConstColumn.TRUE
|
repositoryUserName.map { userName => t.userName is userName.bind } getOrElse ConstColumn.TRUE
|
||||||
}.sortBy(_.lastActivityDate desc).list.map{ repository =>
|
}.sortBy(_.lastActivityDate desc).list.map{ repository =>
|
||||||
@@ -205,7 +207,7 @@ trait RepositoryService { self: AccountService =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private def getRepositoryManagers(userName: String): Seq[String] =
|
private def getRepositoryManagers(userName: String)(implicit s: Session): Seq[String] =
|
||||||
if(getAccountByUserName(userName).exists(_.isGroupAccount)){
|
if(getAccountByUserName(userName).exists(_.isGroupAccount)){
|
||||||
getGroupMembers(userName).collect { case x if(x.isManager) => x.userName }
|
getGroupMembers(userName).collect { case x if(x.isManager) => x.userName }
|
||||||
} else {
|
} else {
|
||||||
@@ -215,16 +217,16 @@ trait RepositoryService { self: AccountService =>
|
|||||||
/**
|
/**
|
||||||
* Updates the last activity date of the repository.
|
* Updates the last activity date of the repository.
|
||||||
*/
|
*/
|
||||||
def updateLastActivityDate(userName: String, repositoryName: String): Unit =
|
def updateLastActivityDate(userName: String, repositoryName: String)(implicit s: Session): Unit =
|
||||||
Repositories.filter(_.byRepository(userName, repositoryName)).map(_.lastActivityDate).update(currentDate)
|
Repositories.filter(_.byRepository(userName, repositoryName)).map(_.lastActivityDate).update(currentDate)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save repository options.
|
* Save repository options.
|
||||||
*/
|
*/
|
||||||
def saveRepositoryOptions(userName: String, repositoryName: String,
|
def saveRepositoryOptions(userName: String, repositoryName: String,
|
||||||
description: Option[String], defaultBranch: String, isPrivate: Boolean): Unit =
|
description: Option[String], defaultBranch: String, isPrivate: Boolean)(implicit s: Session): Unit =
|
||||||
Repositories.filter(_.byRepository(userName, repositoryName))
|
Repositories.filter(_.byRepository(userName, repositoryName))
|
||||||
.map { r => r.description.? ~ r.defaultBranch ~ r.isPrivate ~ r.updatedDate }
|
.map { r => (r.description.?, r.defaultBranch, r.isPrivate, r.updatedDate) }
|
||||||
.update (description, defaultBranch, isPrivate, currentDate)
|
.update (description, defaultBranch, isPrivate, currentDate)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -234,8 +236,8 @@ trait RepositoryService { self: AccountService =>
|
|||||||
* @param repositoryName the repository name
|
* @param repositoryName the repository name
|
||||||
* @param collaboratorName the collaborator name
|
* @param collaboratorName the collaborator name
|
||||||
*/
|
*/
|
||||||
def addCollaborator(userName: String, repositoryName: String, collaboratorName: String): Unit =
|
def addCollaborator(userName: String, repositoryName: String, collaboratorName: String)(implicit s: Session): Unit =
|
||||||
Collaborators insert(Collaborator(userName, repositoryName, collaboratorName))
|
Collaborators insert Collaborator(userName, repositoryName, collaboratorName)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove collaborator from the repository.
|
* Remove collaborator from the repository.
|
||||||
@@ -244,7 +246,7 @@ trait RepositoryService { self: AccountService =>
|
|||||||
* @param repositoryName the repository name
|
* @param repositoryName the repository name
|
||||||
* @param collaboratorName the collaborator name
|
* @param collaboratorName the collaborator name
|
||||||
*/
|
*/
|
||||||
def removeCollaborator(userName: String, repositoryName: String, collaboratorName: String): Unit =
|
def removeCollaborator(userName: String, repositoryName: String, collaboratorName: String)(implicit s: Session): Unit =
|
||||||
Collaborators.filter(_.byPrimaryKey(userName, repositoryName, collaboratorName)).delete
|
Collaborators.filter(_.byPrimaryKey(userName, repositoryName, collaboratorName)).delete
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -253,7 +255,7 @@ trait RepositoryService { self: AccountService =>
|
|||||||
* @param userName the user name of the repository owner
|
* @param userName the user name of the repository owner
|
||||||
* @param repositoryName the repository name
|
* @param repositoryName the repository name
|
||||||
*/
|
*/
|
||||||
def removeCollaborators(userName: String, repositoryName: String): Unit =
|
def removeCollaborators(userName: String, repositoryName: String)(implicit s: Session): Unit =
|
||||||
Collaborators.filter(_.byRepository(userName, repositoryName)).delete
|
Collaborators.filter(_.byRepository(userName, repositoryName)).delete
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -263,10 +265,10 @@ trait RepositoryService { self: AccountService =>
|
|||||||
* @param repositoryName the repository name
|
* @param repositoryName the repository name
|
||||||
* @return the list of collaborators name
|
* @return the list of collaborators name
|
||||||
*/
|
*/
|
||||||
def getCollaborators(userName: String, repositoryName: String): List[String] =
|
def getCollaborators(userName: String, repositoryName: String)(implicit s: Session): List[String] =
|
||||||
Query(Collaborators).filter(_.byRepository(userName, repositoryName)).sortBy(_.collaboratorName).map(_.collaboratorName).list
|
Collaborators.filter(_.byRepository(userName, repositoryName)).sortBy(_.collaboratorName).map(_.collaboratorName).list
|
||||||
|
|
||||||
def hasWritePermission(owner: String, repository: String, loginAccount: Option[Account]): Boolean = {
|
def hasWritePermission(owner: String, repository: String, loginAccount: Option[Account])(implicit s: Session): Boolean = {
|
||||||
loginAccount match {
|
loginAccount match {
|
||||||
case Some(a) if(a.isAdmin) => true
|
case Some(a) if(a.isAdmin) => true
|
||||||
case Some(a) if(a.userName == owner) => true
|
case Some(a) if(a.userName == owner) => true
|
||||||
@@ -275,17 +277,18 @@ trait RepositoryService { self: AccountService =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private def getForkedCount(userName: String, repositoryName: String): Int =
|
private def getForkedCount(userName: String, repositoryName: String)(implicit s: Session): Int =
|
||||||
|
// TODO check SQL
|
||||||
Query(Repositories.filter { t =>
|
Query(Repositories.filter { t =>
|
||||||
(t.originUserName is userName.bind) && (t.originRepositoryName is repositoryName.bind)
|
(t.originUserName is userName.bind) && (t.originRepositoryName is repositoryName.bind)
|
||||||
}.length).first
|
}.length).first
|
||||||
|
|
||||||
|
|
||||||
def getForkedRepositories(userName: String, repositoryName: String): List[(String, String)] =
|
def getForkedRepositories(userName: String, repositoryName: String)(implicit s: Session): List[(String, String)] =
|
||||||
Query(Repositories).filter { t =>
|
Repositories.filter { t =>
|
||||||
(t.originUserName is userName.bind) && (t.originRepositoryName is repositoryName.bind)
|
(t.originUserName is userName.bind) && (t.originRepositoryName is repositoryName.bind)
|
||||||
}
|
}
|
||||||
.sortBy(_.userName asc).map(t => t.userName ~ t.repositoryName).list
|
.sortBy(_.userName asc).map(t => t.userName -> t.repositoryName).list
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import model._
|
import model._
|
||||||
|
import slick.jdbc.JdbcBackend
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This service is used for a view helper mainly.
|
* This service is used for a view helper mainly.
|
||||||
@@ -10,22 +11,24 @@ import model._
|
|||||||
*/
|
*/
|
||||||
trait RequestCache extends SystemSettingsService with AccountService with IssuesService {
|
trait RequestCache extends SystemSettingsService with AccountService with IssuesService {
|
||||||
|
|
||||||
def getIssue(userName: String, repositoryName: String, issueId: String)(implicit context: app.Context): Option[Issue] = {
|
def getIssue(userName: String, repositoryName: String, issueId: String)
|
||||||
|
(implicit context: app.Context, session: JdbcBackend#Session): Option[Issue] = {
|
||||||
context.cache(s"issue.${userName}/${repositoryName}#${issueId}"){
|
context.cache(s"issue.${userName}/${repositoryName}#${issueId}"){
|
||||||
super.getIssue(userName, repositoryName, issueId)
|
super.getIssue(userName, repositoryName, issueId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def getAccountByUserName(userName: String)(implicit context: app.Context): Option[Account] = {
|
def getAccountByUserName(userName: String)
|
||||||
|
(implicit context: app.Context, session: JdbcBackend#Session): Option[Account] = {
|
||||||
context.cache(s"account.${userName}"){
|
context.cache(s"account.${userName}"){
|
||||||
super.getAccountByUserName(userName)
|
super.getAccountByUserName(userName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def getAccountByMailAddress(mailAddress: String)(implicit context: app.Context): Option[Account] = {
|
def getAccountByMailAddress(mailAddress: String)
|
||||||
|
(implicit context: app.Context, session: JdbcBackend#Session): Option[Account] = {
|
||||||
context.cache(s"account.${mailAddress}"){
|
context.cache(s"account.${mailAddress}"){
|
||||||
super.getAccountByMailAddress(mailAddress)
|
super.getAccountByMailAddress(mailAddress)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,17 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import model._
|
import model._
|
||||||
import scala.slick.driver.H2Driver.simple._
|
import profile.simple._
|
||||||
import Database.threadLocalSession
|
|
||||||
|
|
||||||
trait SshKeyService {
|
trait SshKeyService {
|
||||||
|
|
||||||
def addPublicKey(userName: String, title: String, publicKey: String): Unit =
|
def addPublicKey(userName: String, title: String, publicKey: String)(implicit s: Session): Unit =
|
||||||
SshKeys.ins insert (userName, title, publicKey)
|
SshKeys insert SshKey(userName = userName, title = title, publicKey = publicKey)
|
||||||
|
|
||||||
def getPublicKeys(userName: String): List[SshKey] =
|
def getPublicKeys(userName: String)(implicit s: Session): List[SshKey] =
|
||||||
Query(SshKeys).filter(_.userName is userName.bind).sortBy(_.sshKeyId).list
|
SshKeys.filter(_.userName is userName.bind).sortBy(_.sshKeyId).list
|
||||||
|
|
||||||
def deletePublicKey(userName: String, sshKeyId: Int): Unit =
|
def deletePublicKey(userName: String, sshKeyId: Int)(implicit s: Session): Unit =
|
||||||
SshKeys filter (_.byPrimaryKey(userName, sshKeyId)) delete
|
SshKeys filter (_.byPrimaryKey(userName, sshKeyId)) delete
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import scala.slick.driver.H2Driver.simple._
|
|
||||||
import Database.threadLocalSession
|
|
||||||
|
|
||||||
import model._
|
import model._
|
||||||
|
import profile.simple._
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import service.RepositoryService.RepositoryInfo
|
import service.RepositoryService.RepositoryInfo
|
||||||
import util.JGitUtil
|
import util.JGitUtil
|
||||||
@@ -12,7 +10,6 @@ import util.JGitUtil.CommitInfo
|
|||||||
import org.eclipse.jgit.api.Git
|
import org.eclipse.jgit.api.Git
|
||||||
import org.apache.http.message.BasicNameValuePair
|
import org.apache.http.message.BasicNameValuePair
|
||||||
import org.apache.http.client.entity.UrlEncodedFormEntity
|
import org.apache.http.client.entity.UrlEncodedFormEntity
|
||||||
import org.apache.http.protocol.HTTP
|
|
||||||
import org.apache.http.NameValuePair
|
import org.apache.http.NameValuePair
|
||||||
|
|
||||||
trait WebHookService {
|
trait WebHookService {
|
||||||
@@ -20,14 +17,14 @@ trait WebHookService {
|
|||||||
|
|
||||||
private val logger = LoggerFactory.getLogger(classOf[WebHookService])
|
private val logger = LoggerFactory.getLogger(classOf[WebHookService])
|
||||||
|
|
||||||
def getWebHookURLs(owner: String, repository: String): List[WebHook] =
|
def getWebHookURLs(owner: String, repository: String)(implicit s: Session): List[WebHook] =
|
||||||
Query(WebHooks).filter(_.byRepository(owner, repository)).sortBy(_.url).list
|
WebHooks.filter(_.byRepository(owner, repository)).sortBy(_.url).list
|
||||||
|
|
||||||
def addWebHookURL(owner: String, repository: String, url :String): Unit =
|
def addWebHookURL(owner: String, repository: String, url :String)(implicit s: Session): Unit =
|
||||||
WebHooks.insert(WebHook(owner, repository, url))
|
WebHooks insert WebHook(owner, repository, url)
|
||||||
|
|
||||||
def deleteWebHookURL(owner: String, repository: String, url :String): Unit =
|
def deleteWebHookURL(owner: String, repository: String, url :String)(implicit s: Session): Unit =
|
||||||
Query(WebHooks).filter(_.byPrimaryKey(owner, repository, url)).delete
|
WebHooks.filter(_.byPrimaryKey(owner, repository, url)).delete
|
||||||
|
|
||||||
def callWebHook(owner: String, repository: String, webHookURLs: List[WebHook], payload: WebHookPayload): Unit = {
|
def callWebHook(owner: String, repository: String, webHookURLs: List[WebHook], payload: WebHookPayload): Unit = {
|
||||||
import org.json4s._
|
import org.json4s._
|
||||||
|
|||||||
Reference in New Issue
Block a user