diff --git a/src/main/scala/model/Activity.scala b/src/main/scala/model/Activity.scala index 9b8a500..6ad1bdb 100644 --- a/src/main/scala/model/Activity.scala +++ b/src/main/scala/model/Activity.scala @@ -1,29 +1,29 @@ -package model - -trait ActivityComponent extends TemplateComponent { self: Profile => - import profile.simple._ - import self._ - - lazy val Activities = TableQuery[Activities] - - class Activities(tag: Tag) extends Table[Activity](tag, "ACTIVITY") with BasicTemplate { - val activityId = column[Int]("ACTIVITY_ID", O AutoInc) - val activityUserName = column[String]("ACTIVITY_USER_NAME") - val activityType = column[String]("ACTIVITY_TYPE") - val message = column[String]("MESSAGE") - val additionalInfo = column[String]("ADDITIONAL_INFO") - val activityDate = column[java.util.Date]("ACTIVITY_DATE") - def * = (activityId, userName, repositoryName, activityUserName, activityType, message, additionalInfo.?, activityDate) <> (Activity.tupled, Activity.unapply) - } - - case class Activity( - activityId: Int, - userName: String, - repositoryName: String, - activityUserName: String, - activityType: String, - message: String, - additionalInfo: Option[String], - activityDate: java.util.Date - ) -} +package model + +trait ActivityComponent extends TemplateComponent { self: Profile => + import profile.simple._ + import self._ + + lazy val Activities = TableQuery[Activities] + + class Activities(tag: Tag) extends Table[Activity](tag, "ACTIVITY") with BasicTemplate { + val activityId = column[Int]("ACTIVITY_ID", O AutoInc) + val activityUserName = column[String]("ACTIVITY_USER_NAME") + val activityType = column[String]("ACTIVITY_TYPE") + val message = column[String]("MESSAGE") + val additionalInfo = column[String]("ADDITIONAL_INFO") + val activityDate = column[java.util.Date]("ACTIVITY_DATE") + def * = (userName, repositoryName, activityUserName, activityType, message, additionalInfo.?, activityDate, activityId) <> (Activity.tupled, Activity.unapply) + } + + case class Activity( + userName: String, + repositoryName: String, + activityUserName: String, + activityType: String, + message: String, + additionalInfo: Option[String], + activityDate: java.util.Date, + activityId: Int = 0 + ) +} diff --git a/src/main/scala/model/IssueComment.scala b/src/main/scala/model/IssueComment.scala index 0641be1..ea02285 100644 --- a/src/main/scala/model/IssueComment.scala +++ b/src/main/scala/model/IssueComment.scala @@ -24,7 +24,7 @@ userName: String, repositoryName: String, issueId: Int, - commentId: Int, + commentId: Int = 0, action: String, commentedUserName: String, content: String, diff --git a/src/main/scala/model/Labels.scala b/src/main/scala/model/Labels.scala index ec2744e..13e66d9 100644 --- a/src/main/scala/model/Labels.scala +++ b/src/main/scala/model/Labels.scala @@ -18,7 +18,7 @@ case class Label( userName: String, repositoryName: String, - labelId: Int, + labelId: Int = 0, labelName: String, color: String){ diff --git a/src/main/scala/model/Milestone.scala b/src/main/scala/model/Milestone.scala index 5ef7b17..3aa4314 100644 --- a/src/main/scala/model/Milestone.scala +++ b/src/main/scala/model/Milestone.scala @@ -21,7 +21,7 @@ case class Milestone( userName: String, repositoryName: String, - milestoneId: Int, + milestoneId: Int = 0, title: String, description: Option[String], dueDate: Option[java.util.Date], diff --git a/src/main/scala/model/Profile.scala b/src/main/scala/model/Profile.scala index 65b4e72..8b67c6e 100644 --- a/src/main/scala/model/Profile.scala +++ b/src/main/scala/model/Profile.scala @@ -2,7 +2,6 @@ import slick.driver.JdbcProfile -//private[model] trait Profile { val profile: JdbcProfile import profile.simple._ diff --git a/src/main/scala/service/AccountService.scala b/src/main/scala/service/AccountService.scala index d349fc7..d165f63 100644 --- a/src/main/scala/service/AccountService.scala +++ b/src/main/scala/service/AccountService.scala @@ -1,13 +1,9 @@ package service import model._ -import scala.slick.driver.H2Driver.simple._ -import Database.threadLocalSession +import profile.simple._ import service.SystemSettingsService.SystemSettings import util.StringUtil._ -import model.GroupMember -import scala.Some -import model.Account import util.LDAPUtil import org.slf4j.LoggerFactory @@ -15,7 +11,7 @@ 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){ ldapAuthentication(settings, userName, password) } else { @@ -25,7 +21,7 @@ /** * Authenticate by internal database. */ - private def defaultAuthentication(userName: String, password: String) = { + private def defaultAuthentication(userName: String, password: String)(implicit s: Session) = { getAccountByUserName(userName).collect { case account if(!account.isGroupAccount && account.password == sha1(password)) => Some(account) } getOrElse None @@ -34,7 +30,8 @@ /** * 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 { case Right(ldapUserInfo) => { // Create or update account by LDAP information @@ -70,20 +67,21 @@ } } - def getAccountByUserName(userName: String, includeRemoved: Boolean = false): Option[Account] = - Query(Accounts) filter(t => (t.userName is userName.bind) && (t.removed is false.bind, !includeRemoved)) firstOption + def getAccountByUserName(userName: String, includeRemoved: Boolean = false)(implicit s: Session): Option[Account] = + Accounts filter(t => (t.userName is userName.bind) && (t.removed is false.bind, !includeRemoved)) firstOption - def getAccountByMailAddress(mailAddress: String, includeRemoved: Boolean = false): Option[Account] = - Query(Accounts) filter(t => (t.mailAddress.toLowerCase is mailAddress.toLowerCase.bind) && (t.removed is false.bind, !includeRemoved)) firstOption + def getAccountByMailAddress(mailAddress: String, includeRemoved: Boolean = false)(implicit s: Session): Option[Account] = + 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){ - Query(Accounts) sortBy(_.userName) list + Accounts sortBy(_.userName) list } 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( userName = userName, password = password, @@ -98,10 +96,10 @@ isGroupAccount = false, isRemoved = false) - def updateAccount(account: Account): Unit = + def updateAccount(account: Account)(implicit s: Session): Unit = Accounts - .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 } + .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) } .update ( account.password, account.fullName, @@ -113,13 +111,13 @@ account.lastLoginDate, 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) - def updateLastLoginDate(userName: String): Unit = + def updateLastLoginDate(userName: String)(implicit s: Session): Unit = 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( userName = groupName, password = "", @@ -134,33 +132,33 @@ isGroupAccount = true, isRemoved = false) - def updateGroup(groupName: String, url: Option[String], removed: Boolean): Unit = - Accounts.filter(_.userName is groupName.bind).map(t => t.url.? ~ t.removed).update(url, removed) + 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) - def updateGroupMembers(groupName: String, members: List[(String, Boolean)]): Unit = { - Query(GroupMembers).filter(_.groupName is groupName.bind).delete + def updateGroupMembers(groupName: String, members: List[(String, Boolean)])(implicit s: Session): Unit = { + GroupMembers.filter(_.groupName is groupName.bind).delete members.foreach { case (userName, isManager) => GroupMembers insert GroupMember (groupName, userName, isManager) } } - def getGroupMembers(groupName: String): List[GroupMember] = - Query(GroupMembers) + def getGroupMembers(groupName: String)(implicit s: Session): List[GroupMember] = + GroupMembers .filter(_.groupName is groupName.bind) .sortBy(_.userName) .list - def getGroupsByUserName(userName: String): List[String] = - Query(GroupMembers) + def getGroupsByUserName(userName: String)(implicit s: Session): List[String] = + GroupMembers .filter(_.userName is userName.bind) .sortBy(_.groupName) .map(_.groupName) .list - def removeUserRelatedData(userName: String): Unit = { - Query(GroupMembers).filter(_.userName is userName.bind).delete - Query(Collaborators).filter(_.collaboratorName is userName.bind).delete - Query(Repositories).filter(_.userName is userName.bind).delete + def removeUserRelatedData(userName: String)(implicit s: Session): Unit = { + GroupMembers.filter(_.userName is userName.bind).delete + Collaborators.filter(_.collaboratorName is userName.bind).delete + Repositories.filter(_.userName is userName.bind).delete } } diff --git a/src/main/scala/service/ActivityService.scala b/src/main/scala/service/ActivityService.scala index 64fbb4e..1e50ff8 100644 --- a/src/main/scala/service/ActivityService.scala +++ b/src/main/scala/service/ActivityService.scala @@ -1,12 +1,11 @@ package service import model._ -import scala.slick.driver.H2Driver.simple._ -import Database.threadLocalSession +import profile.simple._ trait ActivityService { - def getActivitiesByUser(activityUserName: String, isPublic: Boolean): List[Activity] = + def getActivitiesByUser(activityUserName: String, isPublic: Boolean)(implicit s: Session): List[Activity] = Activities .innerJoin(Repositories).on((t1, t2) => t1.byRepository(t2.userName, t2.repositoryName)) .filter { case (t1, t2) => @@ -21,7 +20,7 @@ .take(30) .list - def getRecentActivities(): List[Activity] = + def getRecentActivities(implicit s: Session): List[Activity] = Activities .innerJoin(Repositories).on((t1, t2) => t1.byRepository(t2.userName, t2.repositoryName)) .filter { case (t1, t2) => t2.isPrivate is false.bind } @@ -29,125 +28,137 @@ .map { case (t1, t2) => t1 } .take(30) .list - - def recordCreateRepositoryActivity(userName: String, repositoryName: String, activityUserName: String): Unit = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordCreateRepositoryActivity(userName: String, repositoryName: String, activityUserName: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "create_repository", s"[user:${activityUserName}] created [repo:${userName}/${repositoryName}]", None, currentDate) - def recordCreateIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordCreateIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "open_issue", s"[user:${activityUserName}] opened issue [issue:${userName}/${repositoryName}#${issueId}]", Some(title), currentDate) - def recordCloseIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordCloseIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "close_issue", s"[user:${activityUserName}] closed issue [issue:${userName}/${repositoryName}#${issueId}]", Some(title), currentDate) - def recordClosePullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordClosePullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "close_issue", s"[user:${activityUserName}] closed pull request [pullreq:${userName}/${repositoryName}#${issueId}]", Some(title), currentDate) - def recordReopenIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordReopenIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "reopen_issue", s"[user:${activityUserName}] reopened issue [issue:${userName}/${repositoryName}#${issueId}]", Some(title), currentDate) - def recordCommentIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, comment: String): Unit = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordCommentIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, comment: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "comment_issue", s"[user:${activityUserName}] commented on issue [issue:${userName}/${repositoryName}#${issueId}]", Some(cut(comment, 200)), currentDate) - def recordCommentPullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, comment: String): Unit = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordCommentPullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, comment: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "comment_issue", s"[user:${activityUserName}] commented on pull request [pullreq:${userName}/${repositoryName}#${issueId}]", Some(cut(comment, 200)), currentDate) - def recordCreateWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String) = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordCreateWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "create_wiki", s"[user:${activityUserName}] created the [repo:${userName}/${repositoryName}] wiki", Some(pageName), currentDate) - - def recordEditWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String, commitId: String) = - Activities.autoInc insert(userName, repositoryName, activityUserName, + + def recordEditWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String, commitId: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "edit_wiki", s"[user:${activityUserName}] edited the [repo:${userName}/${repositoryName}] wiki", Some(pageName + ":" + commitId), currentDate) - - def recordPushActivity(userName: String, repositoryName: String, activityUserName: String, - branchName: String, commits: List[util.JGitUtil.CommitInfo]) = - Activities.autoInc insert(userName, repositoryName, activityUserName, + + def recordPushActivity(userName: String, repositoryName: String, activityUserName: String, + branchName: String, commits: List[util.JGitUtil.CommitInfo])(implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "push", s"[user:${activityUserName}] pushed to [branch:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]", Some(commits.map { commit => commit.id + ":" + commit.shortMessage }.mkString("\n")), currentDate) - + def recordCreateTagActivity(userName: String, repositoryName: String, activityUserName: String, - tagName: String, commits: List[util.JGitUtil.CommitInfo]) = - Activities.autoInc insert(userName, repositoryName, activityUserName, + tagName: String, commits: List[util.JGitUtil.CommitInfo])(implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "create_tag", s"[user:${activityUserName}] created tag [tag:${userName}/${repositoryName}#${tagName}] at [repo:${userName}/${repositoryName}]", None, currentDate) def recordDeleteTagActivity(userName: String, repositoryName: String, activityUserName: String, - tagName: String, commits: List[util.JGitUtil.CommitInfo]) = - Activities.autoInc insert(userName, repositoryName, activityUserName, + tagName: String, commits: List[util.JGitUtil.CommitInfo])(implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "delete_tag", s"[user:${activityUserName}] deleted tag ${tagName} at [repo:${userName}/${repositoryName}]", None, currentDate) - def recordCreateBranchActivity(userName: String, repositoryName: String, activityUserName: String, branchName: String) = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordCreateBranchActivity(userName: String, repositoryName: String, activityUserName: String, branchName: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "create_branch", s"[user:${activityUserName}] created branch [branch:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]", None, currentDate) - def recordDeleteBranchActivity(userName: String, repositoryName: String, activityUserName: String, branchName: String) = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordDeleteBranchActivity(userName: String, repositoryName: String, activityUserName: String, branchName: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "delete_branch", s"[user:${activityUserName}] deleted branch ${branchName} at [repo:${userName}/${repositoryName}]", None, currentDate) - def recordForkActivity(userName: String, repositoryName: String, activityUserName: String) = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordForkActivity(userName: String, repositoryName: String, activityUserName: String)(implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "fork", s"[user:${activityUserName}] forked [repo:${userName}/${repositoryName}] to [repo:${activityUserName}/${repositoryName}]", None, currentDate) - def recordPullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordPullRequestActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "open_pullreq", s"[user:${activityUserName}] opened pull request [pullreq:${userName}/${repositoryName}#${issueId}]", Some(title), currentDate) - def recordMergeActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, message: String): Unit = - Activities.autoInc insert(userName, repositoryName, activityUserName, + def recordMergeActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, message: String) + (implicit s: Session): Unit = + Activities insert Activity(userName, repositoryName, activityUserName, "merge_pullreq", s"[user:${activityUserName}] merged pull request [pullreq:${userName}/${repositoryName}#${issueId}]", Some(message), diff --git a/src/main/scala/service/IssuesService.scala b/src/main/scala/service/IssuesService.scala index 590e300..7920427 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/service/IssuesService.scala @@ -1,33 +1,32 @@ package service -import scala.slick.driver.H2Driver.simple._ -import Database.threadLocalSession import scala.slick.jdbc.{StaticQuery => Q} import Q.interpolation import model._ +import profile.simple._ import util.Implicits._ import util.StringUtil._ trait 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)) - Query(Issues) filter (_.byPrimaryKey(owner, repository, issueId.toInt)) firstOption + Issues filter (_.byPrimaryKey(owner, repository, issueId.toInt)) firstOption else None - def getComments(owner: String, repository: String, issueId: Int) = - Query(IssueComments) filter (_.byIssue(owner, repository, issueId)) list + def getComments(owner: String, repository: String, issueId: Int)(implicit s: Session) = + 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)) - Query(IssueComments) filter { t => + IssueComments filter { t => t.byPrimaryKey(commentId.toInt) && t.byRepository(owner, repository) } firstOption else None - def getIssueLabels(owner: String, repository: String, issueId: Int) = + def getIssueLabels(owner: String, repository: String, issueId: Int)(implicit s: Session) = IssueLabels .innerJoin(Labels).on { (t1, t2) => t1.byLabel(t2.userName, t2.repositoryName, t2.labelId) @@ -36,8 +35,8 @@ .map ( _._2 ) .list - def getIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int) = - Query(IssueLabels) filter (_.byPrimaryKey(owner, repository, issueId, labelId)) firstOption + def getIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int)(implicit s: Session) = + IssueLabels filter (_.byPrimaryKey(owner, repository, issueId, labelId)) firstOption /** * Returns the count of the search result against issues. @@ -49,7 +48,8 @@ * @return the count of the search result */ 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 /** * Returns the Map which contains issue count for each labels. @@ -61,7 +61,7 @@ * @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, - 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) .innerJoin(IssueLabels).on { (t1, t2) => @@ -74,7 +74,7 @@ t3.labelName } .map { case (labelName, t) => - labelName ~ t.length + labelName -> t.length } .toMap } @@ -90,13 +90,13 @@ */ def countIssueGroupByRepository( 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) .groupBy { t => - t.userName ~ t.repositoryName + t.userName -> t.repositoryName } .map { case (repo, t) => - repo ~ t.length + repo -> t.length } .sortBy(_._3 desc) .list @@ -114,7 +114,8 @@ * @return the search result (list of tuples which contain issue, labels and comment count) */ 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 searchIssueQuery(repos, condition, filterUser, onlyPullRequest) @@ -157,8 +158,8 @@ * Assembles query for conditional issue searching. */ private def searchIssueQuery(repos: Seq[(String, String)], condition: IssueSearchCondition, - filterUser: Map[String, String], onlyPullRequest: Boolean) = - Query(Issues) filter { t1 => + filterUser: Map[String, String], onlyPullRequest: Boolean)(implicit s: Session) = + Issues filter { t1 => condition.repo .map { _.split('/') match { case array => Seq(array(0) -> array(1)) } } .getOrElse (repos) @@ -182,7 +183,8 @@ } 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 sql"SELECT ISSUE_ID + 1 FROM ISSUE_ID WHERE USER_NAME = $owner AND REPOSITORY_NAME = $repository FOR UPDATE".as[Int] .firstOption.filter { id => @@ -207,55 +209,57 @@ .update (id) > 0 } get - def registerIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int) = - IssueLabels insert (IssueLabel(owner, repository, issueId, labelId)) + def registerIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int)(implicit s: Session) = + 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 def createComment(owner: String, repository: String, loginUser: String, - issueId: Int, content: String, action: String) = - IssueComments.autoInc insert ( - owner, - repository, - issueId, - action, - loginUser, - content, - currentDate, - currentDate) + issueId: Int, content: String, action: String)(implicit s: Session): Int = + IssueComments.autoInc insert IssueComment( + userName = owner, + repositoryName = repository, + issueId = issueId, + action = action, + commentedUserName = loginUser, + content = content, + registeredDate = currentDate, + updatedDate = currentDate) def updateIssue(owner: String, repository: String, issueId: Int, - title: String, content: Option[String]) = + title: String, content: Option[String])(implicit s: Session) = Issues .filter (_.byPrimaryKey(owner, repository, issueId)) .map { t => - t.title ~ t.content.? ~ t.updatedDate + (t.title, t.content.?, t.updatedDate) } .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) - 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) - def updateComment(commentId: Int, content: String) = + def updateComment(commentId: Int, content: String)(implicit s: Session) = IssueComments .filter (_.byPrimaryKey(commentId)) .map { t => - t.content ~ t.updatedDate + t.content -> t.updatedDate } .update (content, currentDate) - def deleteComment(commentId: Int) = + def deleteComment(commentId: Int)(implicit s: Session) = 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 .filter (_.byPrimaryKey(owner, repository, issueId)) .map { t => - t.closed ~ t.updatedDate + t.closed -> t.updatedDate } .update (closed, currentDate) @@ -267,8 +271,9 @@ * @param query the keywords separated by whitespace. * @return issues with comment count and matched content of issue or comment */ - def searchIssuesByKeyword(owner: String, repository: String, query: String): List[(Issue, Int, String)] = { - import scala.slick.driver.H2Driver.likeEncode + def searchIssuesByKeyword(owner: String, repository: String, query: String) + (implicit s: Session): List[(Issue, Int, String)] = { + import slick.driver.JdbcDriver.likeEncode val keywords = splitWords(query.toLowerCase) // Search Issue @@ -304,7 +309,7 @@ } issues.union(comments).sortBy { case (issue, commentId, _, _) => - issue.issueId ~ commentId + issue.issueId -> commentId }.list.splitWith { case ((issue1, _, _, _), (issue2, _, _, _)) => issue1.issueId == issue2.issueId }.map { _.head match { @@ -313,7 +318,7 @@ }.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 => for(issue <- getIssue(owner, repository, issueId) if !issue.closed){ createComment(owner, repository, userName, issue.issueId, "Close", "close") diff --git a/src/main/scala/service/LabelsService.scala b/src/main/scala/service/LabelsService.scala index a84bbf6..251e5fd 100644 --- a/src/main/scala/service/LabelsService.scala +++ b/src/main/scala/service/LabelsService.scala @@ -1,26 +1,31 @@ package service -import scala.slick.driver.H2Driver.simple._ -import Database.threadLocalSession - import model._ +import profile.simple._ trait LabelsService { - def getLabels(owner: String, repository: String): List[Label] = - Query(Labels).filter(_.byRepository(owner, repository)).sortBy(_.labelName asc).list + def getLabels(owner: String, repository: String)(implicit s: Session): List[Label] = + Labels.filter(_.byRepository(owner, repository)).sortBy(_.labelName asc).list - def getLabel(owner: String, repository: String, labelId: Int): Option[Label] = - Query(Labels).filter(_.byPrimaryKey(owner, repository, labelId)).firstOption + def getLabel(owner: String, repository: String, labelId: Int)(implicit s: Session): Option[Label] = + Labels.filter(_.byPrimaryKey(owner, repository, labelId)).firstOption - def createLabel(owner: String, repository: String, labelName: String, color: String): Unit = - Labels.ins insert (owner, repository, labelName, color) + def createLabel(owner: String, repository: String, labelName: String, color: String)(implicit s: Session): Unit = + Labels insert Label( + userName = owner, + repositoryName = repository, + labelName = labelName, + color = color + ) - def updateLabel(owner: String, repository: String, labelId: Int, labelName: String, color: String): Unit = - Labels.filter(_.byPrimaryKey(owner, repository, labelId)).map(t => t.labelName ~ t.color) - .update(labelName, color) + def updateLabel(owner: String, repository: String, labelId: Int, labelName: String, color: String) + (implicit s: Session): Unit = + Labels.filter(_.byPrimaryKey(owner, repository, labelId)) + .map(t => t.labelName -> t.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 Labels.filter(_.byPrimaryKey(owner, repository, labelId)).delete } diff --git a/src/main/scala/service/MilestonesService.scala b/src/main/scala/service/MilestonesService.scala index 01160c3..60073da 100644 --- a/src/main/scala/service/MilestonesService.scala +++ b/src/main/scala/service/MilestonesService.scala @@ -1,39 +1,46 @@ package service -import scala.slick.driver.H2Driver.simple._ -import Database.threadLocalSession - import model._ +import profile.simple._ trait MilestonesService { def createMilestone(owner: String, repository: String, title: String, description: Option[String], - dueDate: Option[java.util.Date]): Unit = - Milestones.ins insert (owner, repository, title, description, dueDate, None) + dueDate: Option[java.util.Date])(implicit s: Session): Unit = + 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 - .filter (t => t.byPrimaryKey(milestone.userName, milestone.repositoryName, milestone.milestoneId)) - .map (t => t.title ~ t.description.? ~ t.dueDate.? ~ t.closedDate.?) + .filter (t => t.byPrimaryKey(milestone.userName, milestone.repositoryName, milestone.milestoneId)) + .map (t => (t.title, t.description.?, t.dueDate.?, t.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) Milestones.filter(_.byPrimaryKey(owner, repository, milestoneId)).delete } - def getMilestone(owner: String, repository: String, milestoneId: Int): Option[Milestone] = - Query(Milestones).filter(_.byPrimaryKey(owner, repository, milestoneId)).firstOption + def getMilestone(owner: String, repository: String, milestoneId: Int)(implicit s: Session): Option[Milestone] = + 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 .filter { t => (t.byRepository(owner, repository)) && (t.milestoneId isNotNull) } - .groupBy { t => t.milestoneId ~ t.closed } - .map { case (t1, t2) => (t1._1 ~ t1._2) -> t2.length } + .groupBy { t => t.milestoneId -> t.closed } + .map { case (t1, t2) => t1._1 -> t1._2 -> t2.length } .toMap getMilestones(owner, repository).map { milestone => @@ -41,6 +48,7 @@ } } - def getMilestones(owner: String, repository: String): List[Milestone] = - Query(Milestones).filter(_.byRepository(owner, repository)).sortBy(_.milestoneId asc).list + def getMilestones(owner: String, repository: String)(implicit s: Session): List[Milestone] = + Milestones.filter(_.byRepository(owner, repository)).sortBy(_.milestoneId asc).list + } diff --git a/src/main/scala/service/PullRequestService.scala b/src/main/scala/service/PullRequestService.scala index 07f7145..026d640 100644 --- a/src/main/scala/service/PullRequestService.scala +++ b/src/main/scala/service/PullRequestService.scala @@ -1,26 +1,28 @@ package service -import scala.slick.driver.H2Driver.simple._ -import Database.threadLocalSession import model._ +import profile.simple._ trait PullRequestService { self: IssuesService => 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 => - Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId)).firstOption.map{ + PullRequests.filter(_.byPrimaryKey(owner, repository, issueId)).firstOption.map{ pullreq => (issue, pullreq) } } - def updateCommitId(owner: String, repository: String, issueId: Int, commitIdTo: String, commitIdFrom: String): Unit = - Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId)) - .map(pr => pr.commitIdTo ~ pr.commitIdFrom) - .update((commitIdTo, commitIdFrom)) + def updateCommitId(owner: String, repository: String, issueId: Int, commitIdTo: String, commitIdFrom: String) + (implicit s: Session): Unit = + PullRequests.filter(_.byPrimaryKey(owner, repository, issueId)) + .map(pr => pr.commitIdTo -> pr.commitIdFrom) + .update((commitIdTo, commitIdFrom)) - def getPullRequestCountGroupByUser(closed: Boolean, owner: String, repository: Option[String]): List[PullRequestCount] = - Query(PullRequests) + def getPullRequestCountGroupByUser(closed: Boolean, owner: String, repository: Option[String]) + (implicit s: Session): List[PullRequestCount] = + PullRequests .innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) } .filter { case (t1, t2) => (t2.closed is closed.bind) && @@ -28,15 +30,15 @@ (t1.repositoryName is repository.get.bind, repository.isDefined) } .groupBy { case (t1, t2) => t2.openedUserName } - .map { case (userName, t) => userName ~ t.length } + .map { case (userName, t) => userName -> t.length } .sortBy(_._2 desc) .list .map { x => PullRequestCount(x._1, x._2) } def createPullRequest(originUserName: String, originRepositoryName: String, issueId: Int, originBranch: String, requestUserName: String, requestRepositoryName: String, requestBranch: String, - commitIdFrom: String, commitIdTo: String): Unit = - PullRequests insert (PullRequest( + commitIdFrom: String, commitIdTo: String)(implicit s: Session): Unit = + PullRequests insert PullRequest( originUserName, originRepositoryName, issueId, @@ -45,10 +47,11 @@ requestRepositoryName, requestBranch, commitIdFrom, - commitIdTo)) + commitIdTo) - def getPullRequestsByRequest(userName: String, repositoryName: String, branch: String, closed: Boolean): List[PullRequest] = - Query(PullRequests) + def getPullRequestsByRequest(userName: String, repositoryName: String, branch: String, closed: Boolean) + (implicit s: Session): List[PullRequest] = + PullRequests .innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) } .filter { case (t1, t2) => (t1.requestUserName is userName.bind) && diff --git a/src/main/scala/service/RepositoryService.scala b/src/main/scala/service/RepositoryService.scala index 49fd102..7e478f7 100644 --- a/src/main/scala/service/RepositoryService.scala +++ b/src/main/scala/service/RepositoryService.scala @@ -1,8 +1,7 @@ package service import model._ -import scala.slick.driver.H2Driver.simple._ -import Database.threadLocalSession +import profile.simple._ import util.JGitUtil trait RepositoryService { self: AccountService => @@ -20,7 +19,8 @@ */ def createRepository(repositoryName: String, userName: String, description: Option[String], isPrivate: Boolean, 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 Repository( userName = userName, @@ -39,33 +39,34 @@ 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 => - (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) - val webHooks = Query(WebHooks ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val milestones = Query(Milestones ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val issueId = Query(IssueId ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val issues = Query(Issues ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val pullRequests = Query(PullRequests ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val labels = Query(Labels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val issueComments = Query(IssueComments).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val issueLabels = Query(IssueLabels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val activities = Query(Activities ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val collaborators = Query(Collaborators).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val webHooks = WebHooks .filter(_.byRepository(oldUserName, oldRepositoryName)).list + val milestones = Milestones .filter(_.byRepository(oldUserName, oldRepositoryName)).list + val issueId = IssueId .filter(_.byRepository(oldUserName, oldRepositoryName)).list + val issues = Issues .filter(_.byRepository(oldUserName, oldRepositoryName)).list + val pullRequests = PullRequests .filter(_.byRepository(oldUserName, oldRepositoryName)).list + val labels = Labels .filter(_.byRepository(oldUserName, oldRepositoryName)).list + val issueComments = IssueComments.filter(_.byRepository(oldUserName, oldRepositoryName)).list + val issueLabels = IssueLabels .filter(_.byRepository(oldUserName, oldRepositoryName)).list + val activities = Activities .filter(_.byRepository(oldUserName, oldRepositoryName)).list + val collaborators = Collaborators.filter(_.byRepository(oldUserName, oldRepositoryName)).list Repositories.filter { t => (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 => (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 => 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) @@ -88,7 +89,7 @@ val updateActivities = Activities.filter { t => (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) => Activities.filter(_.activityId is activityId.bind).map(_.message).update( @@ -104,7 +105,7 @@ } } - def deleteRepository(userName: String, repositoryName: String): Unit = { + def deleteRepository(userName: String, repositoryName: String)(implicit s: Session): Unit = { Activities .filter(_.byRepository(userName, repositoryName)).delete Collaborators .filter(_.byRepository(userName, repositoryName)).delete IssueLabels .filter(_.byRepository(userName, repositoryName)).delete @@ -124,8 +125,8 @@ * @param userName the user name of repository owner * @return the list of repository names */ - def getRepositoryNamesOfUser(userName: String): List[String] = - Query(Repositories) filter(_.userName is userName.bind) map (_.repositoryName) list + def getRepositoryNamesOfUser(userName: String)(implicit s: Session): List[String] = + Repositories filter(_.userName is userName.bind) map (_.repositoryName) list /** * Returns the specified repository information. @@ -135,10 +136,10 @@ * @param baseUrl the base url of this application * @return the repository information */ - def getRepository(userName: String, repositoryName: String, baseUrl: String): Option[RepositoryInfo] = { - (Query(Repositories) filter { t => t.byRepository(userName, repositoryName) } firstOption) map { repository => + def getRepository(userName: String, repositoryName: String, baseUrl: String)(implicit s: Session): Option[RepositoryInfo] = { + (Repositories filter { t => t.byRepository(userName, repositoryName) } firstOption) map { repository => // 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) }.map(_.pullRequest).list @@ -155,10 +156,10 @@ } } - def getUserRepositories(userName: String, baseUrl: String): List[RepositoryInfo] = { - Query(Repositories).filter { t1 => + def getUserRepositories(userName: String, baseUrl: String)(implicit s: Session): List[RepositoryInfo] = { + Repositories.filter { t1 => (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 => new RepositoryInfo( JGitUtil.getRepositoryInfo(repository.userName, repository.repositoryName, baseUrl), @@ -180,17 +181,18 @@ * @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. */ - 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 { // for Administrators - case Some(x) if(x.isAdmin) => Query(Repositories) + case Some(x) if(x.isAdmin) => Repositories // for Normal Users case Some(x) if(!x.isAdmin) => - Query(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) + Repositories filter { t => (t.isPrivate is false.bind) || (t.userName is x.userName) || + (Collaborators.filter { t2 => t2.byRepository(t.userName, t.repositoryName) && (t2.collaboratorName is x.userName.bind)} exists) } // for Guests - case None => Query(Repositories) filter(_.isPrivate is false.bind) + case None => Repositories filter(_.isPrivate is false.bind) }).filter { t => repositoryUserName.map { userName => t.userName is userName.bind } getOrElse ConstColumn.TRUE }.sortBy(_.lastActivityDate desc).list.map{ repository => @@ -205,7 +207,7 @@ } } - private def getRepositoryManagers(userName: String): Seq[String] = + private def getRepositoryManagers(userName: String)(implicit s: Session): Seq[String] = if(getAccountByUserName(userName).exists(_.isGroupAccount)){ getGroupMembers(userName).collect { case x if(x.isManager) => x.userName } } else { @@ -215,16 +217,16 @@ /** * 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) - + /** * Save repository options. */ 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)) - .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) /** @@ -234,8 +236,8 @@ * @param repositoryName the repository name * @param collaboratorName the collaborator name */ - def addCollaborator(userName: String, repositoryName: String, collaboratorName: String): Unit = - Collaborators insert(Collaborator(userName, repositoryName, collaboratorName)) + def addCollaborator(userName: String, repositoryName: String, collaboratorName: String)(implicit s: Session): Unit = + Collaborators insert Collaborator(userName, repositoryName, collaboratorName) /** * Remove collaborator from the repository. @@ -244,7 +246,7 @@ * @param repositoryName the repository 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 /** @@ -253,7 +255,7 @@ * @param userName the user name of the repository owner * @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 /** @@ -263,10 +265,10 @@ * @param repositoryName the repository name * @return the list of collaborators name */ - def getCollaborators(userName: String, repositoryName: String): List[String] = - Query(Collaborators).filter(_.byRepository(userName, repositoryName)).sortBy(_.collaboratorName).map(_.collaboratorName).list + def getCollaborators(userName: String, repositoryName: String)(implicit s: Session): List[String] = + 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 { case Some(a) if(a.isAdmin) => true case Some(a) if(a.userName == owner) => true @@ -275,17 +277,18 @@ } } - 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 => (t.originUserName is userName.bind) && (t.originRepositoryName is repositoryName.bind) }.length).first - def getForkedRepositories(userName: String, repositoryName: String): List[(String, String)] = - Query(Repositories).filter { t => + def getForkedRepositories(userName: String, repositoryName: String)(implicit s: Session): List[(String, String)] = + Repositories.filter { t => (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 } diff --git a/src/main/scala/service/RequestCache.scala b/src/main/scala/service/RequestCache.scala index 3747e85..b53cc28 100644 --- a/src/main/scala/service/RequestCache.scala +++ b/src/main/scala/service/RequestCache.scala @@ -1,6 +1,7 @@ package service import model._ +import slick.jdbc.JdbcBackend /** * This service is used for a view helper mainly. @@ -10,22 +11,24 @@ */ 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}"){ 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}"){ 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}"){ super.getAccountByMailAddress(mailAddress) } } } - diff --git a/src/main/scala/service/SshKeyService.scala b/src/main/scala/service/SshKeyService.scala index c249a3a..d38804a 100644 --- a/src/main/scala/service/SshKeyService.scala +++ b/src/main/scala/service/SshKeyService.scala @@ -1,19 +1,17 @@ package service import model._ -import scala.slick.driver.H2Driver.simple._ -import Database.threadLocalSession +import profile.simple._ trait SshKeyService { - def addPublicKey(userName: String, title: String, publicKey: String): Unit = - SshKeys.ins insert (userName, title, publicKey) + def addPublicKey(userName: String, title: String, publicKey: String)(implicit s: Session): Unit = + SshKeys insert SshKey(userName = userName, title = title, publicKey = publicKey) - def getPublicKeys(userName: String): List[SshKey] = - Query(SshKeys).filter(_.userName is userName.bind).sortBy(_.sshKeyId).list + def getPublicKeys(userName: String)(implicit s: Session): List[SshKey] = + 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 - } diff --git a/src/main/scala/service/WebHookService.scala b/src/main/scala/service/WebHookService.scala index 795123b..9061a07 100644 --- a/src/main/scala/service/WebHookService.scala +++ b/src/main/scala/service/WebHookService.scala @@ -1,9 +1,7 @@ package service -import scala.slick.driver.H2Driver.simple._ -import Database.threadLocalSession - import model._ +import profile.simple._ import org.slf4j.LoggerFactory import service.RepositoryService.RepositoryInfo import util.JGitUtil @@ -12,7 +10,6 @@ import org.eclipse.jgit.api.Git import org.apache.http.message.BasicNameValuePair import org.apache.http.client.entity.UrlEncodedFormEntity -import org.apache.http.protocol.HTTP import org.apache.http.NameValuePair trait WebHookService { @@ -20,14 +17,14 @@ private val logger = LoggerFactory.getLogger(classOf[WebHookService]) - def getWebHookURLs(owner: String, repository: String): List[WebHook] = - Query(WebHooks).filter(_.byRepository(owner, repository)).sortBy(_.url).list + def getWebHookURLs(owner: String, repository: String)(implicit s: Session): List[WebHook] = + WebHooks.filter(_.byRepository(owner, repository)).sortBy(_.url).list - def addWebHookURL(owner: String, repository: String, url :String): Unit = - WebHooks.insert(WebHook(owner, repository, url)) + def addWebHookURL(owner: String, repository: String, url :String)(implicit s: Session): Unit = + WebHooks insert WebHook(owner, repository, url) - def deleteWebHookURL(owner: String, repository: String, url :String): Unit = - Query(WebHooks).filter(_.byPrimaryKey(owner, repository, url)).delete + def deleteWebHookURL(owner: String, repository: String, url :String)(implicit s: Session): Unit = + WebHooks.filter(_.byPrimaryKey(owner, repository, url)).delete def callWebHook(owner: String, repository: String, webHookURLs: List[WebHook], payload: WebHookPayload): Unit = { import org.json4s._