diff --git a/src/main/scala/api/ApiError.scala b/src/main/scala/api/ApiError.scala new file mode 100644 index 0000000..d0470dc --- /dev/null +++ b/src/main/scala/api/ApiError.scala @@ -0,0 +1,5 @@ +package api + +case class ApiError( + message: String, + documentation_url: Option[String] = None) diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/app/AccountController.scala index 53f353a..b2650fc 100644 --- a/src/main/scala/app/AccountController.scala +++ b/src/main/scala/app/AccountController.scala @@ -167,7 +167,7 @@ get("/api/v3/user") { context.loginAccount.map { account => JsonFormat(ApiUser(account)) - } getOrElse NotFound + } getOrElse Unauthorized } diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala index ed9691b..a8b31fc 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/app/ControllerBase.scala @@ -51,6 +51,9 @@ // Git repository chain.doFilter(request, response) } else { + if(path.startsWith("/api/v3/")){ + httpRequest.setAttribute(Keys.Request.APIv3, true) + } // Scalatra actions super.doFilter(request, response, chain) } @@ -103,6 +106,9 @@ protected def NotFound() = if(request.hasAttribute(Keys.Request.Ajax)){ org.scalatra.NotFound() + } else if(request.hasAttribute(Keys.Request.APIv3)){ + contentType = formats("json") + org.scalatra.NotFound(api.ApiError("Not Found")) } else { org.scalatra.NotFound(html.error("Not Found")) } @@ -110,6 +116,9 @@ protected def Unauthorized()(implicit context: app.Context) = if(request.hasAttribute(Keys.Request.Ajax)){ org.scalatra.Unauthorized() + } else if(request.hasAttribute(Keys.Request.APIv3)){ + contentType = formats("json") + org.scalatra.Unauthorized(api.ApiError("Requires authentication")) } else { if(context.loginAccount.isDefined){ org.scalatra.Unauthorized(redirect("/")) diff --git a/src/main/scala/util/Keys.scala b/src/main/scala/util/Keys.scala index a934058..b6b6c79 100644 --- a/src/main/scala/util/Keys.scala +++ b/src/main/scala/util/Keys.scala @@ -72,6 +72,11 @@ val Ajax = "AJAX" /** + * Request key for the /api/v3 request flag. + */ + val APIv3 = "APIv3" + + /** * Request key for the username which is used during Git repository access. */ val UserName = "USER_NAME"