diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala index 48a41d0..3ebad37 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/app/ControllerBase.scala @@ -16,7 +16,7 @@ implicit def context: Context = Context(servletContext.getContextPath, LoginUser) // TODO get from session - private val LoginUser = System.getProperty("user.name") + private val LoginUser = "admin" //System.getProperty("user.name") } diff --git a/src/main/scala/app/CreateRepositoryController.scala b/src/main/scala/app/CreateRepositoryController.scala index a043e21..026ae0c 100644 --- a/src/main/scala/app/CreateRepositoryController.scala +++ b/src/main/scala/app/CreateRepositoryController.scala @@ -1,25 +1,27 @@ package app import util.Directory._ -import org.scalatra._ +import service._ import java.io.File import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib._ import org.apache.commons.io._ import jp.sf.amateras.scalatra.forms._ +class CreateRepositoryController extends CreateRepositoryControllerBase with ProjectService with AccountService + /** * Creates new repository. */ -class CreateRepositoryController extends ControllerBase { - - case class RepositoryCreationForm(name: String, description: String) - +trait CreateRepositoryControllerBase extends ControllerBase { self: ProjectService => + + case class RepositoryCreationForm(name: String, description: String) // TODO Option + val form = mapping( - "name" -> trim(label("Repository name", text(required, maxlength(40), repository))), + "name" -> trim(label("Repository name", text(required, maxlength(40), repository))), "description" -> trim(label("Description" , text())) )(RepositoryCreationForm.apply) - + /** * Show the new repository form. */ @@ -60,6 +62,9 @@ } finally { FileUtils.deleteDirectory(tmpdir) } + + // insert to the database + createProject(form.name, context.loginUser, Some(form.description)) // redirect to the repository redirect("/%s/%s".format(context.loginUser, form.name)) diff --git a/src/main/scala/model/Project.scala b/src/main/scala/model/Project.scala index 10d1c21..a383fac 100644 --- a/src/main/scala/model/Project.scala +++ b/src/main/scala/model/Project.scala @@ -11,7 +11,7 @@ def defaultBranch = column[String]("DEFAULT_BRANCH") def registeredDate = column[java.sql.Date]("REGISTERED_DATE") // TODO convert java.util.Date later def updatedDate = column[java.sql.Date]("UPDATED_DATE") - def lastActivityDate = column[java.sql.Date]("LAST_LOGIN_DATE") + def lastActivityDate = column[java.sql.Date]("LAST_ACTIVITY_DATE") def * = projectId.? ~ projectName ~ userId ~ projectType ~ description.? ~ defaultBranch ~ registeredDate ~ updatedDate ~ lastActivityDate <> (Project, Project.unapply _) def ins = projectName ~ userId ~ projectType ~ description.? ~ defaultBranch ~ registeredDate ~ updatedDate ~ lastActivityDate <> ({ t => Project(None, t._1, t._2, t._3, t._4, t._5, t._6, t._7, t._8)}, { (o: Project) => Some((o.projectName, o.userId, o.projectType, o.description, o.defaultBranch, o.registeredDate, o.updatedDate, o.lastActivityDate))}) } diff --git a/src/main/scala/service/AccountService.scala b/src/main/scala/service/AccountService.scala new file mode 100644 index 0000000..3454c35 --- /dev/null +++ b/src/main/scala/service/AccountService.scala @@ -0,0 +1,12 @@ +package service + +import model._ +import scala.slick.driver.H2Driver.simple._ +import Database.threadLocalSession + +trait AccountService { + + def getAccountByUserName(userName: String): Option[Account] = + Query(Accounts) filter(_.userName is userName.bind) firstOption + +} diff --git a/src/main/scala/service/ProjectService.scala b/src/main/scala/service/ProjectService.scala new file mode 100644 index 0000000..aff6d37 --- /dev/null +++ b/src/main/scala/service/ProjectService.scala @@ -0,0 +1,37 @@ +package service + +import model._ +import scala.slick.driver.H2Driver.simple._ +import Database.threadLocalSession + +trait ProjectService { self: AccountService => + + /** + * Creates a new project. + * + * The project is created as public repository at first. Users can modify the project type at the repository settings + * page after the project creation to configure the project as the private repository. + * + * @param projectName the project name + * @param userName the user name of the project owner + * @param description the project description + * @return the created project id + */ + def createProject(projectName: String, userName: String, description: Option[String]): Long = { + // TODO create a git repository also here? + + val currentDate = new java.sql.Date(System.currentTimeMillis) + Projects.ins returning Projects.projectId insert + Project( + projectId = None, + projectName = projectName, + userId = getAccountByUserName(userName).get.userId.get, + projectType = 0 /* 0:public, 1:private */, + description = description, + defaultBranch = "master", + registeredDate = currentDate, + updatedDate = currentDate, + lastActivityDate = currentDate) + } + +}