mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 02:18:26 +00:00
Update scalafmt settings
This commit is contained in:
@ -56,8 +56,8 @@ object Config {
|
||||
case class AllowedIps(enabled: Boolean, ips: Set[String]) {
|
||||
|
||||
def containsAddress(ipa: IpAddress): Boolean = {
|
||||
val inet = ipa.toInetAddress
|
||||
val ip = inet.getHostAddress
|
||||
val inet = ipa.toInetAddress
|
||||
val ip = inet.getHostAddress
|
||||
lazy val ipParts = ip.split('.')
|
||||
|
||||
def checkSingle(pattern: String): Boolean =
|
||||
|
@ -39,7 +39,7 @@ object RestServer {
|
||||
.create[F](cfg, pools.connectEC, pools.httpClientEC)
|
||||
httpClient <- BlazeClientBuilder[F](pools.httpClientEC).resource
|
||||
httpApp = Router(
|
||||
"/api/info" -> routes.InfoRoutes(),
|
||||
"/api/info" -> routes.InfoRoutes(),
|
||||
"/api/v1/open/" -> openRoutes(cfg, httpClient, restApp),
|
||||
"/api/v1/sec/" -> Authenticate(restApp.backend.login, cfg.auth) { token =>
|
||||
securedRoutes(cfg, restApp, token)
|
||||
@ -47,11 +47,11 @@ object RestServer {
|
||||
"/api/v1/admin" -> AdminRoutes(cfg.adminEndpoint) {
|
||||
adminRoutes(cfg, restApp)
|
||||
},
|
||||
"/api/doc" -> templates.doc,
|
||||
"/api/doc" -> templates.doc,
|
||||
"/app/assets" -> EnvMiddleware(WebjarRoutes.appRoutes[F]),
|
||||
"/app" -> EnvMiddleware(templates.app),
|
||||
"/sw.js" -> EnvMiddleware(templates.serviceWorker),
|
||||
"/" -> redirectTo("/app")
|
||||
"/app" -> EnvMiddleware(templates.app),
|
||||
"/sw.js" -> EnvMiddleware(templates.serviceWorker),
|
||||
"/" -> redirectTo("/app")
|
||||
).orNotFound
|
||||
|
||||
finalHttpApp = Logger.httpApp(logHeaders = false, logBody = false)(httpApp)
|
||||
@ -75,31 +75,31 @@ object RestServer {
|
||||
token: AuthToken
|
||||
): HttpRoutes[F] =
|
||||
Router(
|
||||
"auth" -> LoginRoutes.session(restApp.backend.login, cfg, token),
|
||||
"tag" -> TagRoutes(restApp.backend, token),
|
||||
"equipment" -> EquipmentRoutes(restApp.backend, token),
|
||||
"organization" -> OrganizationRoutes(restApp.backend, token),
|
||||
"person" -> PersonRoutes(restApp.backend, token),
|
||||
"source" -> SourceRoutes(restApp.backend, token),
|
||||
"user/otp" -> TotpRoutes(restApp.backend, cfg, token),
|
||||
"user" -> UserRoutes(restApp.backend, token),
|
||||
"collective" -> CollectiveRoutes(restApp.backend, token),
|
||||
"queue" -> JobQueueRoutes(restApp.backend, token),
|
||||
"item" -> ItemRoutes(cfg, restApp.backend, token),
|
||||
"items" -> ItemMultiRoutes(restApp.backend, token),
|
||||
"attachment" -> AttachmentRoutes(restApp.backend, token),
|
||||
"attachments" -> AttachmentMultiRoutes(restApp.backend, token),
|
||||
"upload" -> UploadRoutes.secured(restApp.backend, cfg, token),
|
||||
"checkfile" -> CheckFileRoutes.secured(restApp.backend, token),
|
||||
"email/send" -> MailSendRoutes(restApp.backend, token),
|
||||
"email/settings" -> MailSettingsRoutes(restApp.backend, token),
|
||||
"email/sent" -> SentMailRoutes(restApp.backend, token),
|
||||
"auth" -> LoginRoutes.session(restApp.backend.login, cfg, token),
|
||||
"tag" -> TagRoutes(restApp.backend, token),
|
||||
"equipment" -> EquipmentRoutes(restApp.backend, token),
|
||||
"organization" -> OrganizationRoutes(restApp.backend, token),
|
||||
"person" -> PersonRoutes(restApp.backend, token),
|
||||
"source" -> SourceRoutes(restApp.backend, token),
|
||||
"user/otp" -> TotpRoutes(restApp.backend, cfg, token),
|
||||
"user" -> UserRoutes(restApp.backend, token),
|
||||
"collective" -> CollectiveRoutes(restApp.backend, token),
|
||||
"queue" -> JobQueueRoutes(restApp.backend, token),
|
||||
"item" -> ItemRoutes(cfg, restApp.backend, token),
|
||||
"items" -> ItemMultiRoutes(restApp.backend, token),
|
||||
"attachment" -> AttachmentRoutes(restApp.backend, token),
|
||||
"attachments" -> AttachmentMultiRoutes(restApp.backend, token),
|
||||
"upload" -> UploadRoutes.secured(restApp.backend, cfg, token),
|
||||
"checkfile" -> CheckFileRoutes.secured(restApp.backend, token),
|
||||
"email/send" -> MailSendRoutes(restApp.backend, token),
|
||||
"email/settings" -> MailSettingsRoutes(restApp.backend, token),
|
||||
"email/sent" -> SentMailRoutes(restApp.backend, token),
|
||||
"usertask/notifydueitems" -> NotifyDueItemsRoutes(cfg, restApp.backend, token),
|
||||
"usertask/scanmailbox" -> ScanMailboxRoutes(restApp.backend, token),
|
||||
"calevent/check" -> CalEventCheckRoutes(),
|
||||
"fts" -> FullTextIndexRoutes.secured(cfg, restApp.backend, token),
|
||||
"folder" -> FolderRoutes(restApp.backend, token),
|
||||
"customfield" -> CustomFieldRoutes(restApp.backend, token),
|
||||
"usertask/scanmailbox" -> ScanMailboxRoutes(restApp.backend, token),
|
||||
"calevent/check" -> CalEventCheckRoutes(),
|
||||
"fts" -> FullTextIndexRoutes.secured(cfg, restApp.backend, token),
|
||||
"folder" -> FolderRoutes(restApp.backend, token),
|
||||
"customfield" -> CustomFieldRoutes(restApp.backend, token),
|
||||
"clientSettings" -> ClientSettingsRoutes(restApp.backend, token)
|
||||
)
|
||||
|
||||
@ -115,19 +115,19 @@ object RestServer {
|
||||
OpenId.codeFlowConfig(cfg),
|
||||
client
|
||||
),
|
||||
"auth" -> LoginRoutes.login(restApp.backend.login, cfg),
|
||||
"signup" -> RegisterRoutes(restApp.backend, cfg),
|
||||
"upload" -> UploadRoutes.open(restApp.backend, cfg),
|
||||
"checkfile" -> CheckFileRoutes.open(restApp.backend),
|
||||
"auth" -> LoginRoutes.login(restApp.backend.login, cfg),
|
||||
"signup" -> RegisterRoutes(restApp.backend, cfg),
|
||||
"upload" -> UploadRoutes.open(restApp.backend, cfg),
|
||||
"checkfile" -> CheckFileRoutes.open(restApp.backend),
|
||||
"integration" -> IntegrationEndpointRoutes.open(restApp.backend, cfg)
|
||||
)
|
||||
|
||||
def adminRoutes[F[_]: Async](cfg: Config, restApp: RestApp[F]): HttpRoutes[F] =
|
||||
Router(
|
||||
"fts" -> FullTextIndexRoutes.admin(cfg, restApp.backend),
|
||||
"user/otp" -> TotpRoutes.admin(restApp.backend),
|
||||
"user" -> UserRoutes.admin(restApp.backend),
|
||||
"info" -> InfoRoutes.admin(cfg),
|
||||
"fts" -> FullTextIndexRoutes.admin(cfg, restApp.backend),
|
||||
"user/otp" -> TotpRoutes.admin(restApp.backend),
|
||||
"user" -> UserRoutes.admin(restApp.backend),
|
||||
"info" -> InfoRoutes.admin(cfg),
|
||||
"attachments" -> AttachmentRoutes.admin(restApp.backend)
|
||||
)
|
||||
|
||||
|
@ -15,10 +15,10 @@ import org.typelevel.ci.CIString
|
||||
|
||||
case class CookieData(auth: AuthToken) {
|
||||
def accountId: AccountId = auth.account
|
||||
def asString: String = auth.asString
|
||||
def asString: String = auth.asString
|
||||
|
||||
def asCookie(baseUrl: LenientUri): ResponseCookie = {
|
||||
val sec = baseUrl.scheme.exists(_.endsWith("s"))
|
||||
val sec = baseUrl.scheme.exists(_.endsWith("s"))
|
||||
val path = baseUrl.path / "api" / "v1" / "sec"
|
||||
ResponseCookie(
|
||||
CookieData.cookieName,
|
||||
|
@ -40,9 +40,9 @@ object OpenId {
|
||||
OnUserInfo { (req, provider, userInfo) =>
|
||||
val dsl = new Http4sDsl[F] {}
|
||||
import dsl._
|
||||
val logger = Logger.log4s(log)
|
||||
val baseUrl = ClientRequestInfo.getBaseUrl(config, req)
|
||||
val uri = baseUrl.withQuery("openid", "1") / "app" / "login"
|
||||
val logger = Logger.log4s(log)
|
||||
val baseUrl = ClientRequestInfo.getBaseUrl(config, req)
|
||||
val uri = baseUrl.withQuery("openid", "1") / "app" / "login"
|
||||
val location = Location(Uri.unsafeFromString(uri.asString))
|
||||
val cfg = config.openid
|
||||
.find(_.provider.providerId == provider.providerId)
|
||||
@ -229,9 +229,9 @@ object OpenId {
|
||||
|
||||
sealed trait ExtractResult
|
||||
object ExtractResult {
|
||||
final case class Identifier(name: Ident) extends ExtractResult
|
||||
final case class Identifier(name: Ident) extends ExtractResult
|
||||
final case class Account(accountId: AccountId) extends ExtractResult
|
||||
final case class Failure(message: String) extends ExtractResult
|
||||
final case class Failure(message: String) extends ExtractResult
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ case class RememberCookieData(token: RememberToken) {
|
||||
def asString: String = token.asString
|
||||
|
||||
def asCookie(config: Login.RememberMe, baseUrl: LenientUri): ResponseCookie = {
|
||||
val sec = baseUrl.scheme.exists(_.endsWith("s"))
|
||||
val sec = baseUrl.scheme.exists(_.endsWith("s"))
|
||||
val path = baseUrl.path / "api" / "v1"
|
||||
ResponseCookie(
|
||||
name = RememberCookieData.cookieName,
|
||||
|
@ -236,7 +236,7 @@ trait Conversions {
|
||||
)
|
||||
|
||||
def mkItemLight(i: OFulltext.FtsItem): ItemLight = {
|
||||
val il = mkItemLight(i.item)
|
||||
val il = mkItemLight(i.item)
|
||||
val highlight = mkHighlight(i.ftsData)
|
||||
il.copy(highlighting = highlight)
|
||||
}
|
||||
@ -253,7 +253,7 @@ trait Conversions {
|
||||
AttachmentLight(qa.id, qa.position, qa.name, qa.pageCount)
|
||||
|
||||
def mkItemLightWithTags(i: OFulltext.FtsItemWithTags): ItemLight = {
|
||||
val il = mkItemLightWithTags(i.item)
|
||||
val il = mkItemLightWithTags(i.item)
|
||||
val highlight = mkHighlight(i.ftsData)
|
||||
il.copy(highlighting = highlight)
|
||||
}
|
||||
@ -374,8 +374,8 @@ trait Conversions {
|
||||
)
|
||||
for {
|
||||
metaData <- meta
|
||||
_ <- Async[F].delay(logger.debug(s"Parsed upload meta data: $metaData"))
|
||||
tracker <- Ident.randomId[F]
|
||||
_ <- Async[F].delay(logger.debug(s"Parsed upload meta data: $metaData"))
|
||||
tracker <- Ident.randomId[F]
|
||||
} yield UploadData(metaData._1, metaData._2, files, prio, Some(tracker))
|
||||
}
|
||||
|
||||
@ -398,8 +398,8 @@ trait Conversions {
|
||||
def contacts(oid: Ident) =
|
||||
v.contacts.traverse(c => newContact(c, oid.some, None))
|
||||
for {
|
||||
now <- Timestamp.current[F]
|
||||
oid <- Ident.randomId[F]
|
||||
now <- Timestamp.current[F]
|
||||
oid <- Ident.randomId[F]
|
||||
cont <- contacts(oid)
|
||||
org = ROrganization(
|
||||
oid,
|
||||
@ -425,7 +425,7 @@ trait Conversions {
|
||||
def contacts(oid: Ident) =
|
||||
v.contacts.traverse(c => newContact(c, oid.some, None))
|
||||
for {
|
||||
now <- Timestamp.current[F]
|
||||
now <- Timestamp.current[F]
|
||||
cont <- contacts(v.id)
|
||||
org = ROrganization(
|
||||
v.id,
|
||||
@ -462,8 +462,8 @@ trait Conversions {
|
||||
def contacts(pid: Ident) =
|
||||
v.contacts.traverse(c => newContact(c, None, pid.some))
|
||||
for {
|
||||
now <- Timestamp.current[F]
|
||||
pid <- Ident.randomId[F]
|
||||
now <- Timestamp.current[F]
|
||||
pid <- Ident.randomId[F]
|
||||
cont <- contacts(pid)
|
||||
pers = RPerson(
|
||||
pid,
|
||||
@ -489,7 +489,7 @@ trait Conversions {
|
||||
def contacts(pid: Ident) =
|
||||
v.contacts.traverse(c => newContact(c, None, pid.some))
|
||||
for {
|
||||
now <- Timestamp.current[F]
|
||||
now <- Timestamp.current[F]
|
||||
cont <- contacts(v.id)
|
||||
pers = RPerson(
|
||||
v.id,
|
||||
@ -738,7 +738,7 @@ object Conversions extends Conversions {
|
||||
|
||||
private def timeId[F[_]: Sync]: F[(Ident, Timestamp)] =
|
||||
for {
|
||||
id <- Ident.randomId[F]
|
||||
id <- Ident.randomId[F]
|
||||
now <- Timestamp.current
|
||||
} yield (id, now)
|
||||
}
|
||||
|
@ -28,10 +28,10 @@ object BinaryUtil {
|
||||
): F[Response[F]] = {
|
||||
import dsl._
|
||||
|
||||
val mt = MediaType.unsafeParse(data.meta.mimetype.asString)
|
||||
val ctype = `Content-Type`(mt)
|
||||
val mt = MediaType.unsafeParse(data.meta.mimetype.asString)
|
||||
val ctype = `Content-Type`(mt)
|
||||
val cntLen = `Content-Length`.unsafeFromLong(data.meta.length.bytes)
|
||||
val eTag = ETag(data.meta.checksum.toHex)
|
||||
val eTag = ETag(data.meta.checksum.toHex)
|
||||
val disp =
|
||||
`Content-Disposition`(
|
||||
"inline",
|
||||
|
@ -16,8 +16,7 @@ import org.http4s._
|
||||
import org.http4s.headers._
|
||||
import org.typelevel.ci.CIString
|
||||
|
||||
/** Obtain information about the client by inspecting the request.
|
||||
*/
|
||||
/** Obtain information about the client by inspecting the request. */
|
||||
object ClientRequestInfo {
|
||||
|
||||
def getBaseUrl[F[_]](cfg: Config, req: Request[F]): LenientUri =
|
||||
@ -27,8 +26,8 @@ object ClientRequestInfo {
|
||||
private def getBaseUrl[F[_]](req: Request[F], serverPort: Int): Option[LenientUri] =
|
||||
for {
|
||||
scheme <- NonEmptyList.fromList(getProtocol(req).toList)
|
||||
host <- getHostname(req)
|
||||
port = xForwardedPort(req).getOrElse(serverPort)
|
||||
host <- getHostname(req)
|
||||
port = xForwardedPort(req).getOrElse(serverPort)
|
||||
hostPort = if (port == 80 || port == 443) host else s"$host:$port"
|
||||
} yield LenientUri(scheme, Some(hostPort), LenientUri.EmptyPath, None, None)
|
||||
|
||||
|
@ -72,17 +72,17 @@ object QueryParam {
|
||||
|
||||
object QueryOpt extends OptionalQueryParamDecoderMatcher[QueryString]("q")
|
||||
|
||||
object Query extends OptionalQueryParamDecoderMatcher[String]("q")
|
||||
object Limit extends OptionalQueryParamDecoderMatcher[Int]("limit")
|
||||
object Offset extends OptionalQueryParamDecoderMatcher[Int]("offset")
|
||||
object Query extends OptionalQueryParamDecoderMatcher[String]("q")
|
||||
object Limit extends OptionalQueryParamDecoderMatcher[Int]("limit")
|
||||
object Offset extends OptionalQueryParamDecoderMatcher[Int]("offset")
|
||||
object WithDetails extends OptionalQueryParamDecoderMatcher[Boolean]("withDetails")
|
||||
object SearchKind extends OptionalQueryParamDecoderMatcher[SearchMode]("searchMode")
|
||||
object TagSort extends OptionalQueryParamDecoderMatcher[TagOrder]("sort")
|
||||
object EquipSort extends OptionalQueryParamDecoderMatcher[EquipmentOrder]("sort")
|
||||
object OrgSort extends OptionalQueryParamDecoderMatcher[OrganizationOrder]("sort")
|
||||
object PersonSort extends OptionalQueryParamDecoderMatcher[PersonOrder]("sort")
|
||||
object FolderSort extends OptionalQueryParamDecoderMatcher[FolderOrder]("sort")
|
||||
object FieldSort extends OptionalQueryParamDecoderMatcher[CustomFieldOrder]("sort")
|
||||
object SearchKind extends OptionalQueryParamDecoderMatcher[SearchMode]("searchMode")
|
||||
object TagSort extends OptionalQueryParamDecoderMatcher[TagOrder]("sort")
|
||||
object EquipSort extends OptionalQueryParamDecoderMatcher[EquipmentOrder]("sort")
|
||||
object OrgSort extends OptionalQueryParamDecoderMatcher[OrganizationOrder]("sort")
|
||||
object PersonSort extends OptionalQueryParamDecoderMatcher[PersonOrder]("sort")
|
||||
object FolderSort extends OptionalQueryParamDecoderMatcher[FolderOrder]("sort")
|
||||
object FieldSort extends OptionalQueryParamDecoderMatcher[CustomFieldOrder]("sort")
|
||||
|
||||
object WithFallback extends OptionalQueryParamDecoderMatcher[Boolean]("withFallback")
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ object AttachmentMultiRoutes extends MultiIdSupport {
|
||||
|
||||
HttpRoutes.of { case req @ POST -> Root / "delete" =>
|
||||
for {
|
||||
json <- req.as[IdList]
|
||||
json <- req.as[IdList]
|
||||
attachments <- readIds[F](json.ids)
|
||||
n <- backend.item.deleteAttachmentMultiple(attachments, user.account.collective)
|
||||
res = BasicResult(
|
||||
|
@ -56,7 +56,7 @@ object AttachmentRoutes {
|
||||
case req @ GET -> Root / Ident(id) =>
|
||||
for {
|
||||
fileData <- backend.itemSearch.findAttachment(id, user.account.collective)
|
||||
inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
|
||||
inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
|
||||
matches = BinaryUtil.matchETag(fileData.map(_.meta), inm)
|
||||
resp <-
|
||||
fileData
|
||||
@ -79,7 +79,7 @@ object AttachmentRoutes {
|
||||
case req @ GET -> Root / Ident(id) / "original" =>
|
||||
for {
|
||||
fileData <- backend.itemSearch.findAttachmentSource(id, user.account.collective)
|
||||
inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
|
||||
inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
|
||||
matches = BinaryUtil.matchETag(fileData.map(_.meta), inm)
|
||||
resp <-
|
||||
fileData
|
||||
@ -104,7 +104,7 @@ object AttachmentRoutes {
|
||||
for {
|
||||
fileData <-
|
||||
backend.itemSearch.findAttachmentArchive(id, user.account.collective)
|
||||
inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
|
||||
inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
|
||||
matches = BinaryUtil.matchETag(fileData.map(_.meta), inm)
|
||||
resp <-
|
||||
fileData
|
||||
@ -121,8 +121,8 @@ object AttachmentRoutes {
|
||||
for {
|
||||
fileData <-
|
||||
backend.itemSearch.findAttachmentPreview(id, user.account.collective)
|
||||
inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
|
||||
matches = BinaryUtil.matchETag(fileData.map(_.meta), inm)
|
||||
inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
|
||||
matches = BinaryUtil.matchETag(fileData.map(_.meta), inm)
|
||||
fallback = flag.getOrElse(false)
|
||||
resp <-
|
||||
fileData
|
||||
@ -162,7 +162,7 @@ object AttachmentRoutes {
|
||||
// this route exists to provide a stable url
|
||||
// it redirects currently to viewerjs
|
||||
val attachUrl = s"/api/v1/sec/attachment/${id.id}"
|
||||
val path = s"/app/assets${Webjars.viewerjs}/index.html#$attachUrl"
|
||||
val path = s"/app/assets${Webjars.viewerjs}/index.html#$attachUrl"
|
||||
SeeOther(Location(Uri(path = Uri.Path.unsafeFromString(path))))
|
||||
|
||||
case GET -> Root / Ident(id) / "meta" =>
|
||||
@ -174,8 +174,8 @@ object AttachmentRoutes {
|
||||
|
||||
case req @ POST -> Root / Ident(id) / "name" =>
|
||||
for {
|
||||
nn <- req.as[OptionalText]
|
||||
res <- backend.item.setAttachmentName(id, nn.text, user.account.collective)
|
||||
nn <- req.as[OptionalText]
|
||||
res <- backend.item.setAttachmentName(id, nn.text, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Name updated."))
|
||||
} yield resp
|
||||
|
||||
|
@ -27,7 +27,7 @@ object CalEventCheckRoutes {
|
||||
HttpRoutes.of { case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[CalEventCheck]
|
||||
res <- testEvent(data.event)
|
||||
res <- testEvent(data.event)
|
||||
resp <- Ok(res)
|
||||
} yield resp
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ object CheckFileRoutes {
|
||||
HttpRoutes.of { case GET -> Root / Ident(id) / checksum =>
|
||||
for {
|
||||
items <- backend.itemSearch.findByFileSource(checksum, id)
|
||||
resp <- items.map(convert).map(Ok(_)).getOrElse(NotFound())
|
||||
resp <- items.map(convert).map(Ok(_)).getOrElse(NotFound())
|
||||
} yield resp
|
||||
}
|
||||
}
|
||||
|
@ -30,8 +30,8 @@ object ClientSettingsRoutes {
|
||||
case req @ PUT -> Root / Ident(clientId) =>
|
||||
for {
|
||||
data <- req.as[Json]
|
||||
_ <- backend.clientSettings.save(clientId, user.account, data)
|
||||
res <- Ok(BasicResult(true, "Settings stored"))
|
||||
_ <- backend.clientSettings.save(clientId, user.account, data)
|
||||
res <- Ok(BasicResult(true, "Settings stored"))
|
||||
} yield res
|
||||
|
||||
case GET -> Root / Ident(clientId) =>
|
||||
|
@ -33,14 +33,14 @@ object CollectiveRoutes {
|
||||
HttpRoutes.of {
|
||||
case GET -> Root / "insights" =>
|
||||
for {
|
||||
ins <- backend.collective.insights(user.account.collective)
|
||||
ins <- backend.collective.insights(user.account.collective)
|
||||
resp <- Ok(Conversions.mkItemInsights(ins))
|
||||
} yield resp
|
||||
|
||||
case GET -> Root / "tagcloud" =>
|
||||
for {
|
||||
cloud <- backend.collective.tagCloud(user.account.collective)
|
||||
resp <- Ok(Conversions.mkTagCloud(cloud))
|
||||
resp <- Ok(Conversions.mkTagCloud(cloud))
|
||||
} yield resp
|
||||
|
||||
case req @ POST -> Root / "settings" =>
|
||||
@ -109,7 +109,7 @@ object CollectiveRoutes {
|
||||
|
||||
case POST -> Root / "classifier" / "startonce" =>
|
||||
for {
|
||||
_ <- backend.collective.startLearnClassifier(user.account.collective)
|
||||
_ <- backend.collective.startLearnClassifier(user.account.collective)
|
||||
resp <- Ok(BasicResult(true, "Task submitted"))
|
||||
} yield resp
|
||||
|
||||
|
@ -48,26 +48,26 @@ object CustomFieldRoutes {
|
||||
case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[NewCustomField]
|
||||
res <- backend.customFields.create(convertNewField(user, data))
|
||||
res <- backend.customFields.create(convertNewField(user, data))
|
||||
resp <- Ok(convertResult(res))
|
||||
} yield resp
|
||||
|
||||
case GET -> Root / Ident(id) =>
|
||||
(for {
|
||||
field <- OptionT(backend.customFields.findById(user.account.collective, id))
|
||||
res <- OptionT.liftF(Ok(convertField(field)))
|
||||
res <- OptionT.liftF(Ok(convertField(field)))
|
||||
} yield res).getOrElseF(NotFound(BasicResult(false, "Not found")))
|
||||
|
||||
case req @ PUT -> Root / Ident(id) =>
|
||||
for {
|
||||
data <- req.as[NewCustomField]
|
||||
res <- backend.customFields.change(convertChangeField(id, user, data))
|
||||
res <- backend.customFields.change(convertChangeField(id, user, data))
|
||||
resp <- Ok(convertResult(res))
|
||||
} yield resp
|
||||
|
||||
case DELETE -> Root / Ident(id) =>
|
||||
for {
|
||||
res <- backend.customFields.delete(user.account.collective, id)
|
||||
res <- backend.customFields.delete(user.account.collective, id)
|
||||
resp <- Ok(convertResult(res))
|
||||
} yield resp
|
||||
}
|
||||
|
@ -42,30 +42,30 @@ object EquipmentRoutes {
|
||||
|
||||
case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[Equipment]
|
||||
data <- req.as[Equipment]
|
||||
equip <- newEquipment(data, user.account.collective)
|
||||
res <- backend.equipment.add(equip)
|
||||
resp <- Ok(basicResult(res, "Equipment created"))
|
||||
res <- backend.equipment.add(equip)
|
||||
resp <- Ok(basicResult(res, "Equipment created"))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root =>
|
||||
for {
|
||||
data <- req.as[Equipment]
|
||||
data <- req.as[Equipment]
|
||||
equip <- changeEquipment(data, user.account.collective)
|
||||
res <- backend.equipment.update(equip)
|
||||
resp <- Ok(basicResult(res, "Equipment updated."))
|
||||
res <- backend.equipment.update(equip)
|
||||
resp <- Ok(basicResult(res, "Equipment updated."))
|
||||
} yield resp
|
||||
|
||||
case DELETE -> Root / Ident(id) =>
|
||||
for {
|
||||
del <- backend.equipment.delete(id, user.account.collective)
|
||||
del <- backend.equipment.delete(id, user.account.collective)
|
||||
resp <- Ok(basicResult(del, "Equipment deleted."))
|
||||
} yield resp
|
||||
|
||||
case GET -> Root / Ident(id) =>
|
||||
(for {
|
||||
equip <- OptionT(backend.equipment.find(user.account, id))
|
||||
resp <- OptionT.liftF(Ok(mkEquipment(equip)))
|
||||
resp <- OptionT.liftF(Ok(mkEquipment(equip)))
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
}
|
||||
}
|
||||
|
@ -37,15 +37,15 @@ object FolderRoutes {
|
||||
val login =
|
||||
owning.filter(identity).map(_ => user.account.user)
|
||||
for {
|
||||
all <- backend.folder.findAll(user.account, login, q.map(_.q), order)
|
||||
all <- backend.folder.findAll(user.account, login, q.map(_.q), order)
|
||||
resp <- Ok(FolderList(all.map(mkFolder).toList))
|
||||
} yield resp
|
||||
|
||||
case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[NewFolder]
|
||||
data <- req.as[NewFolder]
|
||||
nfolder <- newFolder(data, user.account)
|
||||
res <- backend.folder.add(nfolder, Some(user.account.user))
|
||||
res <- backend.folder.add(nfolder, Some(user.account.user))
|
||||
resp <-
|
||||
Ok(Conversions.idResult(res, nfolder.id, "Folder successfully created."))
|
||||
} yield resp
|
||||
@ -53,31 +53,31 @@ object FolderRoutes {
|
||||
case GET -> Root / Ident(id) =>
|
||||
(for {
|
||||
folder <- OptionT(backend.folder.findById(id, user.account))
|
||||
resp <- OptionT.liftF(Ok(mkFolderDetail(folder)))
|
||||
resp <- OptionT.liftF(Ok(mkFolderDetail(folder)))
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
|
||||
case req @ PUT -> Root / Ident(id) =>
|
||||
for {
|
||||
data <- req.as[NewFolder]
|
||||
res <- backend.folder.changeName(id, user.account, data.name)
|
||||
res <- backend.folder.changeName(id, user.account, data.name)
|
||||
resp <- Ok(mkFolderChangeResult(res))
|
||||
} yield resp
|
||||
|
||||
case DELETE -> Root / Ident(id) =>
|
||||
for {
|
||||
res <- backend.folder.delete(id, user.account)
|
||||
res <- backend.folder.delete(id, user.account)
|
||||
resp <- Ok(mkFolderChangeResult(res))
|
||||
} yield resp
|
||||
|
||||
case PUT -> Root / Ident(id) / "member" / Ident(userId) =>
|
||||
for {
|
||||
res <- backend.folder.addMember(id, user.account, userId)
|
||||
res <- backend.folder.addMember(id, user.account, userId)
|
||||
resp <- Ok(mkFolderChangeResult(res))
|
||||
} yield resp
|
||||
|
||||
case DELETE -> Root / Ident(id) / "member" / Ident(userId) =>
|
||||
for {
|
||||
res <- backend.folder.removeMember(id, user.account, userId)
|
||||
res <- backend.folder.removeMember(id, user.account, userId)
|
||||
resp <- Ok(mkFolderChangeResult(res))
|
||||
} yield resp
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ object FullTextIndexRoutes {
|
||||
|
||||
HttpRoutes.of { case POST -> Root / "reIndex" =>
|
||||
for {
|
||||
res <- backend.fulltext.reindexCollective(user.account).attempt
|
||||
res <- backend.fulltext.reindexCollective(user.account).attempt
|
||||
resp <- Ok(Conversions.basicResult(res, "Full-text index will be re-created."))
|
||||
} yield resp
|
||||
}
|
||||
@ -47,7 +47,7 @@ object FullTextIndexRoutes {
|
||||
|
||||
HttpRoutes.of { case POST -> Root / "reIndexAll" =>
|
||||
for {
|
||||
res <- backend.fulltext.reindexAll.attempt
|
||||
res <- backend.fulltext.reindexAll.attempt
|
||||
resp <- Ok(Conversions.basicResult(res, "Full-text index will be re-created."))
|
||||
} yield resp
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ object IntegrationEndpointRoutes {
|
||||
|
||||
case req @ GET -> Root / "item" / Ident(collective) =>
|
||||
(for {
|
||||
_ <- validate(req, collective)
|
||||
_ <- validate(req, collective)
|
||||
res <- EitherT.liftF[F, Response[F], Response[F]](Ok(()))
|
||||
} yield res).fold(identity, identity)
|
||||
|
||||
@ -112,7 +112,7 @@ object IntegrationEndpointRoutes {
|
||||
)
|
||||
account = AccountId(coll, DocspellSystem.user)
|
||||
result <- backend.upload.submit(updata, account, true, None)
|
||||
res <- Ok(basicResult(result))
|
||||
res <- Ok(basicResult(result))
|
||||
} yield res
|
||||
}
|
||||
|
||||
|
@ -59,7 +59,7 @@ object ItemMultiRoutes extends MultiIdSupport {
|
||||
|
||||
case req @ PUT -> Root / "tags" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndRefs]
|
||||
json <- req.as[ItemsAndRefs]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.setTagsMultipleItems(
|
||||
items,
|
||||
@ -71,7 +71,7 @@ object ItemMultiRoutes extends MultiIdSupport {
|
||||
|
||||
case req @ POST -> Root / "tags" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndRefs]
|
||||
json <- req.as[ItemsAndRefs]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.linkTagsMultipleItems(
|
||||
items,
|
||||
@ -83,7 +83,7 @@ object ItemMultiRoutes extends MultiIdSupport {
|
||||
|
||||
case req @ POST -> Root / "tagsremove" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndRefs]
|
||||
json <- req.as[ItemsAndRefs]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.removeTagsMultipleItems(
|
||||
items,
|
||||
@ -95,7 +95,7 @@ object ItemMultiRoutes extends MultiIdSupport {
|
||||
|
||||
case req @ PUT -> Root / "name" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndName]
|
||||
json <- req.as[ItemsAndName]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.setNameMultiple(
|
||||
items,
|
||||
@ -107,15 +107,15 @@ object ItemMultiRoutes extends MultiIdSupport {
|
||||
|
||||
case req @ PUT -> Root / "folder" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndRef]
|
||||
json <- req.as[ItemsAndRef]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.setFolderMultiple(items, json.ref, user.account.collective)
|
||||
res <- backend.item.setFolderMultiple(items, json.ref, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Folder updated"))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / "direction" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndDirection]
|
||||
json <- req.as[ItemsAndDirection]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.setDirection(items, json.direction, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Direction updated"))
|
||||
@ -123,65 +123,65 @@ object ItemMultiRoutes extends MultiIdSupport {
|
||||
|
||||
case req @ PUT -> Root / "date" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndDate]
|
||||
json <- req.as[ItemsAndDate]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.setItemDate(items, json.date, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Item date updated"))
|
||||
res <- backend.item.setItemDate(items, json.date, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Item date updated"))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / "duedate" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndDate]
|
||||
json <- req.as[ItemsAndDate]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.setItemDueDate(items, json.date, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Item due date updated"))
|
||||
res <- backend.item.setItemDueDate(items, json.date, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Item due date updated"))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / "corrOrg" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndRef]
|
||||
json <- req.as[ItemsAndRef]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.setCorrOrg(items, json.ref, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Correspondent organization updated"))
|
||||
res <- backend.item.setCorrOrg(items, json.ref, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Correspondent organization updated"))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / "corrPerson" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndRef]
|
||||
json <- req.as[ItemsAndRef]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.setCorrPerson(items, json.ref, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Correspondent person updated"))
|
||||
res <- backend.item.setCorrPerson(items, json.ref, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Correspondent person updated"))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / "concPerson" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndRef]
|
||||
json <- req.as[ItemsAndRef]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.setConcPerson(items, json.ref, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Concerned person updated"))
|
||||
res <- backend.item.setConcPerson(items, json.ref, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Concerned person updated"))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / "concEquipment" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndRef]
|
||||
json <- req.as[ItemsAndRef]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.item.setConcEquip(items, json.ref, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Concerned equipment updated"))
|
||||
res <- backend.item.setConcEquip(items, json.ref, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Concerned equipment updated"))
|
||||
} yield resp
|
||||
|
||||
case req @ POST -> Root / "reprocess" =>
|
||||
for {
|
||||
json <- req.as[IdList]
|
||||
json <- req.as[IdList]
|
||||
items <- readIds[F](json.ids)
|
||||
res <- backend.item.reprocessAll(items, user.account, true)
|
||||
resp <- Ok(Conversions.basicResult(res, "Re-process task(s) submitted."))
|
||||
res <- backend.item.reprocessAll(items, user.account, true)
|
||||
resp <- Ok(Conversions.basicResult(res, "Re-process task(s) submitted."))
|
||||
} yield resp
|
||||
|
||||
case req @ POST -> Root / "deleteAll" =>
|
||||
for {
|
||||
json <- req.as[IdList]
|
||||
json <- req.as[IdList]
|
||||
items <- readIds[F](json.ids)
|
||||
n <- backend.item.setDeletedState(items, user.account.collective)
|
||||
n <- backend.item.setDeletedState(items, user.account.collective)
|
||||
res = BasicResult(
|
||||
n > 0,
|
||||
if (n > 0) "Item(s) deleted" else "Item deletion failed."
|
||||
@ -191,15 +191,15 @@ object ItemMultiRoutes extends MultiIdSupport {
|
||||
|
||||
case req @ POST -> Root / "restoreAll" =>
|
||||
for {
|
||||
json <- req.as[IdList]
|
||||
json <- req.as[IdList]
|
||||
items <- readIds[F](json.ids)
|
||||
res <- backend.item.restore(items, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Item(s) deleted"))
|
||||
res <- backend.item.restore(items, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Item(s) deleted"))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / "customfield" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndFieldValue]
|
||||
json <- req.as[ItemsAndFieldValue]
|
||||
items <- readIds[F](json.items)
|
||||
res <- backend.customFields.setValueMultiple(
|
||||
items,
|
||||
@ -210,7 +210,7 @@ object ItemMultiRoutes extends MultiIdSupport {
|
||||
|
||||
case req @ POST -> Root / "customfieldremove" =>
|
||||
for {
|
||||
json <- req.as[ItemsAndName]
|
||||
json <- req.as[ItemsAndName]
|
||||
items <- readIds[F](json.items)
|
||||
field <- readId[F](json.name)
|
||||
res <- backend.customFields.deleteValue(
|
||||
@ -221,10 +221,10 @@ object ItemMultiRoutes extends MultiIdSupport {
|
||||
|
||||
case req @ POST -> Root / "merge" =>
|
||||
for {
|
||||
json <- req.as[IdList]
|
||||
json <- req.as[IdList]
|
||||
items <- readIds[F](json.ids)
|
||||
logger = Logger.log4s(log4sLogger)
|
||||
res <- backend.item.merge(logger, items, user.account.collective)
|
||||
res <- backend.item.merge(logger, items, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Items merged"))
|
||||
} yield resp
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ object ItemRoutes {
|
||||
|
||||
case GET -> Root / "searchStats" :? QP.Query(q) :? QP.SearchKind(searchMode) =>
|
||||
val itemQuery = ItemQueryString(q)
|
||||
val fixQuery = Query.Fix(user.account, None, None)
|
||||
val fixQuery = Query.Fix(user.account, None, None)
|
||||
val settings = OSimpleSearch.StatsSettings(
|
||||
useFTS = cfg.fullTextSearch.enabled,
|
||||
searchMode = searchMode.getOrElse(SearchMode.Normal)
|
||||
@ -97,7 +97,7 @@ object ItemRoutes {
|
||||
for {
|
||||
userQuery <- req.as[ItemQuery]
|
||||
itemQuery = ItemQueryString(userQuery.query)
|
||||
fixQuery = Query.Fix(user.account, None, None)
|
||||
fixQuery = Query.Fix(user.account, None, None)
|
||||
settings = OSimpleSearch.StatsSettings(
|
||||
useFTS = cfg.fullTextSearch.enabled,
|
||||
searchMode = userQuery.searchMode.getOrElse(SearchMode.Normal)
|
||||
@ -140,26 +140,26 @@ object ItemRoutes {
|
||||
|
||||
case POST -> Root / Ident(id) / "confirm" =>
|
||||
for {
|
||||
res <- backend.item.setState(id, ItemState.Confirmed, user.account.collective)
|
||||
res <- backend.item.setState(id, ItemState.Confirmed, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Item data confirmed"))
|
||||
} yield resp
|
||||
|
||||
case POST -> Root / Ident(id) / "unconfirm" =>
|
||||
for {
|
||||
res <- backend.item.setState(id, ItemState.Created, user.account.collective)
|
||||
res <- backend.item.setState(id, ItemState.Created, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Item back to created."))
|
||||
} yield resp
|
||||
|
||||
case POST -> Root / Ident(id) / "restore" =>
|
||||
for {
|
||||
res <- backend.item.restore(NonEmptyList.of(id), user.account.collective)
|
||||
res <- backend.item.restore(NonEmptyList.of(id), user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Item restored."))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / Ident(id) / "tags" =>
|
||||
for {
|
||||
tags <- req.as[StringList].map(_.items)
|
||||
res <- backend.item.setTags(id, tags, user.account.collective)
|
||||
res <- backend.item.setTags(id, tags, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Tags updated"))
|
||||
} yield resp
|
||||
|
||||
@ -167,21 +167,21 @@ object ItemRoutes {
|
||||
for {
|
||||
data <- req.as[Tag]
|
||||
rtag <- Conversions.newTag(data, user.account.collective)
|
||||
res <- backend.item.addNewTag(id, rtag)
|
||||
res <- backend.item.addNewTag(id, rtag)
|
||||
resp <- Ok(Conversions.basicResult(res, "Tag added."))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / Ident(id) / "taglink" =>
|
||||
for {
|
||||
tags <- req.as[StringList]
|
||||
res <- backend.item.linkTags(id, tags.items, user.account.collective)
|
||||
res <- backend.item.linkTags(id, tags.items, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Tags linked"))
|
||||
} yield resp
|
||||
|
||||
case req @ POST -> Root / Ident(id) / "tagtoggle" =>
|
||||
for {
|
||||
tags <- req.as[StringList]
|
||||
res <- backend.item.toggleTags(id, tags.items, user.account.collective)
|
||||
res <- backend.item.toggleTags(id, tags.items, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Tags linked"))
|
||||
} yield resp
|
||||
|
||||
@ -210,8 +210,8 @@ object ItemRoutes {
|
||||
case req @ PUT -> Root / Ident(id) / "folder" =>
|
||||
for {
|
||||
idref <- req.as[OptionalId]
|
||||
res <- backend.item.setFolder(id, idref.id, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Folder updated"))
|
||||
res <- backend.item.setFolder(id, idref.id, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Folder updated"))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / Ident(id) / "corrOrg" =>
|
||||
@ -228,8 +228,8 @@ object ItemRoutes {
|
||||
case req @ POST -> Root / Ident(id) / "corrOrg" =>
|
||||
for {
|
||||
data <- req.as[Organization]
|
||||
org <- Conversions.newOrg(data, user.account.collective)
|
||||
res <- backend.item.addCorrOrg(id, org)
|
||||
org <- Conversions.newOrg(data, user.account.collective)
|
||||
res <- backend.item.addCorrOrg(id, org)
|
||||
resp <- Ok(Conversions.basicResult(res, "Correspondent organization updated"))
|
||||
} yield resp
|
||||
|
||||
@ -248,7 +248,7 @@ object ItemRoutes {
|
||||
for {
|
||||
data <- req.as[Person]
|
||||
pers <- Conversions.newPerson(data, user.account.collective)
|
||||
res <- backend.item.addCorrPerson(id, pers)
|
||||
res <- backend.item.addCorrPerson(id, pers)
|
||||
resp <- Ok(Conversions.basicResult(res, "Correspondent person updated"))
|
||||
} yield resp
|
||||
|
||||
@ -267,7 +267,7 @@ object ItemRoutes {
|
||||
for {
|
||||
data <- req.as[Person]
|
||||
pers <- Conversions.newPerson(data, user.account.collective)
|
||||
res <- backend.item.addConcPerson(id, pers)
|
||||
res <- backend.item.addConcPerson(id, pers)
|
||||
resp <- Ok(Conversions.basicResult(res, "Concerned person updated"))
|
||||
} yield resp
|
||||
|
||||
@ -284,16 +284,16 @@ object ItemRoutes {
|
||||
|
||||
case req @ POST -> Root / Ident(id) / "concEquipment" =>
|
||||
for {
|
||||
data <- req.as[Equipment]
|
||||
data <- req.as[Equipment]
|
||||
equip <- Conversions.newEquipment(data, user.account.collective)
|
||||
res <- backend.item.addConcEquip(id, equip)
|
||||
resp <- Ok(Conversions.basicResult(res, "Concerned equipment updated"))
|
||||
res <- backend.item.addConcEquip(id, equip)
|
||||
resp <- Ok(Conversions.basicResult(res, "Concerned equipment updated"))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root / Ident(id) / "notes" =>
|
||||
for {
|
||||
text <- req.as[OptionalText]
|
||||
res <- backend.item.setNotes(id, text.text.notEmpty, user.account.collective)
|
||||
res <- backend.item.setNotes(id, text.text.notEmpty, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(res, "Notes updated"))
|
||||
} yield resp
|
||||
|
||||
@ -311,7 +311,7 @@ object ItemRoutes {
|
||||
case req @ PUT -> Root / Ident(id) / "duedate" =>
|
||||
for {
|
||||
date <- req.as[OptionalDate]
|
||||
_ <- logger.fdebug(s"Setting item due date to ${date.date}")
|
||||
_ <- logger.fdebug(s"Setting item due date to ${date.date}")
|
||||
res <- backend.item.setItemDueDate(
|
||||
NonEmptyList.of(id),
|
||||
date.date,
|
||||
@ -323,7 +323,7 @@ object ItemRoutes {
|
||||
case req @ PUT -> Root / Ident(id) / "date" =>
|
||||
for {
|
||||
date <- req.as[OptionalDate]
|
||||
_ <- logger.fdebug(s"Setting item date to ${date.date}")
|
||||
_ <- logger.fdebug(s"Setting item date to ${date.date}")
|
||||
res <- backend.item.setItemDate(
|
||||
NonEmptyList.of(id),
|
||||
date.date,
|
||||
@ -342,8 +342,8 @@ object ItemRoutes {
|
||||
case req @ POST -> Root / Ident(id) / "attachment" / "movebefore" =>
|
||||
for {
|
||||
data <- req.as[MoveAttachment]
|
||||
_ <- logger.fdebug(s"Move item (${id.id}) attachment $data")
|
||||
res <- backend.item.moveAttachmentBefore(id, data.source, data.target)
|
||||
_ <- logger.fdebug(s"Move item (${id.id}) attachment $data")
|
||||
res <- backend.item.moveAttachmentBefore(id, data.source, data.target)
|
||||
resp <- Ok(Conversions.basicResult(res, "Attachment moved."))
|
||||
} yield resp
|
||||
|
||||
@ -352,8 +352,8 @@ object ItemRoutes {
|
||||
NotFound(BasicResult(false, "Not found"))
|
||||
for {
|
||||
preview <- backend.itemSearch.findItemPreview(id, user.account.collective)
|
||||
inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
|
||||
matches = BinaryUtil.matchETag(preview.map(_.meta), inm)
|
||||
inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
|
||||
matches = BinaryUtil.matchETag(preview.map(_.meta), inm)
|
||||
fallback = flag.getOrElse(false)
|
||||
resp <-
|
||||
preview
|
||||
@ -380,8 +380,8 @@ object ItemRoutes {
|
||||
for {
|
||||
data <- req.as[IdList]
|
||||
ids = data.ids.flatMap(s => Ident.fromString(s).toOption)
|
||||
_ <- logger.fdebug(s"Re-process item ${id.id}")
|
||||
res <- backend.item.reprocess(id, ids, user.account, true)
|
||||
_ <- logger.fdebug(s"Re-process item ${id.id}")
|
||||
res <- backend.item.reprocess(id, ids, user.account, true)
|
||||
resp <- Ok(Conversions.basicResult(res, "Re-process task submitted."))
|
||||
} yield resp
|
||||
|
||||
|
@ -37,13 +37,13 @@ object JobQueueRoutes {
|
||||
case POST -> Root / Ident(id) / "cancel" =>
|
||||
for {
|
||||
result <- backend.job.cancelJob(id, user.account.collective)
|
||||
resp <- Ok(Conversions.basicResult(result))
|
||||
resp <- Ok(Conversions.basicResult(result))
|
||||
} yield resp
|
||||
|
||||
case req @ POST -> Root / Ident(id) / "priority" =>
|
||||
for {
|
||||
prio <- req.as[JobPriority]
|
||||
res <- backend.job.setPriority(id, user.account.collective, prio.priority)
|
||||
res <- backend.job.setPriority(id, user.account.collective, prio.priority)
|
||||
resp <- Ok(Conversions.basicResult(res, "Job priority changed"))
|
||||
} yield resp
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ object LoginRoutes {
|
||||
|
||||
case req @ POST -> Root / "logout" =>
|
||||
for {
|
||||
_ <- RememberCookieData.fromCookie(req).traverse(S.removeRememberToken)
|
||||
_ <- RememberCookieData.fromCookie(req).traverse(S.removeRememberToken)
|
||||
res <- Ok()
|
||||
} yield res
|
||||
.removeCookie(CookieData.deleteCookie(getBaseUrl(cfg, req)))
|
||||
@ -90,7 +90,7 @@ object LoginRoutes {
|
||||
import dsl._
|
||||
res match {
|
||||
case Login.Result.Ok(token, remember) =>
|
||||
val cd = CookieData(token)
|
||||
val cd = CookieData(token)
|
||||
val rem = remember.map(RememberCookieData.apply)
|
||||
for {
|
||||
resp <- Ok(
|
||||
|
@ -44,9 +44,9 @@ object MailSendRoutes {
|
||||
|
||||
def convertIn(item: Ident, s: SimpleMail): Either[String, ItemMail] =
|
||||
for {
|
||||
rec <- s.recipients.traverse(MailAddress.parse)
|
||||
cc <- s.cc.traverse(MailAddress.parse)
|
||||
bcc <- s.bcc.traverse(MailAddress.parse)
|
||||
rec <- s.recipients.traverse(MailAddress.parse)
|
||||
cc <- s.cc.traverse(MailAddress.parse)
|
||||
bcc <- s.bcc.traverse(MailAddress.parse)
|
||||
fileIds <- s.attachmentIds.traverse(Ident.fromString)
|
||||
sel =
|
||||
if (s.addAllAttachments) AttachSelection.All
|
||||
|
@ -49,13 +49,13 @@ object MailSettingsRoutes {
|
||||
|
||||
case GET -> Root / "smtp" / Ident(name) =>
|
||||
(for {
|
||||
ems <- backend.mail.findSmtpSettings(user.account, name)
|
||||
ems <- backend.mail.findSmtpSettings(user.account, name)
|
||||
resp <- OptionT.liftF(Ok(convert(ems)))
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
|
||||
case GET -> Root / "imap" / Ident(name) =>
|
||||
(for {
|
||||
ems <- backend.mail.findImapSettings(user.account, name)
|
||||
ems <- backend.mail.findImapSettings(user.account, name)
|
||||
resp <- OptionT.liftF(Ok(convert(ems)))
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
|
||||
|
@ -32,22 +32,22 @@ object NotifyDueItemsRoutes {
|
||||
user: AuthToken
|
||||
): HttpRoutes[F] = {
|
||||
val dsl = new Http4sDsl[F] {}
|
||||
val ut = backend.userTask
|
||||
val ut = backend.userTask
|
||||
import dsl._
|
||||
|
||||
HttpRoutes.of {
|
||||
case GET -> Root / Ident(id) =>
|
||||
(for {
|
||||
task <- ut.findNotifyDueItems(id, UserTaskScope(user.account))
|
||||
res <- OptionT.liftF(taskToSettings(user.account, backend, task))
|
||||
res <- OptionT.liftF(taskToSettings(user.account, backend, task))
|
||||
resp <- OptionT.liftF(Ok(res))
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
|
||||
case req @ POST -> Root / "startonce" =>
|
||||
for {
|
||||
data <- req.as[NotificationSettings]
|
||||
data <- req.as[NotificationSettings]
|
||||
newId <- Ident.randomId[F]
|
||||
task <- makeTask(newId, getBaseUrl(cfg, req), user.account, data)
|
||||
task <- makeTask(newId, getBaseUrl(cfg, req), user.account, data)
|
||||
res <-
|
||||
ut.executeNow(UserTaskScope(user.account), None, task)
|
||||
.attempt
|
||||
@ -83,9 +83,9 @@ object NotifyDueItemsRoutes {
|
||||
|
||||
case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[NotificationSettings]
|
||||
data <- req.as[NotificationSettings]
|
||||
newId <- Ident.randomId[F]
|
||||
task <- makeTask(newId, getBaseUrl(cfg, req), user.account, data)
|
||||
task <- makeTask(newId, getBaseUrl(cfg, req), user.account, data)
|
||||
res <-
|
||||
ut.submitNotifyDueItems(UserTaskScope(user.account), None, task)
|
||||
.attempt
|
||||
|
@ -50,29 +50,29 @@ object OrganizationRoutes {
|
||||
|
||||
case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[Organization]
|
||||
data <- req.as[Organization]
|
||||
newOrg <- newOrg(data, user.account.collective)
|
||||
added <- backend.organization.addOrg(newOrg)
|
||||
resp <- Ok(basicResult(added, "New organization saved."))
|
||||
added <- backend.organization.addOrg(newOrg)
|
||||
resp <- Ok(basicResult(added, "New organization saved."))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root =>
|
||||
for {
|
||||
data <- req.as[Organization]
|
||||
upOrg <- changeOrg(data, user.account.collective)
|
||||
data <- req.as[Organization]
|
||||
upOrg <- changeOrg(data, user.account.collective)
|
||||
update <- backend.organization.updateOrg(upOrg)
|
||||
resp <- Ok(basicResult(update, "Organization updated."))
|
||||
resp <- Ok(basicResult(update, "Organization updated."))
|
||||
} yield resp
|
||||
|
||||
case DELETE -> Root / Ident(id) =>
|
||||
for {
|
||||
delOrg <- backend.organization.deleteOrg(id, user.account.collective)
|
||||
resp <- Ok(basicResult(delOrg, "Organization deleted."))
|
||||
resp <- Ok(basicResult(delOrg, "Organization deleted."))
|
||||
} yield resp
|
||||
|
||||
case GET -> Root / Ident(id) =>
|
||||
(for {
|
||||
org <- OptionT(backend.organization.findOrg(user.account, id))
|
||||
org <- OptionT(backend.organization.findOrg(user.account, id))
|
||||
resp <- OptionT.liftF(Ok(mkOrg(org)))
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
}
|
||||
|
@ -57,30 +57,30 @@ object PersonRoutes {
|
||||
|
||||
case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[Person]
|
||||
data <- req.as[Person]
|
||||
newPer <- newPerson(data, user.account.collective)
|
||||
added <- backend.organization.addPerson(newPer)
|
||||
resp <- Ok(basicResult(added, "New person saved."))
|
||||
added <- backend.organization.addPerson(newPer)
|
||||
resp <- Ok(basicResult(added, "New person saved."))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root =>
|
||||
for {
|
||||
data <- req.as[Person]
|
||||
upPer <- changePerson(data, user.account.collective)
|
||||
data <- req.as[Person]
|
||||
upPer <- changePerson(data, user.account.collective)
|
||||
update <- backend.organization.updatePerson(upPer)
|
||||
resp <- Ok(basicResult(update, "Person updated."))
|
||||
resp <- Ok(basicResult(update, "Person updated."))
|
||||
} yield resp
|
||||
|
||||
case DELETE -> Root / Ident(id) =>
|
||||
for {
|
||||
_ <- logger.fdebug(s"Deleting person ${id.id}")
|
||||
_ <- logger.fdebug(s"Deleting person ${id.id}")
|
||||
delOrg <- backend.organization.deletePerson(id, user.account.collective)
|
||||
resp <- Ok(basicResult(delOrg, "Person deleted."))
|
||||
resp <- Ok(basicResult(delOrg, "Person deleted."))
|
||||
} yield resp
|
||||
|
||||
case GET -> Root / Ident(id) =>
|
||||
(for {
|
||||
org <- OptionT(backend.organization.findPerson(user.account, id))
|
||||
org <- OptionT(backend.organization.findPerson(user.account, id))
|
||||
resp <- OptionT.liftF(Ok(mkPerson(org)))
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
}
|
||||
|
@ -32,14 +32,14 @@ object RegisterRoutes {
|
||||
case req @ POST -> Root / "register" =>
|
||||
for {
|
||||
data <- req.as[Registration]
|
||||
res <- backend.signup.register(cfg.backend.signup)(convert(data))
|
||||
res <- backend.signup.register(cfg.backend.signup)(convert(data))
|
||||
resp <- Ok(convert(res))
|
||||
} yield resp
|
||||
|
||||
case req @ POST -> Root / "newinvite" =>
|
||||
for {
|
||||
data <- req.as[GenInvite]
|
||||
res <- backend.signup.newInvite(cfg.backend.signup)(data.password)
|
||||
res <- backend.signup.newInvite(cfg.backend.signup)(data.password)
|
||||
resp <- Ok(convert(res))
|
||||
} yield resp
|
||||
}
|
||||
|
@ -29,22 +29,22 @@ object ScanMailboxRoutes {
|
||||
user: AuthToken
|
||||
): HttpRoutes[F] = {
|
||||
val dsl = new Http4sDsl[F] {}
|
||||
val ut = backend.userTask
|
||||
val ut = backend.userTask
|
||||
import dsl._
|
||||
|
||||
HttpRoutes.of {
|
||||
case GET -> Root / Ident(id) =>
|
||||
(for {
|
||||
task <- ut.findScanMailbox(id, UserTaskScope(user.account))
|
||||
res <- OptionT.liftF(taskToSettings(user.account, backend, task))
|
||||
res <- OptionT.liftF(taskToSettings(user.account, backend, task))
|
||||
resp <- OptionT.liftF(Ok(res))
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
|
||||
case req @ POST -> Root / "startonce" =>
|
||||
for {
|
||||
data <- req.as[ScanMailboxSettings]
|
||||
data <- req.as[ScanMailboxSettings]
|
||||
newId <- Ident.randomId[F]
|
||||
task <- makeTask(newId, user.account, data)
|
||||
task <- makeTask(newId, user.account, data)
|
||||
res <-
|
||||
ut.executeNow(UserTaskScope(user.account), None, task)
|
||||
.attempt
|
||||
@ -80,9 +80,9 @@ object ScanMailboxRoutes {
|
||||
|
||||
case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[ScanMailboxSettings]
|
||||
data <- req.as[ScanMailboxSettings]
|
||||
newId <- Ident.randomId[F]
|
||||
task <- makeTask(newId, user.account, data)
|
||||
task <- makeTask(newId, user.account, data)
|
||||
res <-
|
||||
ut.submitScanMailbox(UserTaskScope(user.account), None, task)
|
||||
.attempt
|
||||
|
@ -30,7 +30,7 @@ object SentMailRoutes {
|
||||
HttpRoutes.of {
|
||||
case GET -> Root / "item" / Ident(id) =>
|
||||
for {
|
||||
all <- backend.mail.getSentMailsForItem(user.account, id)
|
||||
all <- backend.mail.getSentMailsForItem(user.account, id)
|
||||
resp <- Ok(SentMails(all.map(convert).toList))
|
||||
} yield resp
|
||||
|
||||
@ -42,7 +42,7 @@ object SentMailRoutes {
|
||||
|
||||
case DELETE -> Root / "mail" / Ident(mailId) =>
|
||||
for {
|
||||
n <- backend.mail.deleteSentMail(user.account, mailId)
|
||||
n <- backend.mail.deleteSentMail(user.account, mailId)
|
||||
resp <- Ok(BasicResult(n > 0, s"Mails deleted: $n"))
|
||||
} yield resp
|
||||
}
|
||||
|
@ -36,10 +36,10 @@ object SourceRoutes {
|
||||
|
||||
case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[SourceTagIn]
|
||||
src <- newSource(data.source, user.account.collective)
|
||||
data <- req.as[SourceTagIn]
|
||||
src <- newSource(data.source, user.account.collective)
|
||||
added <- backend.source.add(src, data.tags)
|
||||
resp <- Ok(basicResult(added, "Source added."))
|
||||
resp <- Ok(basicResult(added, "Source added."))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root =>
|
||||
@ -47,12 +47,12 @@ object SourceRoutes {
|
||||
data <- req.as[SourceTagIn]
|
||||
src = changeSource(data.source, user.account.collective)
|
||||
updated <- backend.source.update(src, data.tags)
|
||||
resp <- Ok(basicResult(updated, "Source updated."))
|
||||
resp <- Ok(basicResult(updated, "Source updated."))
|
||||
} yield resp
|
||||
|
||||
case DELETE -> Root / Ident(id) =>
|
||||
for {
|
||||
del <- backend.source.delete(id, user.account.collective)
|
||||
del <- backend.source.delete(id, user.account.collective)
|
||||
resp <- Ok(basicResult(del, "Source deleted."))
|
||||
} yield resp
|
||||
}
|
||||
|
@ -42,8 +42,8 @@ object TagRoutes {
|
||||
case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[Tag]
|
||||
tag <- newTag(data, user.account.collective)
|
||||
res <- backend.tag.add(tag)
|
||||
tag <- newTag(data, user.account.collective)
|
||||
res <- backend.tag.add(tag)
|
||||
resp <- Ok(basicResult(res, "Tag successfully created."))
|
||||
} yield resp
|
||||
|
||||
@ -51,13 +51,13 @@ object TagRoutes {
|
||||
for {
|
||||
data <- req.as[Tag]
|
||||
tag = changeTag(data, user.account.collective)
|
||||
res <- backend.tag.update(tag)
|
||||
res <- backend.tag.update(tag)
|
||||
resp <- Ok(basicResult(res, "Tag successfully updated."))
|
||||
} yield resp
|
||||
|
||||
case DELETE -> Root / Ident(id) =>
|
||||
for {
|
||||
del <- backend.tag.delete(id, user.account.collective)
|
||||
del <- backend.tag.delete(id, user.account.collective)
|
||||
resp <- Ok(basicResult(del, "Tag successfully deleted."))
|
||||
} yield resp
|
||||
}
|
||||
|
@ -51,14 +51,14 @@ object TotpRoutes {
|
||||
InternalServerError(BasicResult(false, ex.getMessage))
|
||||
case s @ OTotp.InitResult.Success(_, key) =>
|
||||
val issuer = cfg.appName
|
||||
val uri = s.authenticatorUrl(issuer)
|
||||
val uri = s.authenticatorUrl(issuer)
|
||||
Ok(OtpResult(uri, key.data.toBase32, "totp", issuer))
|
||||
}
|
||||
} yield resp
|
||||
|
||||
case req @ POST -> Root / "confirm" =>
|
||||
for {
|
||||
data <- req.as[OtpConfirm]
|
||||
data <- req.as[OtpConfirm]
|
||||
result <- backend.totp.confirmInit(user.account, OnetimePassword(data.otp.pass))
|
||||
resp <- result match {
|
||||
case OTotp.ConfirmResult.Success =>
|
||||
@ -71,7 +71,7 @@ object TotpRoutes {
|
||||
case POST -> Root / "disable" =>
|
||||
for {
|
||||
result <- backend.totp.disable(user.account)
|
||||
resp <- Ok(Conversions.basicResult(result, "TOTP setup disabled."))
|
||||
resp <- Ok(Conversions.basicResult(result, "TOTP setup disabled."))
|
||||
} yield resp
|
||||
}
|
||||
}
|
||||
@ -82,9 +82,9 @@ object TotpRoutes {
|
||||
|
||||
HttpRoutes.of { case req @ POST -> Root / "resetOTP" =>
|
||||
for {
|
||||
data <- req.as[ResetPassword]
|
||||
data <- req.as[ResetPassword]
|
||||
result <- backend.totp.disable(data.account)
|
||||
resp <- Ok(Conversions.basicResult(result, "TOTP setup disabled."))
|
||||
resp <- Ok(Conversions.basicResult(result, "TOTP setup disabled."))
|
||||
} yield resp
|
||||
}
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ object UploadRoutes {
|
||||
cfg.backend.files.validMimeTypes
|
||||
)
|
||||
result <- backend.upload.submitEither(updata, accOrSrc, true, itemId)
|
||||
res <- Ok(basicResult(result))
|
||||
res <- Ok(basicResult(result))
|
||||
} yield res
|
||||
}
|
||||
}
|
||||
|
@ -47,10 +47,10 @@ object UserRoutes {
|
||||
|
||||
case req @ POST -> Root =>
|
||||
for {
|
||||
data <- req.as[User]
|
||||
data <- req.as[User]
|
||||
nuser <- newUser(data, user.account.collective)
|
||||
added <- backend.collective.add(nuser)
|
||||
resp <- Ok(basicResult(added, "User created."))
|
||||
resp <- Ok(basicResult(added, "User created."))
|
||||
} yield resp
|
||||
|
||||
case req @ PUT -> Root =>
|
||||
@ -58,12 +58,12 @@ object UserRoutes {
|
||||
data <- req.as[User]
|
||||
nuser = changeUser(data, user.account.collective)
|
||||
update <- backend.collective.update(nuser)
|
||||
resp <- Ok(basicResult(update, "User updated."))
|
||||
resp <- Ok(basicResult(update, "User updated."))
|
||||
} yield resp
|
||||
|
||||
case DELETE -> Root / Ident(id) =>
|
||||
for {
|
||||
ar <- backend.collective.deleteUser(id, user.account.collective)
|
||||
ar <- backend.collective.deleteUser(id, user.account.collective)
|
||||
resp <- Ok(basicResult(ar, "User deleted."))
|
||||
} yield resp
|
||||
|
||||
@ -83,7 +83,7 @@ object UserRoutes {
|
||||
|
||||
HttpRoutes.of { case req @ POST -> Root / "resetPassword" =>
|
||||
for {
|
||||
input <- req.as[ResetPassword]
|
||||
input <- req.as[ResetPassword]
|
||||
result <- backend.collective.resetPassword(input.account)
|
||||
resp <- Ok(result match {
|
||||
case OCollective.PassResetResult.Success(np) =>
|
||||
|
@ -27,7 +27,7 @@ import yamusca.imports._
|
||||
object TemplateRoutes {
|
||||
private[this] val logger = getLogger
|
||||
|
||||
val `text/html` = new MediaType("text", "html")
|
||||
val `text/html` = new MediaType("text", "html")
|
||||
val `application/javascript` = new MediaType("application", "javascript")
|
||||
|
||||
trait InnerRoutes[F[_]] {
|
||||
@ -41,7 +41,7 @@ object TemplateRoutes {
|
||||
loadResource("/index.html").flatMap(loadTemplate(_))
|
||||
)
|
||||
val docTemplate = memo(loadResource("/doc.html").flatMap(loadTemplate(_)))
|
||||
val swTemplate = memo(loadResource("/sw.js").flatMap(loadTemplate(_)))
|
||||
val swTemplate = memo(loadResource("/sw.js").flatMap(loadTemplate(_)))
|
||||
|
||||
val dsl = new Http4sDsl[F] {}
|
||||
import dsl._
|
||||
|
@ -36,8 +36,8 @@ object WebjarRoutes {
|
||||
def appRoutes[F[_]: Async]: HttpRoutes[F] =
|
||||
Kleisli {
|
||||
case req if req.method == Method.GET =>
|
||||
val p = req.pathInfo.renderString
|
||||
val last = req.pathInfo.segments.lastOption.map(_.encoded).getOrElse("")
|
||||
val p = req.pathInfo.renderString
|
||||
val last = req.pathInfo.segments.lastOption.map(_.encoded).getOrElse("")
|
||||
val containsColon = req.pathInfo.segments.exists(_.encoded.contains(".."))
|
||||
if (containsColon || !suffixes.exists(last.endsWith(_)))
|
||||
OptionT.pure(Response.notFound[F])
|
||||
|
Reference in New Issue
Block a user