diff --git a/src/main/resources/update/gitbucket-core_4.32.xml b/src/main/resources/update/gitbucket-core_4.32.xml new file mode 100644 index 0000000..a6fdfaf --- /dev/null +++ b/src/main/resources/update/gitbucket-core_4.32.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/scala/gitbucket/core/GitBucketCoreModule.scala b/src/main/scala/gitbucket/core/GitBucketCoreModule.scala index 8e8c420..4a3003c 100644 --- a/src/main/scala/gitbucket/core/GitBucketCoreModule.scala +++ b/src/main/scala/gitbucket/core/GitBucketCoreModule.scala @@ -63,5 +63,6 @@ new Version("4.30.1"), new Version("4.31.0", new LiquibaseMigration("update/gitbucket-core_4.31.xml")), new Version("4.31.1"), - new Version("4.31.2") + new Version("4.31.2"), + new Version("4.32.0", new LiquibaseMigration("update/gitbucket-core_4.32.xml")) ) diff --git a/src/main/scala/gitbucket/core/api/ApiEmail.scala b/src/main/scala/gitbucket/core/api/ApiEmail.scala new file mode 100644 index 0000000..20681e2 --- /dev/null +++ b/src/main/scala/gitbucket/core/api/ApiEmail.scala @@ -0,0 +1,16 @@ +package gitbucket.core.api +import gitbucket.core.model.Account + +case class ApiEmail( + email: String, + primary: Boolean +) { + val verified = true + val visibility = "public" +} + +object ApiEmail { + def fromMailAddresses(primaryMailAddress: String, extraMailAddresses: List[String]): List[ApiEmail] = { + ApiEmail(primaryMailAddress, true) :: extraMailAddresses.map { ApiEmail(_, false) } + } +} diff --git a/src/main/scala/gitbucket/core/api/ApiPermission.scala b/src/main/scala/gitbucket/core/api/ApiPermission.scala new file mode 100644 index 0000000..976f3ae --- /dev/null +++ b/src/main/scala/gitbucket/core/api/ApiPermission.scala @@ -0,0 +1,13 @@ +package gitbucket.core.api +import gitbucket.core.service.RepositoryService + +case class ApiPermission( + admin: Boolean, + push: Boolean, + pull: Boolean +) + +object ApiPermission { + def apply(permission: RepositoryService.RepositoryPermission): ApiPermission = + ApiPermission(permission.isOwner, permission.isDeveloper, permission.isGuest) +} diff --git a/src/main/scala/gitbucket/core/api/ApiRepository.scala b/src/main/scala/gitbucket/core/api/ApiRepository.scala index 860210d..44f9b5d 100644 --- a/src/main/scala/gitbucket/core/api/ApiRepository.scala +++ b/src/main/scala/gitbucket/core/api/ApiRepository.scala @@ -1,6 +1,9 @@ package gitbucket.core.api +import java.time.Instant + import gitbucket.core.model.{Account, Repository} +import gitbucket.core.service.RepositoryService import gitbucket.core.service.RepositoryService.RepositoryInfo // https://developer.github.com/v3/repos/ @@ -8,13 +11,17 @@ name: String, full_name: String, description: String, + id: Int, watchers: Int, forks: Int, `private`: Boolean, + fork: Boolean, default_branch: String, - owner: ApiUser + owner: ApiUser, + created_at: java.util.Date, + updated_at: java.util.Date, + permissions: Option[ApiPermission] ) { - val id = 0 // dummy id val forks_count = forks val watchers_count = watchers val url = ApiPath(s"/api/v3/repos/${full_name}") @@ -28,6 +35,7 @@ def apply( repository: Repository, owner: ApiUser, + permission: Option[RepositoryService.RepositoryPermission], forkedCount: Int = 0, watchers: Int = 0 ): ApiRepository = @@ -35,28 +43,45 @@ name = repository.repositoryName, full_name = s"${repository.userName}/${repository.repositoryName}", description = repository.description.getOrElse(""), + id = repository.repositoryId, watchers = watchers, forks = forkedCount, `private` = repository.isPrivate, + fork = repository.parentRepositoryName.isDefined, default_branch = repository.defaultBranch, - owner = owner + owner = owner, + created_at = repository.registeredDate, + updated_at = repository.updatedDate, + permission.map(ApiPermission(_)) ) - def apply(repositoryInfo: RepositoryInfo, owner: ApiUser): ApiRepository = - ApiRepository(repositoryInfo.repository, owner, forkedCount = repositoryInfo.forkedCount) + def apply( + repositoryInfo: RepositoryInfo, + owner: Account, + permission: RepositoryService.RepositoryPermission + ): ApiRepository = + ApiRepository(repositoryInfo.repository, ApiUser(owner), Some(permission), forkedCount = repositoryInfo.forkedCount) - def apply(repositoryInfo: RepositoryInfo, owner: Account): ApiRepository = - this(repositoryInfo, ApiUser(owner)) + def apply( + repositoryInfo: RepositoryInfo, + owner: Account + ): ApiRepository = + ApiRepository(repositoryInfo.repository, ApiUser(owner), None, forkedCount = repositoryInfo.forkedCount) def forDummyPayload(owner: ApiUser): ApiRepository = ApiRepository( name = "dummy", full_name = s"${owner.login}/dummy", description = "", + id = 0, watchers = 0, forks = 0, `private` = false, + fork = false, default_branch = "master", - owner = owner + owner = owner, + new java.util.Date, + new java.util.Date, + Some(ApiPermission(RepositoryService.RepositoryPermission(true, true, true))) ) } diff --git a/src/main/scala/gitbucket/core/api/ApiRepositoryWebhook.scala b/src/main/scala/gitbucket/core/api/ApiRepositoryWebhook.scala new file mode 100644 index 0000000..ff939ca --- /dev/null +++ b/src/main/scala/gitbucket/core/api/ApiRepositoryWebhook.scala @@ -0,0 +1,23 @@ +package gitbucket.core.api +import gitbucket.core.model.RepositoryWebHook +import gitbucket.core.model.WebHook + +case class ApiRepositoryWebhook( + id: Int, + events: Seq[String], + config: ApiWebhook +) { + val active = true + val name = "web" +} + +object ApiRepositoryWebhook { + def apply(repositoryWebhook: RepositoryWebHook, events: Set[WebHook.Event]): ApiRepositoryWebhook = + ApiRepositoryWebhook( + id = repositoryWebhook.webHookId, + events = events.map { e => + e.name + }.toSeq, + config = ApiWebhook(repositoryWebhook.url, repositoryWebhook.ctype.ctype) + ) +} diff --git a/src/main/scala/gitbucket/core/api/ApiWebhook.scala b/src/main/scala/gitbucket/core/api/ApiWebhook.scala new file mode 100644 index 0000000..2d54580 --- /dev/null +++ b/src/main/scala/gitbucket/core/api/ApiWebhook.scala @@ -0,0 +1,4 @@ +package gitbucket.core.api +import gitbucket.core.model.WebHook + +case class ApiWebhook(url: String, content_type: String) diff --git a/src/main/scala/gitbucket/core/api/CreateAWebhook.scala b/src/main/scala/gitbucket/core/api/CreateAWebhook.scala new file mode 100644 index 0000000..b461129 --- /dev/null +++ b/src/main/scala/gitbucket/core/api/CreateAWebhook.scala @@ -0,0 +1,15 @@ +package gitbucket.core.api + +case class CreateAWebhookConfig( + url: String, + content_type: String = "form", + secret: Option[String], + insecure_ssl: Option[String] +) + +case class CreateAWebhook( + name: Option[String], + config: CreateAWebhookConfig, + events: Seq[String], + active: Option[Boolean] +) diff --git a/src/main/scala/gitbucket/core/api/JsonFormat.scala b/src/main/scala/gitbucket/core/api/JsonFormat.scala index e1d0869..3a9cfcf 100644 --- a/src/main/scala/gitbucket/core/api/JsonFormat.scala +++ b/src/main/scala/gitbucket/core/api/JsonFormat.scala @@ -45,6 +45,10 @@ FieldSerializer[ApiCommits.File]() + FieldSerializer[ApiRelease]() + FieldSerializer[ApiReleaseAsset]() + + FieldSerializer[ApiPermission]() + + FieldSerializer[ApiWebhook]() + + FieldSerializer[ApiRepositoryWebhook]() + + FieldSerializer[ApiEmail]() + ApiBranchProtection.enforcementLevelSerializer def apiPathSerializer(c: Context) = diff --git a/src/main/scala/gitbucket/core/controller/ApiController.scala b/src/main/scala/gitbucket/core/controller/ApiController.scala index f84111a..53b4d44 100644 --- a/src/main/scala/gitbucket/core/controller/ApiController.scala +++ b/src/main/scala/gitbucket/core/controller/ApiController.scala @@ -22,6 +22,7 @@ with ApiRepositoryContentsControllerBase with ApiRepositoryControllerBase with ApiRepositoryStatusControllerBase + with ApiRepositoryWebhookcontrollerBase with ApiUserControllerBase with RepositoryService with AccountService diff --git a/src/main/scala/gitbucket/core/controller/api/ApiPullRequestControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiPullRequestControllerBase.scala index 14aaccb..3f506af 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiPullRequestControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiPullRequestControllerBase.scala @@ -53,8 +53,12 @@ ApiPullRequest( issue = issue, pullRequest = pullRequest, - headRepo = ApiRepository(headRepo, ApiUser(headOwner)), - baseRepo = ApiRepository(repository, ApiUser(baseOwner)), + headRepo = ApiRepository( + headRepo, + ApiUser(headOwner), + Some(getPermission(headRepo.userName, headRepo.repositoryName, context.loginAccount)) + ), + baseRepo = ApiRepository(repository, baseOwner), user = ApiUser(issueUser), labels = getIssueLabels(repository.owner, repository.name, issue.issueId) .map(ApiLabel(_, RepositoryName(repository))), @@ -239,8 +243,8 @@ ApiPullRequest( issue = issue, pullRequest = pullRequest, - headRepo = ApiRepository(headRepo, ApiUser(headOwner)), - baseRepo = ApiRepository(repository, ApiUser(baseOwner)), + headRepo = ApiRepository(headRepo, headOwner), + baseRepo = ApiRepository(repository, baseOwner), user = ApiUser(issueUser), labels = getIssueLabels(repository.owner, repository.name, issue.issueId) .map(ApiLabel(_, RepositoryName(repository))), diff --git a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryControllerBase.scala index 5c4b13d..a83290f 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryControllerBase.scala @@ -30,7 +30,7 @@ */ get("/api/v3/user/repos")(usersOnly { JsonFormat(getVisibleRepositories(context.loginAccount, Option(context.loginAccount.get.userName)).map { r => - ApiRepository(r, getAccountByUserName(r.owner).get) + ApiRepository(r, getAccountByUserName(r.owner).get, getPermission(r.owner, r.name, context.loginAccount)) }) }) @@ -40,7 +40,7 @@ */ get("/api/v3/users/:userName/repos") { JsonFormat(getVisibleRepositories(context.loginAccount, Some(params("userName"))).map { r => - ApiRepository(r, getAccountByUserName(r.owner).get) + ApiRepository(r, getAccountByUserName(r.owner).get, getPermission(r.owner, r.name, context.loginAccount)) }) } @@ -50,7 +50,7 @@ */ get("/api/v3/orgs/:orgName/repos") { JsonFormat(getVisibleRepositories(context.loginAccount, Some(params("orgName"))).map { r => - ApiRepository(r, getAccountByUserName(r.owner).get) + ApiRepository(r, getAccountByUserName(r.owner).get, getPermission(r.owner, r.name, context.loginAccount)) }) } @@ -90,7 +90,13 @@ val repository = Database() withTransaction { session => getRepository(owner, data.name)(session).get } - JsonFormat(ApiRepository(repository, ApiUser(getAccountByUserName(owner).get))) + JsonFormat( + ApiRepository( + repository, + getAccountByUserName(owner).get, + getPermission(repository.owner, repository.name, context.loginAccount) + ) + ) } else { ApiError( "A repository with this name already exists on this account", @@ -124,7 +130,13 @@ val repository = Database() withTransaction { session => getRepository(groupName, data.name).get } - JsonFormat(ApiRepository(repository, ApiUser(getAccountByUserName(groupName).get))) + JsonFormat( + ApiRepository( + repository, + getAccountByUserName(groupName).get, + getPermission(repository.owner, repository.name, context.loginAccount) + ) + ) } else { ApiError( "A repository with this name already exists for this group", @@ -140,7 +152,13 @@ * https://developer.github.com/v3/repos/#get */ get("/api/v3/repos/:owner/:repository")(referrersOnly { repository => - JsonFormat(ApiRepository(repository, ApiUser(getAccountByUserName(repository.owner).get))) + JsonFormat( + ApiRepository( + repository, + getAccountByUserName(repository.owner).get, + getPermission(repository.owner, repository.name, context.loginAccount) + ) + ) }) /* diff --git a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryWebhookcontrollerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryWebhookcontrollerBase.scala new file mode 100644 index 0000000..f2283ea --- /dev/null +++ b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryWebhookcontrollerBase.scala @@ -0,0 +1,100 @@ +package gitbucket.core.controller.api +import gitbucket.core.api.{ApiRepositoryWebhook, CreateAWebhook, JsonFormat} +import gitbucket.core.controller.ControllerBase +import gitbucket.core.model.{WebHook, WebHookContentType} +import gitbucket.core.service.WebHookService +import gitbucket.core.util.OwnerAuthenticator +import gitbucket.core.util.Implicits._ +import org.scalatra.{NoContent, NotFound} + +trait ApiRepositoryWebhookcontrollerBase extends ControllerBase { + self: WebHookService with OwnerAuthenticator => + + /** + * i. List hooks + * https://developer.github.com/v3/repos/hooks/#list-hooks + */ + get("/api/v3/repos/:owner/:repository/hooks")(ownerOnly { repository => + JsonFormat(getWebHooks(repository.owner, repository.name).map { + case (wh, events) => + ApiRepositoryWebhook(wh, events) + }) + }) + + /* + * ii. Get single hook + * https://developer.github.com/v3/repos/hooks/#get-single-hook + * not implemented + */ + get("/api/v3/repos/:owner/:repository/hooks/:id")(ownerOnly { repository => + params + .get("id") + .map { id => + getWebHookById(repository.owner, repository.name, id.toInt) + .map { + case (hook, events) => + JsonFormat(ApiRepositoryWebhook(hook, events)) + } + .getOrElse(NotFound) + } + .getOrElse(NotFound) + }) + + /** + * iii. Create a hook + * https://developer.github.com/v3/repos/hooks/#create-a-hook + */ + post("/api/v3/repos/:owner/:repository/hooks")(ownerOnly { repository => + (for { + data <- extractFromJsonBody[CreateAWebhook] + loginAccount <- context.loginAccount + } yield { + val url = data.config.url + val events = data.events.map(WebHook.Event.valueOf(_)).toSet + val ctype = WebHookContentType.valueOf(data.config.content_type) + val webHook = addWebHook(repository.owner, repository.name, url, events, ctype, data.config.secret) + JsonFormat(ApiRepositoryWebhook(webHook, events)) + }).getOrElse(NotFound()) + }) + + /* + * iv. Edit a hook + * https://developer.github.com/v3/repos/hooks/#edit-a-hook + * not implemented + */ + + /* + * v. Test a push hook + * https://developer.github.com/v3/repos/hooks/#test-a-push-hook + * not implemented + */ + + /* + * vi. Ping a hook + * https://developer.github.com/v3/repos/hooks/#ping-a-hook + * not implemented + */ + + /* + * vii. Delete a hook + * https://developer.github.com/v3/repos/hooks/#delete-a-hook + * not implemented + */ + delete("/api/v3/repos/:owner/:repository/hooks/:id")(ownerOnly { repository => + deleteWebHook(repository.owner, repository.name, params("id").toInt) + NoContent() + }) + + /* + * viii. Receiving Webhooks + * https://developer.github.com/v3/repos/hooks/#receiving-webhooks + * not implemented + */ + + /* + * ix. PubSubHubbub + * https://developer.github.com/v3/repos/hooks/#pubsubhubbub + * not implemented + */ + +} diff --git a/src/main/scala/gitbucket/core/controller/api/ApiUserControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiUserControllerBase.scala index 4b69621..084fddc 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiUserControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiUserControllerBase.scala @@ -1,5 +1,5 @@ package gitbucket.core.controller.api -import gitbucket.core.api.{ApiUser, CreateAUser, JsonFormat, UpdateAUser} +import gitbucket.core.api._ import gitbucket.core.controller.ControllerBase import gitbucket.core.service.{AccountService, RepositoryService} import gitbucket.core.util.{AdminAuthenticator, UsersAuthenticator} @@ -111,4 +111,37 @@ NotFound() } }) + + /** + * Emails i. List email addresses for a user + * https://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user + */ + get("/api/v3/user/emails")(usersOnly { + JsonFormat( + ApiEmail.fromMailAddresses( + context.loginAccount.get.mailAddress, + getAccountExtraMailAddresses(context.loginAccount.get.userName) + ) + ) + }) + + /* + * ii. List public email addresses for a user + * https://developer.github.com/v3/users/emails/#list-public-email-addresses-for-a-user + */ + + /* + * iii. Add email address(es) + * https://developer.github.com/v3/users/emails/#add-email-addresses + */ + + /* + * iv. Delete email address(es) + * https://developer.github.com/v3/users/emails/#delete-email-addresses + */ + + /* + * v. Toggle primary email visibility + * https://developer.github.com/v3/users/emails/#toggle-primary-email-visibility + */ } diff --git a/src/main/scala/gitbucket/core/model/Repository.scala b/src/main/scala/gitbucket/core/model/Repository.scala index a62047d..6c19d18 100644 --- a/src/main/scala/gitbucket/core/model/Repository.scala +++ b/src/main/scala/gitbucket/core/model/Repository.scala @@ -10,6 +10,7 @@ val isPrivate = column[Boolean]("PRIVATE") val description = column[String]("DESCRIPTION") val defaultBranch = column[String]("DEFAULT_BRANCH") + val repositoryId = column[Int]("REPOSITORY_ID", O AutoInc) val registeredDate = column[java.util.Date]("REGISTERED_DATE") val updatedDate = column[java.util.Date]("UPDATED_DATE") val lastActivityDate = column[java.util.Date]("LAST_ACTIVITY_DATE") @@ -36,6 +37,7 @@ registeredDate, updatedDate, lastActivityDate, + repositoryId, originUserName.?, originRepositoryName.?, parentUserName.?, @@ -57,6 +59,7 @@ repository._10, repository._11, repository._12, + repository._13, RepositoryOptions.tupled.apply(options) ) }, { (r: Repository) => @@ -71,6 +74,7 @@ r.registeredDate, r.updatedDate, r.lastActivityDate, + r.repositoryId, r.originUserName, r.originRepositoryName, r.parentUserName, @@ -96,6 +100,7 @@ registeredDate: java.util.Date, updatedDate: java.util.Date, lastActivityDate: java.util.Date, + repositoryId: Int = 0, originUserName: Option[String], originRepositoryName: Option[String], parentUserName: Option[String], diff --git a/src/main/scala/gitbucket/core/model/RepositoryWebHook.scala b/src/main/scala/gitbucket/core/model/RepositoryWebHook.scala index 15ea535..36b2031 100644 --- a/src/main/scala/gitbucket/core/model/RepositoryWebHook.scala +++ b/src/main/scala/gitbucket/core/model/RepositoryWebHook.scala @@ -12,11 +12,15 @@ val url = column[String]("URL") val token = column[Option[String]]("TOKEN") val ctype = column[WebHookContentType]("CTYPE") + val webHookId = column[Int]("WEB_HOOK_ID", O AutoInc) def * = - (userName, repositoryName, url, ctype, token) <> ((RepositoryWebHook.apply _).tupled, RepositoryWebHook.unapply) + (userName, repositoryName, url, ctype, token, webHookId) <> ((RepositoryWebHook.apply _).tupled, RepositoryWebHook.unapply) def byPrimaryKey(owner: String, repository: String, url: String) = byRepository(owner, repository) && (this.url === url.bind) + + def byId(owner: String, repository: String, id: Int) = + byRepository(owner, repository) && (this.webHookId === id.bind) } } @@ -25,5 +29,6 @@ repositoryName: String, url: String, ctype: WebHookContentType, - token: Option[String] + token: Option[String], + webHookId: Int = 0 ) extends WebHook diff --git a/src/main/scala/gitbucket/core/service/RepositoryService.scala b/src/main/scala/gitbucket/core/service/RepositoryService.scala index 2f152db..64bbd8e 100644 --- a/src/main/scala/gitbucket/core/service/RepositoryService.scala +++ b/src/main/scala/gitbucket/core/service/RepositoryService.scala @@ -728,6 +728,15 @@ } } + def getPermission(owner: String, repository: String, loginAccount: Option[Account])( + implicit s: Session + ): RepositoryPermission = + RepositoryPermission( + hasOwnerRole(owner, repository, loginAccount), + hasDeveloperRole(owner, repository, loginAccount), + hasGuestRole(owner, repository, loginAccount) + ) + private def getForkedCount(userName: String, repositoryName: String)(implicit s: Session): Int = Query(Repositories.filter { t => (t.originUserName === userName.bind) && (t.originRepositoryName === repositoryName.bind) @@ -778,6 +787,8 @@ } object RepositoryService { + case class RepositoryPermission(isOwner: Boolean, isDeveloper: Boolean, isGuest: Boolean) + case class RepositoryInfo( owner: String, name: String, diff --git a/src/main/scala/gitbucket/core/service/WebHookService.scala b/src/main/scala/gitbucket/core/service/WebHookService.scala index d3dff04..3496f25 100644 --- a/src/main/scala/gitbucket/core/service/WebHookService.scala +++ b/src/main/scala/gitbucket/core/service/WebHookService.scala @@ -74,6 +74,22 @@ .list .distinct + /** get WebHook by Id */ + def getWebHookById(owner: String, repository: String, id: Int)( + implicit s: Session + ): Option[(RepositoryWebHook, Set[WebHook.Event])] = + RepositoryWebHooks + .filter(_.byId(owner, repository, id)) + .join(RepositoryWebHookEvents) + .on { (w, t) => + t.byRepositoryWebHook(w) + } + .map { case (w, t) => w -> t.event } + .list + .groupBy(_._1) + .mapValues(_.map(_._2).toSet) + .headOption + /** get All WebHook information from repository to url */ def getWebHook(owner: String, repository: String, url: String)( implicit s: Session @@ -97,11 +113,14 @@ events: Set[WebHook.Event], ctype: WebHookContentType, token: Option[String] - )(implicit s: Session): Unit = { - RepositoryWebHooks insert RepositoryWebHook(owner, repository, url, ctype, token) + )(implicit s: Session): RepositoryWebHook = { + val hook = RepositoryWebHook(owner, repository, url, ctype, token) + RepositoryWebHooks insert hook events.map { event: WebHook.Event => RepositoryWebHookEvents insert RepositoryWebHookEvent(owner, repository, url, event) - } + event + }.toSet + hook } def updateWebHook( @@ -125,6 +144,9 @@ def deleteWebHook(owner: String, repository: String, url: String)(implicit s: Session): Unit = RepositoryWebHooks.filter(_.byPrimaryKey(owner, repository, url)).delete + def deleteWebHook(owner: String, repository: String, id: Int)(implicit s: Session): Unit = + RepositoryWebHooks.filter(_.byId(owner, repository, id)).delete + /** get All AccountWebHook informations of user */ def getAccountWebHooks(owner: String)(implicit s: Session): List[(AccountWebHook, Set[WebHook.Event])] = AccountWebHooks @@ -322,7 +344,7 @@ WebHookIssuesPayload( action = action, number = issue.issueId, - repository = ApiRepository(repository, ApiUser(repoOwner)), + repository = ApiRepository(repository, repoOwner), issue = ApiIssue( issue, RepositoryName(repository), diff --git a/src/test/scala/gitbucket/core/api/ApiSpecModels.scala b/src/test/scala/gitbucket/core/api/ApiSpecModels.scala index 0085b9d..b9a129d 100644 --- a/src/test/scala/gitbucket/core/api/ApiSpecModels.scala +++ b/src/test/scala/gitbucket/core/api/ApiSpecModels.scala @@ -182,7 +182,8 @@ repository = repository, owner = apiUser, forkedCount = repositoryInfo.forkedCount, - watchers = 0 + watchers = 0, + permission = None ) val apiLabel = ApiLabel( @@ -409,6 +410,8 @@ assets = Seq(apiReleaseAsset) ) + val apiEmail = ApiEmail("root@localhost", true) + // JSON String for APIs val jsonUser = """{ @@ -427,12 +430,15 @@ |"name":"Hello-World", |"full_name":"octocat/Hello-World", |"description":"This your first repo!", + |"id":0, |"watchers":0, |"forks":1, |"private":false, + |"fork":true, |"default_branch":"master", |"owner":$jsonUser, - |"id":0, + |"created_at":"2011-04-14T16:00:49Z", + |"updated_at":"2011-04-14T16:00:49Z", |"forks_count":1, |"watchers_count":0, |"url":"http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World", @@ -687,4 +693,12 @@ |"author":${jsonUser}, |"assets":[${jsonReleaseAsset}] |}""".stripMargin + + val jsonEmail = + s"""{ + |"email":"root@localhost", + |"primary":true, + |"verified":true, + |"visibility":"public" + |}""".stripMargin } diff --git a/src/test/scala/gitbucket/core/api/JsonFormatSpec.scala b/src/test/scala/gitbucket/core/api/JsonFormatSpec.scala index 6a6ee26..e22305c 100644 --- a/src/test/scala/gitbucket/core/api/JsonFormatSpec.scala +++ b/src/test/scala/gitbucket/core/api/JsonFormatSpec.scala @@ -79,4 +79,7 @@ test("apiRelease") { assert(JsonFormat(apiRelease) == expected(jsonRelease)) } + test("apiEmail") { + assert(JsonFormat(apiEmail) == expected(jsonEmail)) + } } diff --git a/src/test/scala/gitbucket/core/service/WebHookServiceSpec.scala b/src/test/scala/gitbucket/core/service/WebHookServiceSpec.scala index 5f151ad..6c7ea04 100644 --- a/src/test/scala/gitbucket/core/service/WebHookServiceSpec.scala +++ b/src/test/scala/gitbucket/core/service/WebHookServiceSpec.scala @@ -52,19 +52,27 @@ val formType = WebHookContentType.FORM val jsonType = WebHookContentType.JSON service.addWebHook("user1", "repo1", "http://example.com", Set(WebHook.PullRequest), formType, Some("key")) + val hookId = 1 + assert( service.getWebHooks("user1", "repo1") == List( - (RepositoryWebHook("user1", "repo1", "http://example.com", formType, Some("key")), Set(WebHook.PullRequest)) + ( + RepositoryWebHook("user1", "repo1", "http://example.com", formType, Some("key"), hookId), + Set(WebHook.PullRequest) + ) ) ) assert( service.getWebHook("user1", "repo1", "http://example.com") == Some( - (RepositoryWebHook("user1", "repo1", "http://example.com", formType, Some("key")), Set(WebHook.PullRequest)) + ( + RepositoryWebHook("user1", "repo1", "http://example.com", formType, Some("key"), hookId), + Set(WebHook.PullRequest) + ) ) ) assert( service.getWebHooksByEvent("user1", "repo1", WebHook.PullRequest) == List( - (RepositoryWebHook("user1", "repo1", "http://example.com", formType, Some("key"))) + (RepositoryWebHook("user1", "repo1", "http://example.com", formType, Some("key"), hookId)) ) ) assert(service.getWebHooksByEvent("user1", "repo1", WebHook.Push) == Nil) @@ -82,7 +90,7 @@ assert( service.getWebHook("user1", "repo1", "http://example.com") == Some( ( - RepositoryWebHook("user1", "repo1", "http://example.com", jsonType, Some("key")), + RepositoryWebHook("user1", "repo1", "http://example.com", jsonType, Some("key"), hookId), Set(WebHook.Push, WebHook.Issues) ) ) @@ -90,7 +98,7 @@ assert(service.getWebHooksByEvent("user1", "repo1", WebHook.PullRequest) == Nil) assert( service.getWebHooksByEvent("user1", "repo1", WebHook.Push) == List( - (RepositoryWebHook("user1", "repo1", "http://example.com", jsonType, Some("key"))) + (RepositoryWebHook("user1", "repo1", "http://example.com", jsonType, Some("key"), hookId)) ) ) service.deleteWebHook("user1", "repo1", "http://example.com") @@ -114,9 +122,11 @@ ) assert( service.getWebHooks("user1", "repo1") == List( - RepositoryWebHook("user1", "repo1", "http://example.com/1", ctype, Some("key")) -> Set(WebHook.PullRequest), - RepositoryWebHook("user1", "repo1", "http://example.com/2", ctype, Some("key")) -> Set(WebHook.Push), - RepositoryWebHook("user1", "repo1", "http://example.com/3", ctype, Some("key")) -> Set( + RepositoryWebHook("user1", "repo1", "http://example.com/1", ctype, Some("key"), 1) -> Set( + WebHook.PullRequest + ), + RepositoryWebHook("user1", "repo1", "http://example.com/2", ctype, Some("key"), 2) -> Set(WebHook.Push), + RepositoryWebHook("user1", "repo1", "http://example.com/3", ctype, Some("key"), 3) -> Set( WebHook.PullRequest, WebHook.Push ) @@ -124,8 +134,8 @@ ) assert( service.getWebHooksByEvent("user1", "repo1", WebHook.PullRequest) == List( - RepositoryWebHook("user1", "repo1", "http://example.com/1", ctype, Some("key")), - RepositoryWebHook("user1", "repo1", "http://example.com/3", ctype, Some("key")) + RepositoryWebHook("user1", "repo1", "http://example.com/1", ctype, Some("key"), 1), + RepositoryWebHook("user1", "repo1", "http://example.com/3", ctype, Some("key"), 3) ) ) }