Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,12 @@ out/

### Data ###
data
dcConstants.json

### OpenAPI ###
openapitools.json

### App Config ###
server/src/main/resources/application.yml


1 change: 1 addition & 0 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ services:
networks:
- common


networks:
common:
name: codecharacter_common
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
package delta.codecharacter.server.leaderboard
package delta.codecharacter.server.daily_challenge

import delta.codecharacter.core.DailyChallengesApi
import delta.codecharacter.dtos.DailyChallengeGetRequestDto
import delta.codecharacter.dtos.DailyChallengeLeaderBoardResponseDto
import delta.codecharacter.server.user.public_user.PublicUserService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.ResponseEntity
import org.springframework.security.access.annotation.Secured
import org.springframework.web.bind.annotation.RestController

@RestController
class DailyChallengeLeaderboardController(
class DailyChallengeController(
@Autowired private val dailyChallengeService: DailyChallengeService,
@Autowired private val publicUserService: PublicUserService
) : DailyChallengesApi {
@Secured(value = ["ROLE_USER"])
override fun getDailyChallenge(): ResponseEntity<DailyChallengeGetRequestDto> {
return ResponseEntity.ok(dailyChallengeService.getDailyChallengeByDate())
}
override fun getDailyChallengeLeaderBoard(
page: Int?,
size: Int?
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package delta.codecharacter.server.daily_challenge

import delta.codecharacter.dtos.ChallengeTypeDto
import org.springframework.data.annotation.Id
import org.springframework.data.mongodb.core.mapping.Document
import java.util.UUID

@Document(collection = "daily_challenges")
Comment thread
Ram-20062003 marked this conversation as resolved.
data class DailyChallengeEntity(
Comment thread
Ram-20062003 marked this conversation as resolved.
@Id val id: UUID,
val day: Int,
val challName: String,
val challType: ChallengeTypeDto,
val chall: String,
val description: String?,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package delta.codecharacter.server.daily_challenge

import org.springframework.data.mongodb.repository.MongoRepository
import org.springframework.stereotype.Repository
import java.util.Optional
import java.util.UUID

@Repository
interface DailyChallengeRepository : MongoRepository<DailyChallengeEntity, UUID> {
fun findByDay(day: Int): Optional<DailyChallengeEntity>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package delta.codecharacter.server.daily_challenge

import delta.codecharacter.dtos.DailyChallengeGetRequestDto
import delta.codecharacter.server.exception.CustomException
import org.apache.http.HttpStatus
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Service
import java.time.Duration
import java.time.Instant

@Service
class DailyChallengeService(
@Autowired private val dailyChallengeRepository: DailyChallengeRepository
) {

@Value("\${environment.event-start-date}") val tempDate: String = ""

fun findNumberOfDays(): Int {
val givenDateTime = Instant.parse(tempDate)
val nowDateTime = Instant.now()
val period: Duration = Duration.between(givenDateTime, nowDateTime)
return period.toDays().toInt()
}

fun getDailyChallengeByDate(): DailyChallengeGetRequestDto {

val dc =
dailyChallengeRepository.findByDay(findNumberOfDays()).orElseThrow {
throw CustomException(org.springframework.http.HttpStatus.BAD_REQUEST, "Invalid Request")
}
return DailyChallengeGetRequestDto(
Comment thread
Ram-20062003 marked this conversation as resolved.
challName = dc.challName,
chall = dc.chall,
challType = dc.challType,
description = dc.description,
completionStatus = true
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package delta.codecharacter.server.seeders

import com.fasterxml.jackson.annotation.JsonProperty
import delta.codecharacter.dtos.ChallengeTypeDto

data class DailyChallengeObject(
@field:JsonProperty("day") val day: Int,
@field:JsonProperty("challName") val challName: String,
@field:JsonProperty("challType") val challType: ChallengeTypeDto,
@field:JsonProperty("chall") val chall: String,
@field:JsonProperty("description") val description: String?,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package delta.codecharacter.server.seeders

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import delta.codecharacter.server.daily_challenge.DailyChallengeEntity
import delta.codecharacter.server.daily_challenge.DailyChallengeRepository
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.context.event.ApplicationReadyEvent
import org.springframework.context.event.EventListener
import org.springframework.stereotype.Component
import java.util.UUID

@Component
class DailyChallengeSeeder {

@Autowired private lateinit var dailyChallengeRepository: DailyChallengeRepository

private val logger: Logger = LoggerFactory.getLogger(DailyChallengeSeeder::class.java)
@EventListener(ApplicationReadyEvent::class)
fun doSomethingAfterStartup() {

if (dailyChallengeRepository.findAll().isEmpty()) {
logger.info("Seeding daily_challenges")

val jsonString = this::class.java.classLoader.getResource("dcConstants.json")?.readText()
if (!jsonString.isNullOrEmpty()) {
val objectMapper = jacksonObjectMapper()
val dcs: List<DailyChallengeObject> = objectMapper.readValue(jsonString)
var dcEntities: List<DailyChallengeEntity> = listOf()
dcs.forEach {
val id = UUID.randomUUID()
dcEntities =
dcEntities.plus(
DailyChallengeEntity(
id = id,
day = it.day,
chall = it.chall,
challName = it.challName,
challType = it.challType,
description = it.description
)
)
}
dailyChallengeRepository.saveAll(dcEntities)
} else {
logger.error("dcConstants.json is empty or doesn't exist")
}
} else {
logger.info("Daily Challenges seeded already")
}
}
}
3 changes: 3 additions & 0 deletions server/src/main/resources/application.docker.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ spring:
client-id: your-github-client-id
client-secret: your-github-client-secret
scope: user:email
environment:
event-start-date: YYYY-MM-DDTHH:MM:SSZ

de:
flapdoodle:
mongodb:
Expand Down
3 changes: 3 additions & 0 deletions server/src/main/resources/application.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ spring:
client-id: your-github-client-id
client-secret: your-github-client-secret
scope: user:email
environment:
Comment thread
Ram-20062003 marked this conversation as resolved.
event-start-date: YYYY-MM-DDTHH:MM:SSZ

de:
flapdoodle:
mongodb:
Expand Down
72 changes: 72 additions & 0 deletions server/src/main/resources/dcConstants.example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
[
{
"day": 0,
"challName": "Nisi sunt ea culpa est cillum cupidatat officia est.",
"challType": "CODE",
"chall": "Commodo duis sunt est ad duis ea anim nisi pariatur ut.",
"description": "Sunt ut est ea et dolor minim veniam quis id occaecat adipisicing quis."
},
{
"day": 1,
"challName": "Exercitation esse ullamco irure quis dolor ut.",
"challType": "CODE",
"chall": "Aute nulla dolor consequat tempor commodo et aute occaecat est nulla esse reprehenderit anim tempor.",
"description": "Labore adipisicing culpa eiusmod labore mollit nisi ex fugiat nulla et voluptate laborum."
},
{
"day": 2,
"challName": "Ex incididunt laboris ex pariatur irure aute qui occaecat ullamco consequat eu mollit fugiat culpa.",
"challType": "CODE",
"chall": "Id aliqua sit fugiat exercitation Lorem elit sint nisi commodo magna do.",
"description": "Laborum labore in excepteur do."
},
{
"day": 3,
"challName": "Sint ut proident ipsum est nostrud nostrud pariatur anim id laboris velit officia est.",
"challType": "MAP",
"chall": "Incididunt id aute ad velit commodo aute cupidatat voluptate qui mollit.",
"description": "Esse do sint non enim dolore."
},
{
"day": 4,
"challName": "Mollit qui in culpa nostrud veniam commodo fugiat tempor sit dolor duis id non.",
"challType": "MAP",
"chall": "Aliqua mollit sint sunt id elit mollit ipsum incididunt sint qui officia quis elit cillum.",
"description": "Et et labore ad ad ex elit et laboris deserunt eiusmod eiusmod reprehenderit eu."
},
{
"day": 5,
"challName": "Est qui aliquip esse mollit.",
"challType": "MAP",
"chall": "Voluptate quis commodo mollit id deserunt.",
"description": "Aute voluptate amet aliquip irure."
},
{
"day": 6,
"challName": "Duis anim tempor velit do fugiat tempor aute aliqua velit ut reprehenderit.",
"challType": "MAP",
"chall": "Laborum sunt anim duis nulla reprehenderit aliqua sunt veniam elit.",
"description": "Duis do est Lorem ex veniam."
},
{
"day": 7,
"challName": "Labore velit consequat quis irure officia ad qui sint deserunt ea dolore nostrud consequat aute.",
"challType": "CODE",
"chall": "Occaecat id magna ut incididunt consectetur sunt magna labore.",
"description": "Irure qui minim aliqua sunt esse consequat commodo nostrud consectetur."
},
{
"day": 8,
"challName": "Ullamco magna Lorem Lorem sit sunt.",
"challType": "MAP",
"chall": "Eiusmod voluptate aliqua duis duis sunt pariatur quis sint eiusmod adipisicing duis quis anim aute.",
"description": "Aliquip ad sunt do eu duis nulla deserunt."
},
{
"day": 9,
"challName": "Est aliquip in ut ex velit.",
"challType": "CODE",
"chall": "Labore magna occaecat consectetur reprehenderit nostrud aliqua nostrud occaecat occaecat aliquip cillum anim ullamco.",
"description": "Commodo ex adipisicing dolore aliqua adipisicing laboris duis ad irure mollit."
}
]