diff --git a/course-info.yaml b/course-info.yaml index e82ca05..ba47072 100644 --- a/course-info.yaml +++ b/course-info.yaml @@ -6,5 +6,6 @@ summary: |- programming_language: Kotlin content: - duckShopServer + - oldSchoolServer environment_settings: jvm_language_level: JDK_17 diff --git a/oldSchoolFrontend/package.json b/oldSchoolFrontend/package.json index 1924d4a..f3a8132 100644 --- a/oldSchoolFrontend/package.json +++ b/oldSchoolFrontend/package.json @@ -11,7 +11,7 @@ "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "axios": "^0.27.2", - "common-types": "file:common/build/libs/common-types", + "common-types": "file:/Users/anastasia.birillo/IdeaProjects/kotlin-onboarding-part3/common/build/dist", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "^2.1.3", diff --git a/oldSchoolServer/lesson-info.yaml b/oldSchoolServer/lesson-info.yaml index 46f09af..de9e8f6 100644 --- a/oldSchoolServer/lesson-info.yaml +++ b/oldSchoolServer/lesson-info.yaml @@ -1,5 +1,6 @@ type: framework custom_name: Old school content: -- oldSchoolServerIntroduction + - oldSchoolServerIntroduction + - oldSchoolServerFinishGame is_template_based: false diff --git a/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/OldSchoolApplication.kt b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/OldSchoolApplication.kt new file mode 100644 index 0000000..9ec289b --- /dev/null +++ b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/OldSchoolApplication.kt @@ -0,0 +1,13 @@ +package org.jetbrains.kotlin.course.old.school + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class OldSchoolApplication + +@Suppress("SpreadOperator") +fun main(args: Array) { + runApplication(*args) +} + diff --git a/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsResource.kt b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsResource.kt new file mode 100644 index 0000000..6d11935 --- /dev/null +++ b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsResource.kt @@ -0,0 +1,36 @@ +package org.jetbrains.kotlin.course.old.school.functions + +import org.springframework.web.bind.annotation.* + +// We can not use a typealias here because the Spring framework can not parse it +class Characters : ArrayList() +class Body ( + val names: Characters, + val color: String +) + +@RestController +@RequestMapping("/api/functions/") +class GameFunctionsResource(val service: GameFunctionsService) { + @CrossOrigin + @GetMapping("/colors") + fun getAllPossibleColors(): List = service.getAllPossibleColors() + + @CrossOrigin + @PostMapping("/find") + fun findPhoto(@RequestBody body: Body): String? = with(service) { + body.names.findPhoto(body.color)?.name?.lowercase() + } + + @CrossOrigin + @PostMapping("/groupByByColor") + fun groupByPhotosByColor(@RequestBody names: List): List = with(service) { + names.groupPhotosByColor().map { it.name } + } + + @CrossOrigin + @PostMapping("/groupByPhotosByHairAndHat") + fun groupByPhotosByHairAndHat(@RequestBody names: List): List = with(service) { + names.groupPhotosByHairAndHat().map { it.name } + } +} diff --git a/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsService.kt b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsService.kt new file mode 100644 index 0000000..c1ccbbe --- /dev/null +++ b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsService.kt @@ -0,0 +1,32 @@ +package org.jetbrains.kotlin.course.old.school.functions + +import org.jetbrains.kotlin.course.old.school.photo.Accessory +import org.jetbrains.kotlin.course.old.school.photo.Color +import org.jetbrains.kotlin.course.old.school.photo.PhotoCharacter +import org.springframework.stereotype.Service + +@Service +class GameFunctionsService { + fun getAllPossibleColors() = Color.entries.map { it.name.lowercase() } + + private fun String.toColor() = Color.valueOf(replaceFirstChar { it.titlecase() }) + + private fun Iterable.toPhotoCharacters() = + map { name -> PhotoCharacter.valueOf(name.replaceFirstChar { it.titlecase() }) } + + fun Iterable.findPhoto(colorStr: String): PhotoCharacter? { + val color = colorStr.toColor() + return toPhotoCharacters().find { it.backgroundColor == color } + } + + fun Iterable.groupPhotosByColor() = toPhotoCharacters() + .groupBy { it.backgroundColor }.map { it.value }.flatten() + + fun Iterable.groupPhotosByHairAndHat() = toPhotoCharacters() + .groupBy { it.hairType } + .mapValues { it.value.groupBy { character -> + character.accessories?.contains(Accessory.Hat) ?: false + } + }.values.flatMap { it.values } + .flatten() +} diff --git a/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeResource.kt b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeResource.kt new file mode 100644 index 0000000..d4e6bee --- /dev/null +++ b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeResource.kt @@ -0,0 +1,23 @@ +package org.jetbrains.kotlin.course.old.school.mode + +import old.school.JsPhoto +import org.springframework.web.bind.annotation.CrossOrigin +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/api/mode/") +class CardResource(val service: GameModeService) { + @CrossOrigin + @GetMapping("/list") + fun generateListOfCharacters(): List = service.generateListOfCharacters().map { JsPhoto(it.name) } + + @CrossOrigin + @GetMapping("/set") + fun generateSetOfCharacters(): List = service.generateSetOfCharacters().map { JsPhoto(it.name) } + + @CrossOrigin + @GetMapping("/map") + fun generateMapOfCharacters(): List = service.generateMapOfCharacters().map { JsPhoto(it.key.name, it.value) } +} diff --git a/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeService.kt b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeService.kt new file mode 100644 index 0000000..25e4fea --- /dev/null +++ b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeService.kt @@ -0,0 +1,21 @@ +package org.jetbrains.kotlin.course.old.school.mode + +import org.jetbrains.kotlin.course.old.school.photo.PhotoCharacter +import org.springframework.stereotype.Service + +@Service +class GameModeService { + companion object { + const val MAX_NUMBER_OF_PHOTOS = 12 + } + private fun generateRandomCharacter() = PhotoCharacter.entries.random() + + fun generateListOfCharacters() = List(MAX_NUMBER_OF_PHOTOS) { generateRandomCharacter() } + + // It is better to move common code into a separated function + private fun getRandomCharacters() = PhotoCharacter.entries.shuffled().take(MAX_NUMBER_OF_PHOTOS) + + fun generateSetOfCharacters() = getRandomCharacters().toSet() + + fun generateMapOfCharacters() = getRandomCharacters().associateWith { it.name } +} diff --git a/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/photo/PhotoCharacter.kt b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/photo/PhotoCharacter.kt new file mode 100644 index 0000000..c352166 --- /dev/null +++ b/oldSchoolServer/oldSchoolServerFinishGame/src/main/kotlin/org/jetbrains/kotlin/course/old/school/photo/PhotoCharacter.kt @@ -0,0 +1,55 @@ +package org.jetbrains.kotlin.course.old.school.photo + +enum class PhotoCharacter( + val backgroundColor: Color, + val hairType: HairType, + val accessories: List? = null +) { + Olivia(Color.Purple, HairType.Dark), + Emily(Color.White, HairType.Dark, listOf(Accessory.Earrings, Accessory.Watch)), + Emma(Color.Yellow, HairType.Light), + Charlotte(Color.Pink, HairType.Dark, listOf(Accessory.Earrings, Accessory.Watch)), + Diana(Color.Orange, HairType.Light, listOf(Accessory.Earrings, Accessory.Watch)), + Alice(Color.Green, HairType.Light), + Helena(Color.Green, HairType.Light, listOf(Accessory.Pen)), + Evie(Color.Purple, HairType.Light, listOf(Accessory.Pen)), + + Henry(Color.Pink, HairType.Dark, listOf(Accessory.Glasses)), + Daniel(Color.Purple, HairType.Dark, listOf(Accessory.Hat)), + Noah(Color.Blue, HairType.Dark, listOf(Accessory.Glasses, Accessory.Hat)), + David(Color.Gray, HairType.Dark, listOf(Accessory.Glasses, Accessory.Hat)), + Leo(Color.Purple, HairType.Dark, listOf(Accessory.Glasses, Accessory.Hat)), + Jamie(Color.Gray, HairType.Light, listOf(Accessory.Glasses)), + Larry(Color.Orange, HairType.Light, listOf(Accessory.Glasses)), + Thomas(Color.White, HairType.Light, listOf(Accessory.Hat)), + Oliver(Color.Blue, HairType.Light, listOf(Accessory.Hat)), + Edward(Color.White, HairType.Dark, listOf(Accessory.Glasses, Accessory.Hat)) + ; +} + +enum class HairType { + Dark, + Light + ; +} + +enum class Color { + White, + Blue, + Orange, + Yellow, + Pink, + Purple, + Green, + Gray + ; +} + +enum class Accessory { + Glasses, + Earrings, + Watch, + Pen, + Hat + ; +} diff --git a/oldSchoolServer/oldSchoolServerFinishGame/task-info.yaml b/oldSchoolServer/oldSchoolServerFinishGame/task-info.yaml new file mode 100644 index 0000000..f016237 --- /dev/null +++ b/oldSchoolServer/oldSchoolServerFinishGame/task-info.yaml @@ -0,0 +1,28 @@ +type: edu +files: +- name: test/Tests.kt + visible: false +- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/OldSchoolApplication.kt + visible: true +- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/photo/PhotoCharacter.kt + visible: true +- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeService.kt + visible: true +- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeResource.kt + visible: true +- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsService.kt + visible: true +- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsResource.kt + visible: true +- name: test/HairTypeTestClass.kt + visible: false +- name: test/ColorTestClass.kt + visible: false +- name: test/AccessoryTestClass.kt + visible: false +- name: test/GameModeServiceTestClass.kt + visible: false +- name: test/PhotoCharacterTestClass.kt + visible: false +- name: test/GameFunctionsServiceTestClass.kt + visible: false diff --git a/oldSchoolServer/oldSchoolServerFinishGame/task.md b/oldSchoolServer/oldSchoolServerFinishGame/task.md new file mode 100644 index 0000000..91b0370 --- /dev/null +++ b/oldSchoolServer/oldSchoolServerFinishGame/task.md @@ -0,0 +1,10 @@ +Tasks: + ++ Add enum class: HairType, Color, Accessory ++ Implement generateRandomCharacter + generateListOfCharacters ++ Implement generateSetOfCharacters ++ Implement generateMapOfCharacters ++ Implement getAllPossibleColors ++ Implement toColor, toPhotoCharacters, findPhoto ++ Implement groupPhotosByColor ++ Implement groupPhotosByHairAndHat \ No newline at end of file diff --git a/oldSchoolServer/oldSchoolServerIntroduction/test/AccessoryTestClass.kt b/oldSchoolServer/oldSchoolServerFinishGame/test/AccessoryTestClass.kt similarity index 100% rename from oldSchoolServer/oldSchoolServerIntroduction/test/AccessoryTestClass.kt rename to oldSchoolServer/oldSchoolServerFinishGame/test/AccessoryTestClass.kt diff --git a/oldSchoolServer/oldSchoolServerIntroduction/test/ColorTestClass.kt b/oldSchoolServer/oldSchoolServerFinishGame/test/ColorTestClass.kt similarity index 100% rename from oldSchoolServer/oldSchoolServerIntroduction/test/ColorTestClass.kt rename to oldSchoolServer/oldSchoolServerFinishGame/test/ColorTestClass.kt diff --git a/oldSchoolServer/oldSchoolServerIntroduction/test/GameFunctionsServiceTestClass.kt b/oldSchoolServer/oldSchoolServerFinishGame/test/GameFunctionsServiceTestClass.kt similarity index 100% rename from oldSchoolServer/oldSchoolServerIntroduction/test/GameFunctionsServiceTestClass.kt rename to oldSchoolServer/oldSchoolServerFinishGame/test/GameFunctionsServiceTestClass.kt diff --git a/oldSchoolServer/oldSchoolServerIntroduction/test/GameModeServiceTestClass.kt b/oldSchoolServer/oldSchoolServerFinishGame/test/GameModeServiceTestClass.kt similarity index 100% rename from oldSchoolServer/oldSchoolServerIntroduction/test/GameModeServiceTestClass.kt rename to oldSchoolServer/oldSchoolServerFinishGame/test/GameModeServiceTestClass.kt diff --git a/oldSchoolServer/oldSchoolServerIntroduction/test/HairTypeTestClass.kt b/oldSchoolServer/oldSchoolServerFinishGame/test/HairTypeTestClass.kt similarity index 100% rename from oldSchoolServer/oldSchoolServerIntroduction/test/HairTypeTestClass.kt rename to oldSchoolServer/oldSchoolServerFinishGame/test/HairTypeTestClass.kt diff --git a/oldSchoolServer/oldSchoolServerIntroduction/test/PhotoCharacterTestClass.kt b/oldSchoolServer/oldSchoolServerFinishGame/test/PhotoCharacterTestClass.kt similarity index 100% rename from oldSchoolServer/oldSchoolServerIntroduction/test/PhotoCharacterTestClass.kt rename to oldSchoolServer/oldSchoolServerFinishGame/test/PhotoCharacterTestClass.kt diff --git a/oldSchoolServer/oldSchoolServerIntroduction/test/Tests.kt b/oldSchoolServer/oldSchoolServerFinishGame/test/Tests.kt similarity index 100% rename from oldSchoolServer/oldSchoolServerIntroduction/test/Tests.kt rename to oldSchoolServer/oldSchoolServerFinishGame/test/Tests.kt diff --git a/oldSchoolServer/oldSchoolServerIntroduction/src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsService.kt b/oldSchoolServer/oldSchoolServerIntroduction/src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsService.kt index d14504b..c1ccbbe 100644 --- a/oldSchoolServer/oldSchoolServerIntroduction/src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsService.kt +++ b/oldSchoolServer/oldSchoolServerIntroduction/src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsService.kt @@ -7,7 +7,7 @@ import org.springframework.stereotype.Service @Service class GameFunctionsService { - fun getAllPossibleColors() = Color.values().map { it.name.lowercase() } + fun getAllPossibleColors() = Color.entries.map { it.name.lowercase() } private fun String.toColor() = Color.valueOf(replaceFirstChar { it.titlecase() }) diff --git a/oldSchoolServer/oldSchoolServerIntroduction/src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeService.kt b/oldSchoolServer/oldSchoolServerIntroduction/src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeService.kt index a83239b..25e4fea 100644 --- a/oldSchoolServer/oldSchoolServerIntroduction/src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeService.kt +++ b/oldSchoolServer/oldSchoolServerIntroduction/src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeService.kt @@ -8,24 +8,14 @@ class GameModeService { companion object { const val MAX_NUMBER_OF_PHOTOS = 12 } - private fun generateRandomCharacter() = PhotoCharacter.values().random() + private fun generateRandomCharacter() = PhotoCharacter.entries.random() fun generateListOfCharacters() = List(MAX_NUMBER_OF_PHOTOS) { generateRandomCharacter() } - fun generateSetOfCharacters(): Set { - val characters = mutableSetOf() - do { - characters.add(generateRandomCharacter()) - } while (characters.size < MAX_NUMBER_OF_PHOTOS) - return characters - } + // It is better to move common code into a separated function + private fun getRandomCharacters() = PhotoCharacter.entries.shuffled().take(MAX_NUMBER_OF_PHOTOS) - fun generateMapOfCharacters(): Map { - val characters = mutableMapOf() - do { - val character = generateRandomCharacter() - characters.putIfAbsent(character, character.name) - } while (characters.size < MAX_NUMBER_OF_PHOTOS) - return characters - } + fun generateSetOfCharacters() = getRandomCharacters().toSet() + + fun generateMapOfCharacters() = getRandomCharacters().associateWith { it.name } } diff --git a/oldSchoolServer/oldSchoolServerIntroduction/task-info.yaml b/oldSchoolServer/oldSchoolServerIntroduction/task-info.yaml index f016237..0d8c75a 100644 --- a/oldSchoolServer/oldSchoolServerIntroduction/task-info.yaml +++ b/oldSchoolServer/oldSchoolServerIntroduction/task-info.yaml @@ -1,28 +1,15 @@ -type: edu +type: theory +custom_name: Old School - Introduction files: -- name: test/Tests.kt - visible: false -- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/OldSchoolApplication.kt - visible: true -- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/photo/PhotoCharacter.kt - visible: true -- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeService.kt - visible: true -- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeResource.kt - visible: true -- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsService.kt - visible: true -- name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsResource.kt - visible: true -- name: test/HairTypeTestClass.kt - visible: false -- name: test/ColorTestClass.kt - visible: false -- name: test/AccessoryTestClass.kt - visible: false -- name: test/GameModeServiceTestClass.kt - visible: false -- name: test/PhotoCharacterTestClass.kt - visible: false -- name: test/GameFunctionsServiceTestClass.kt - visible: false + - name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/OldSchoolApplication.kt + visible: true + - name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/photo/PhotoCharacter.kt + visible: true + - name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeService.kt + visible: true + - name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/mode/GameModeResource.kt + visible: true + - name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsService.kt + visible: true + - name: src/main/kotlin/org/jetbrains/kotlin/course/old/school/functions/GameFunctionsResource.kt + visible: true diff --git a/oldSchoolServer/oldSchoolServerIntroduction/task.md b/oldSchoolServer/oldSchoolServerIntroduction/task.md index 91b0370..e69de29 100644 --- a/oldSchoolServer/oldSchoolServerIntroduction/task.md +++ b/oldSchoolServer/oldSchoolServerIntroduction/task.md @@ -1,10 +0,0 @@ -Tasks: - -+ Add enum class: HairType, Color, Accessory -+ Implement generateRandomCharacter + generateListOfCharacters -+ Implement generateSetOfCharacters -+ Implement generateMapOfCharacters -+ Implement getAllPossibleColors -+ Implement toColor, toPhotoCharacters, findPhoto -+ Implement groupPhotosByColor -+ Implement groupPhotosByHairAndHat \ No newline at end of file