Added page for viewing a single image, tracking number of images a tag has.

This commit is contained in:
neviyn 2021-05-09 20:25:19 +01:00
parent ca567b2e60
commit c4c44ad4da
7 changed files with 63 additions and 3 deletions

View File

@ -8,6 +8,7 @@ import org.springframework.stereotype.Controller
import org.springframework.ui.Model import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.ModelAttribute import org.springframework.web.bind.annotation.ModelAttribute
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestParam
@ -36,6 +37,15 @@ class BaseController
return "login" return "login"
} }
@GetMapping("/view/{id}")
fun viewSingleImage(@PathVariable id: Long, model: Model) : String {
val image = imageRepository.findById(id).get()
val tagData = image.tags.sortedBy { it.tag }
model.addAttribute("image", image)
model.addAttribute("tags", tagData)
model.addAttribute("title", tagData.joinToString { it.tag })
return "single"
}
} }
@Controller @Controller
@ -137,6 +147,7 @@ class UploadController
val user = memberRepository.findByName(userDetails.username)!! val user = memberRepository.findByName(userDetails.username)!!
val hash: String = generateFileHash(file) val hash: String = generateFileHash(file)
val tagData = tags.split(" ").map { tagRepository.findByTagIs(it) ?: tagRepository.save(Tag(tag = it)) }.toMutableSet() val tagData = tags.split(" ").map { tagRepository.findByTagIs(it) ?: tagRepository.save(Tag(tag = it)) }.toMutableSet()
tagData.map { it.amount = it.amount + 1 }
storage.addImageFile(hash, extension, file.bytes) storage.addImageFile(hash, extension, file.bytes)
imageRepository.save(Image("$hash.$extension", user, tagData)) imageRepository.save(Image("$hash.$extension", user, tagData))
return "upload" // TODO: Show success on page return "upload" // TODO: Show success on page

View File

@ -72,6 +72,7 @@ open class Tag(
@Column(unique = true) @Column(unique = true)
@Pattern(regexp = "[a-zA-Z0-9_]*") // Only allow alphanumeric and underscores @Pattern(regexp = "[a-zA-Z0-9_]*") // Only allow alphanumeric and underscores
open var tag: String = "", open var tag: String = "",
open var amount: Long = 0,
@Id @Id
@SequenceGenerator(name="tag_id_seq", sequenceName = "tag_id_seq", allocationSize = 1) @SequenceGenerator(name="tag_id_seq", sequenceName = "tag_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tag_id_seq") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tag_id_seq")

View File

@ -21,6 +21,10 @@ interface ImageRepository : JpaRepository<Image, Long> {
fun findByTagsOrderById(tagIDs: List<Tag>, tagCount: Long, pageable: Pageable): Page<Image> fun findByTagsOrderById(tagIDs: List<Tag>, tagCount: Long, pageable: Pageable): Page<Image>
fun findAllByTagsContainingOrderById(tag: Tag, pageable: Pageable): Page<Image> fun findAllByTagsContainingOrderById(tag: Tag, pageable: Pageable): Page<Image>
@Suppress("SqlResolve")
@Query(value = "DELETE FROM BOORU.TAG_IMAGE WHERE IMAGE_ID = ?1", nativeQuery = true)
fun deleteTagAssociations(imagesID: Long)
} }
interface TagRepository : CrudRepository<Tag, Long> { interface TagRepository : CrudRepository<Tag, Long> {

View File

@ -10,3 +10,8 @@ data class DisplayUser(
val password: String, val password: String,
@field:NotBlank val oldPassword: String @field:NotBlank val oldPassword: String
) )
data class TagWithCount(
val tagName: String,
val count: Int
)

View File

@ -28,7 +28,8 @@ CREATE TABLE booru.role
CREATE TABLE booru.tag CREATE TABLE booru.tag
( (
id bigserial NOT NULL PRIMARY KEY, id bigserial NOT NULL PRIMARY KEY,
tag varchar NOT NULL UNIQUE tag varchar NOT NULL UNIQUE,
amount bigint NOT NULL
); );
CREATE TABLE booru.tag_image CREATE TABLE booru.tag_image

View File

@ -24,8 +24,9 @@
</div> </div>
<div class="row" th:if="${imagePage != null}"> <div class="row" th:if="${imagePage != null}">
<div class="col-2" th:each="image : ${imagePage.content}"> <div class="col-2" th:each="image : ${imagePage.content}">
<!--/*@thymesVar id="image" type="uk.co.neviyn.booru.Image"*/--> <a th:href="'/view/' + ${image.id}">
<img alt="" class="img-thumbnail" th:src="'/i/thumbnail.' + ${image.filename}"/> <img alt="" class="img-thumbnail" th:src="'/i/thumbnail.' + ${image.filename}"/>
</a>
</div> </div>
</div> </div>
<div class="row" th:if="${imagePage == null}"> <div class="row" th:if="${imagePage == null}">

View File

@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta th:replace="fragments :: header"/>
<title th:text="${title}">Image</title>
</head>
<body>
<div th:replace="fragments :: navbar"></div>
<div class="container">
<form action="/gallery" class="text-center row row-cols-auto align-items-center mt-2">
<div class="col-10">
<!--suppress HtmlFormInputWithoutLabel -->
<input class="form-control" id="imageSearch"
name="tags"
pattern="[a-zA-Z0-9\s_]*"
placeholder="Ex: blue_eyes smile"
th:value="${#request.getParameter('tags')}"
type="search">
</div>
<div class="col-2 d-grid">
<button class="btn btn-primary" type="submit">Search</button>
</div>
</form>
</div>
<div class="row mt-2">
<div class="col-2">
<ul>
<li th:each="tag : ${tags}"><a class="text-decoration-none" th:href="${#mvc.url('IC#getGalleryPage').arg(1, tag.tag).build()}" th:text="${tag.tag} + ' ' + ${tag.amount}">tag</a></li>
</ul>
</div>
<div class="col-8">
<img th:src="'/i/' + ${image.filename}" th:alt="${image.filename}" class="w-100">
</div>
<div class="col-2"></div>
</div>
</body>
</html>