Skip to content

Commit

Permalink
feat: support for sponsors per city
Browse files Browse the repository at this point in the history
  • Loading branch information
1grzyb1 committed Oct 19, 2023
1 parent 613c717 commit f438377
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 17 deletions.
11 changes: 10 additions & 1 deletion odyseja-ui/src/routes/panel/sponsor/+page.svelte
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
<script lang="ts">
import {BASE_URL, del, showSadToast} from "$lib/apiService";
import type {Sponsors} from "$lib/types";
import type {City, Sponsors} from "$lib/types";
import {fetchSponsors} from "./sponsorService";
import {city} from "$lib/cityStore";
export let data: Sponsors;
let currentCity: City
city.subscribe(async curr => {
currentCity = curr
data = await fetchSponsors();
});
async function handleImageUpload(event: Event, index: number) {
const file = (event.target as HTMLInputElement).files[0];
if (file) {
Expand All @@ -23,6 +31,7 @@
formData.append('image', file);
formData.append('row', row.toString());
formData.append('column', column.toString());
formData.append('cityId', currentCity.id.toString());
const response = await fetch(BASE_URL + '/sponsor', {
method: 'POST',
Expand Down
8 changes: 5 additions & 3 deletions src/main/kotlin/odyseja/odysejapka/domain/SponsorEntity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@ class SponsorEntity(
@Column(length = 10000)
val image: ByteArray,
@Column
val rowIndex: Int,
val rowOrder: Int,
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
val columnIndex: Int
val columnOrder: Int,
@ManyToOne(fetch = FetchType.LAZY)
val city: CityEntity
) {

fun toSponsor(): Sponsor {
return Sponsor(id, rowIndex, columnIndex)
return Sponsor(id, rowOrder, columnOrder)
}
}
14 changes: 8 additions & 6 deletions src/main/kotlin/odyseja/odysejapka/rest/SponsorController.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package odyseja.odysejapka.rest

import odyseja.odysejapka.domain.CityEntity
import odyseja.odysejapka.domain.Sponsor
import odyseja.odysejapka.domain.SponsorEntity
import odyseja.odysejapka.service.SponsorService
Expand All @@ -26,17 +27,18 @@ class SponsorController(private val sponsorService: SponsorService) {
@GetMapping
@ResponseBody
@Throws(IOException::class)
fun getImages(): List<List<Sponsor>> {
return sponsorService.getImages()
fun getImages(@RequestParam("cityId") cityId: Int): List<List<Sponsor>> {
return sponsorService.getImages(cityId)
}

@PostMapping
fun uploadImage(
@RequestParam("image") file: MultipartFile,
@RequestParam("row") row: Int
@RequestParam("row") row: Int,
@RequestParam("cityId") cityId: Int
): Sponsor {
val uploadSponsorRequest = UploadSponsorRequest(row)
return sponsorService.uploadImage(file, uploadSponsorRequest)
return sponsorService.uploadImage(file, cityId, uploadSponsorRequest)
}

@DeleteMapping(value = ["/{imageId}"])
Expand All @@ -47,8 +49,8 @@ class SponsorController(private val sponsorService: SponsorService) {
data class UploadSponsorRequest(
val row: Int
) {
fun toSponsorEntity(image: ByteArray): SponsorEntity {
return SponsorEntity(0, image, row, 0)
fun toSponsorEntity(image: ByteArray, cityEntity: CityEntity): SponsorEntity {
return SponsorEntity(0, image, row, 0, cityEntity)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@ import odyseja.odysejapka.domain.SponsorEntity
import org.springframework.data.repository.CrudRepository

interface SponsorRepository : CrudRepository<SponsorEntity, Int> {

fun findAllByCity_Id(cityId: Int): List<SponsorEntity>
}
23 changes: 16 additions & 7 deletions src/main/kotlin/odyseja/odysejapka/service/SponsorService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ package odyseja.odysejapka.service
import odyseja.odysejapka.domain.Sponsor
import odyseja.odysejapka.rest.SponsorController
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import org.springframework.web.multipart.MultipartFile

@Service
class SponsorService(
private val sponsorRepository: SponsorRepository,
private val changeService: ChangeService
private val changeService: ChangeService,
private val cityRepository: CityRepository
) {

companion object {
Expand All @@ -25,24 +27,31 @@ class SponsorService(
return sponsor.get().image
}

fun getImages(): List<List<Sponsor>> {
val groupedByRow = sponsorRepository.findAll()
.groupBy { it.rowIndex }
@Transactional
fun getImages(cityId: Int): List<List<Sponsor>> {
val groupedByRow = sponsorRepository.findAllByCity_Id(cityId)
.groupBy { it.rowOrder }
.toSortedMap()

return groupedByRow.map { entry ->
entry.value.sortedBy { it.columnIndex }
entry.value.sortedBy { it.columnOrder }
.map { it.toSponsor() }
}
}

fun uploadImage(file: MultipartFile, uploadSponsorRequest: SponsorController.UploadSponsorRequest): Sponsor {
@Transactional
fun uploadImage(
file: MultipartFile,
cityId: Int,
uploadSponsorRequest: SponsorController.UploadSponsorRequest
): Sponsor {
val type = file.originalFilename?.split(".")?.last()
if (!acceptedTypes.contains(type)) {
throw RuntimeException("Provided invalid file type")
}

val sponsor = sponsorRepository.save(uploadSponsorRequest.toSponsorEntity(file.bytes))
val city = cityRepository.findFirstById(cityId)
val sponsor = sponsorRepository.save(uploadSponsorRequest.toSponsorEntity(file.bytes, city))

changeService.updateVersion()
return sponsor.toSponsor()
Expand Down

0 comments on commit f438377

Please sign in to comment.