applications-tracker/api/src/main/kotlin/com/andr3h3nriqu3s/applications/Flair.kt

249 lines
8.0 KiB
Kotlin

package com.andr3h3nriqu3s.applications
import java.sql.ResultSet
import java.util.UUID
import org.springframework.http.MediaType
import org.springframework.http.HttpStatus
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.jdbc.core.RowMapper
import org.springframework.stereotype.Service
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestHeader
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.server.ResponseStatusException
data class CreateFlair(
var color: String,
var name: String,
var expr: String,
var description: String?
)
@RestController
@ControllerAdvice
@RequestMapping("/api/flair")
class FlairController(
val sessionService: SessionService,
val flairService: FlairService,
val applicationService: ApplicationService
) {
@PutMapping(path = ["/"], produces = [MediaType.APPLICATION_JSON_VALUE])
public fun create(
@RequestBody flair: CreateFlair,
@RequestHeader("token") token: String
): Flair {
val user = sessionService.verifyTokenThrow(token)
return flairService.createFlair(user, flair)
}
@PutMapping(path = ["/update"], produces = [MediaType.APPLICATION_JSON_VALUE])
public fun create(@RequestBody flair: Flair, @RequestHeader("token") token: String): Flair {
val user = sessionService.verifyTokenThrow(token)
var old_flair = flairService.getById(user, flair.id)
if (old_flair == null) {
throw NotFound()
}
if (old_flair.user_id != user.id) {
throw NotAuth()
}
flair.user_id = old_flair.user_id
return flairService.updateFlair(flair)
}
@GetMapping(path = ["/"], produces = [MediaType.APPLICATION_JSON_VALUE])
public fun list(@RequestHeader("token") token: String): List<Flair> {
val user = sessionService.verifyTokenThrow(token)
return flairService.listUser(user)
}
@GetMapping(path = ["/simple/{id}"], produces = [MediaType.APPLICATION_JSON_VALUE])
public fun listSimple(@PathVariable id: String): List<SimpleFlair> {
var application = applicationService.findApplicationByIdNoUser(id)
if (application == null) {
throw ResponseStatusException(HttpStatus.NOT_FOUND, "Application Not Found", null)
}
return flairService.listUserId(application.user_id).map { it.toFlairSimple() }
}
@DeleteMapping(path = ["/{id}"], produces = [MediaType.APPLICATION_JSON_VALUE])
public fun delete(@PathVariable id: String, @RequestHeader("token") token: String): Flair {
val user = sessionService.verifyTokenThrow(token)
return flairService.deleteById(user, id)
}
}
data class SimpleFlair(
val name: String,
val description: String,
val color: String,
)
data class Flair(
var id: String,
var user_id: String,
var color: String,
var name: String,
var expr: String,
var description: String,
) {
companion object : RowMapper<Flair> {
override public fun mapRow(rs: ResultSet, rowNum: Int): Flair {
return Flair(
rs.getString("id"),
rs.getString("user_id"),
rs.getString("color"),
rs.getString("name"),
rs.getString("expr"),
rs.getString("description"),
)
}
}
fun toFlairSimple(): SimpleFlair {
return SimpleFlair(this.name, this.description, this.color)
}
}
data class FlairLink(var id: String, var application_id: String, var flair_id: String)
@Service
public class FlairService(val db: JdbcTemplate) {
public fun linkFlair(application: Application, flair: Flair): FlairLink {
val links =
db.query(
"select * from flair_link where application_id=? and flair_id=?",
arrayOf(application.id, flair.id)
) { request, _ ->
FlairLink(
request.getString("id"),
request.getString("application_id"),
request.getString("flair_id")
)
}
if (links.size > 0) {
return links[0]
}
val link = FlairLink(UUID.randomUUID().toString(), application.id, flair.id)
db.update(
"insert into flair_link (id, application_id, flair_id) values (?, ?, ?)",
link.id,
link.application_id,
link.flair_id
)
return link
}
public fun unlinkFlair(applicationId: String, flairId: String) {
db.update(
"delete from flair_link where flair_id=? and application_id=?",
flairId,
applicationId,
)
}
public fun listFromLinkApplicationId(id: String): List<Flair> =
db.query(
"select f.id, f.user_id, f.color, f.name, f.expr, f.description from flair_link as fl inner join flair as f on f.id = fl.flair_id where application_id=? order by name asc;",
arrayOf(id),
Flair
)
.toList()
public fun listUser(user: UserDb): List<Flair> =
db.query(
"select * from flair where user_id=? order by name asc;",
arrayOf(user.id),
Flair
)
.toList()
public fun listUserId(id: String): List<Flair> =
db.query(
"select * from flair where user_id=? and description != '' order by name asc;",
arrayOf(id),
Flair
)
.toList()
public fun getById(user: UserDb, id: String): Flair? {
val items =
db.query(
"select * from flair where user_id=? and id=?;",
arrayOf(user.id, id),
Flair
)
.toList()
if (items.size == 0) {
return null
}
return items[0]
}
public fun deleteById(user: UserDb, id: String): Flair {
val flair = this.getById(user, id)
if (flair == null) {
throw NotFound()
}
db.update("delete from flair where id=?", id)
return flair
}
public fun updateFlair(flair: Flair): Flair {
db.update(
"update flair set user_id=?, color=?, name=?, expr=?, description=? where id=?;",
flair.user_id,
flair.color,
flair.name,
flair.expr,
flair.description,
flair.id,
)
return flair
}
public fun createFlair(user: UserDb, flair: CreateFlair): Flair {
val id = UUID.randomUUID().toString()
var description = ""
if (flair.description != null) {
description = flair.description!!
}
var new_flair = Flair(id, user.id, flair.color, flair.name, flair.expr, description)
db.update(
"insert into flair (id, user_id, color, name, expr, description) values (?, ?, ?, ?, ?, ?)",
new_flair.id,
new_flair.user_id,
new_flair.color,
new_flair.name,
new_flair.expr,
new_flair.description
)
return new_flair
}
}