Skip to content

Commit

Permalink
Feat/39 time convention (#90)
Browse files Browse the repository at this point in the history
* feat: change localdatetime to offsetDateTime

* chore: remove unnecessary codes,files

* feat: revive event post endpoint

* fix: change some test codes

* feat: revive test codes Creating event

* docs: update open-api.yaml

* chore: apply PR

---------

Co-authored-by: Git Actions <no-reply@github.com>
  • Loading branch information
minjun3021 and Git Actions authored Sep 19, 2023
1 parent 15d6b8b commit 295a5c0
Show file tree
Hide file tree
Showing 24 changed files with 166 additions and 275 deletions.
47 changes: 44 additions & 3 deletions docs/open-api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,24 @@ paths:
'*/*':
schema:
$ref: '#/components/schemas/ReservationResponse'
/events:
post:
tags:
- event-controller
operationId: createEvent
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/EventCreateRequest'
required: true
responses:
"200":
description: OK
content:
'*/*':
schema:
$ref: '#/components/schemas/EventResponse'
/bookmarks:
get:
tags:
Expand Down Expand Up @@ -305,12 +323,27 @@ components:
eventId:
type: integer
format: int32
BookmarkFromdto:
EventCreateRequest:
required:
- event_id
- date
- maxAttendees
- reservationEndTime
- reservationStartTime
- title
type: object
properties:
event_id:
title:
type: string
date:
type: string
format: date-time
reservationStartTime:
type: string
format: date-time
reservationEndTime:
type: string
format: date-time
maxAttendees:
type: integer
format: int32
EventResponse:
Expand Down Expand Up @@ -340,3 +373,11 @@ components:
maxAttendees:
type: integer
format: int32
BookmarkFromdto:
required:
- event_id
type: object
properties:
event_id:
type: integer
format: int32
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,12 @@ import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.data.repository.findByIdOrNull
import org.springframework.transaction.annotation.Transactional
import java.time.Clock
import java.time.OffsetDateTime

class BookmarkRepositoryTest(
@Autowired val bookmarkRepository: BookmarkRepository,
@Autowired val userRepository: UserRepository,
@Autowired val eventRepository: EventRepository,
@Autowired private val clock: Clock
@Autowired val eventRepository: EventRepository
) : AbstractIntegrationTest() {

val sampleUser = User(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class EventRepositoryTest @Autowired constructor(
@Test
fun `EventRepository_save should return savedEvent`() {
// given
val now = OffsetDateTime.now(ZoneOffset.UTC)
val now = OffsetDateTime.now()
val sampleEvent = Event(
title = "test title",
date = now,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.group4.ticketingservice.Reservation

import com.group4.ticketingservice.AbstractIntegrationTest
import com.group4.ticketingservice.config.ClockConfig
import com.group4.ticketingservice.entity.Event
import com.group4.ticketingservice.entity.Reservation
import com.group4.ticketingservice.entity.User
Expand All @@ -12,11 +11,9 @@ import com.group4.ticketingservice.utils.Authority
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Import
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
import java.time.OffsetDateTime

@Import(ClockConfig::class)
class ReservationRepositoryTest @Autowired constructor(
val userRepository: UserRepository,
val eventRepository: EventRepository,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package com.group4.ticketingservice

import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.group4.ticketingservice.TimeE2ETest.testFields.password
import com.group4.ticketingservice.TimeE2ETest.testFields.testName
import com.group4.ticketingservice.TimeE2ETest.testFields.testUserName
import com.group4.ticketingservice.config.ClockConfig
import com.group4.ticketingservice.config.GsonConfig
import com.group4.ticketingservice.config.WebConfig
import com.group4.ticketingservice.dto.SignInRequest
Expand All @@ -14,19 +11,19 @@ import com.group4.ticketingservice.repository.UserRepository
import com.group4.ticketingservice.utils.Authority
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.context.annotation.Import
import org.springframework.http.MediaType
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.content
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status

@AutoConfigureMockMvc
@Import(ClockConfig::class, GsonConfig::class, WebConfig::class)
@Import(GsonConfig::class, WebConfig::class)
class TimeE2ETest @Autowired constructor(
val userRepository: UserRepository,
private val mockMvc: MockMvc
Expand Down Expand Up @@ -59,35 +56,23 @@ class TimeE2ETest @Autowired constructor(
userRepository.deleteAll()
}

@Test
fun `All API only returns OffsetDateTime in UTC without any offset info`() {
val eventCreateRequest = "{\"title\":\"test title\"," +
"\"date\":\"2022-09-01T21:00:00.001+09:00\"," +
"\"reservationStartTime\":\"2022-09-01T22:00:00.001+09:00\"," +
"\"reservationEndTime\":\"2022-09-01T23:00:00.001+09:00\"," +
"\"maxAttendees\":10}"
val jwt = getJwt()

mockMvc.perform(
post("/events")
.contentType(MediaType.APPLICATION_JSON)
.content(eventCreateRequest)
.header("Authorization", jwt)
)
.andExpect(status().isOk)
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.date").value("2022-09-01T12:00:00.001Z"))
.andExpect(jsonPath("$.reservationStartTime").value("2022-09-01T13:00:00.001Z"))
.andExpect(jsonPath("$.reservationEndTime").value("2022-09-01T14:00:00.001Z"))
}

fun getJwt(): String {
val gson = GsonBuilder().create()

val result = mockMvc.perform(
MockMvcRequestBuilders.post("/users/signin")
.content(gson.toJson(sampleSignInRequest).toString())
.contentType(MediaType.APPLICATION_JSON)
).andReturn()
val jwt = gson.fromJson(result.response.contentAsString, JsonObject::class.java)
return jwt.get("Authorization").asString
}
}
29 changes: 0 additions & 29 deletions src/main/kotlin/com/group4/ticketingservice/config/ClockConfig.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,15 @@ package com.group4.ticketingservice.config
import com.google.gson.FieldNamingPolicy
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.group4.ticketingservice.util.DateTimeConverter
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import java.time.OffsetDateTime

@Configuration
class GsonConfig {
@Bean
fun gson(): Gson {
return GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.registerTypeAdapter(OffsetDateTime::class.java, DateTimeConverter())
.create()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.group4.ticketingservice.config

import jakarta.annotation.PostConstruct
import org.springframework.context.annotation.Configuration
import java.util.*

@Configuration
class TimeZoneConfig {
@PostConstruct
fun init() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"))
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.group4.ticketingservice.controller

import com.group4.ticketingservice.dto.EventCreateRequest
import com.group4.ticketingservice.dto.EventResponse
import com.group4.ticketingservice.service.EventService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

Expand All @@ -16,6 +19,27 @@ class EventController @Autowired constructor(
val eventService: EventService
) {

// TimeE2ETest를 위한 임시 EndPoint입니다.
@PostMapping
fun createEvent(@RequestBody request: EventCreateRequest): ResponseEntity<EventResponse> {
val event = eventService.createEvent(
request.title,
request.date,
request.reservationStartTime,
request.reservationEndTime,
request.maxAttendees
)
val response = EventResponse(
id = event.id!!,
title = event.title,
date = event.date,
reservationStartTime = event.reservationStartTime,
reservationEndTime = event.reservationEndTime,
maxAttendees = event.maxAttendees
)
return ResponseEntity.status(HttpStatus.OK).body(response)
}

@GetMapping("/{id}")
fun getEvent(@PathVariable id: Int): ResponseEntity<EventResponse?> {
return eventService.getEvent(id)?.let {
Expand Down
4 changes: 2 additions & 2 deletions src/main/kotlin/com/group4/ticketingservice/dto/UserDto.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.group4.ticketingservice.dto

import java.time.LocalDateTime
import java.time.OffsetDateTime

class UserDto(
val name: String,
val email: String,
val createdAt: LocalDateTime?
val createdAt: OffsetDateTime?
)
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package com.group4.ticketingservice.entity

import jakarta.persistence.Column
import jakarta.persistence.EntityListeners
import jakarta.persistence.MappedSuperclass
import org.springframework.data.annotation.CreatedDate
import org.springframework.data.annotation.LastModifiedDate
import org.springframework.data.jpa.domain.support.AuditingEntityListener
import java.time.LocalDateTime
import java.time.OffsetDateTime

@MappedSuperclass
@EntityListeners(AuditingEntityListener::class)
abstract class BaseTimeEntity {
@CreatedDate
var createdAt: LocalDateTime? = null

@LastModifiedDate
var updatedAt: LocalDateTime? = null
@Column(updatable = false)
val createdAt: OffsetDateTime = OffsetDateTime.now()

@Column(updatable = true)
val updatedAt: OffsetDateTime = OffsetDateTime.now()
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ class Bookmark(
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
var event: Event
)
) : BaseTimeEntity()
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class Event(
@NotNull
var currentReservationCount: Int = 0

) {
) : BaseTimeEntity() {

@OneToMany(mappedBy = "event", fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,28 @@ package com.group4.ticketingservice.service
import com.group4.ticketingservice.entity.Event
import com.group4.ticketingservice.repository.EventRepository
import org.springframework.stereotype.Service
import java.time.OffsetDateTime

@Service
class EventService(
private val eventRepository: EventRepository
) {
fun createEvent(
title: String,
date: OffsetDateTime,
reservationStartTime: OffsetDateTime,
reservationEndTime: OffsetDateTime,
maxAttendees: Int
): Event {
val event = Event(
title = title,
date = date,
reservationStartTime = reservationStartTime,
reservationEndTime = reservationEndTime,
maxAttendees = maxAttendees
)
return eventRepository.save(event)
}

fun getEvent(id: Int): Event? {
return eventRepository.findById(id).orElse(null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@ import org.springframework.beans.factory.annotation.Autowired
import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import java.time.Clock
import java.time.OffsetDateTime

@Service
class ReservationService @Autowired constructor(
private val userRepository: UserRepository,
private val eventRepository: EventRepository,
private val reservationRepository: ReservationRepository,
private val clock: Clock
private val reservationRepository: ReservationRepository
) {
@Transactional
fun createReservation(eventId: Int, userId: Int): Reservation {
Expand Down
Loading

0 comments on commit 295a5c0

Please sign in to comment.