Skip to content

Commit

Permalink
v0.2.0
Browse files Browse the repository at this point in the history
- ์ƒˆ๋กœ๊ณ ์นจ ๋ ˆ์ด์•„์›ƒ ์ถ”๊ฐ€
- ๊ฐ€๊ฒฉ ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„
- ์ƒ์„ธํŽ˜์ด์ง€ ํŠธ๋ž˜ํ‚น ๋ชฉ๋ก์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- ์„œ๋ธŒ๋ชจ๋“ˆ ์—ฐ๊ฒฐ
- ์ฐจํŠธ ui ์ถ”๊ฐ€
- Ping API ๊ตฌํ˜„
- Logger ๋ฏธ๋“ค์›จ์–ด ์ถ”๊ฐ€
- ์ตœ์‹  refreshToken ๋ฌดํšจํ™”
- MongoDB ์—ฐ๋™
- ์ƒํ’ˆ ์ •๋ณด Cache, ๊ธฐ๊ฐ„๋ณ„ ์ƒํ’ˆ ๊ฐ€๊ฒฉ ๋ณ€๋™ ์กฐํšŒ
- ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒํ’ˆ ์กฐํšŒ, DB์— ์ตœ์‹  ์ •๋ณด ๋ฐ˜์˜
- ์ƒํ’ˆ ์ธ๊ธฐ ์ˆœ์œ„ ์„ž์ด๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •
- ์ƒํ’ˆ ๋ชฉ๋ก API ์‘๋‹ต ๋‚ด์šฉ ์ˆ˜์ •
- MongoDB Schema ์ˆ˜์ •
- ์ถ”์ฒœ/์ถ”์  ์ƒํ’ˆ ๋ชฉ๋ก ์กฐํšŒ API์—์„œ ๊ฐ€๊ฒฉ ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ ๋ฐ ์ตœ์‹  ๊ฐ€๊ฒฉ ์ •๋ณด ๋™๊ธฐํ™”

์ฐจํŠธ ๋ ˆํฌ ์ฃผ์†Œ : https://github.com/Taewan-P/material-android-chart

Co-Authored-By: EunhoKang <[email protected]>
Co-Authored-By: ootr47 <[email protected]>
Co-Authored-By: ์†๋ฌธ๊ธฐ <[email protected]>
Co-Authored-By: ByeongIk Choi <[email protected]>
Co-Authored-By: EunhoKang <[email protected]>
Co-Authored-By: ootr47 <[email protected]>
Co-Authored-By: ์†๋ฌธ๊ธฐ <[email protected]>
Co-Authored-By: ByeongIk Choi <[email protected]>
  • Loading branch information
5 people committed Nov 30, 2023
1 parent 0e32b7c commit fda3a6d
Show file tree
Hide file tree
Showing 80 changed files with 2,074 additions and 945 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/firebase-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: Setup JDK
uses: actions/setup-java@v3
with:
Expand Down
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[submodule "android/materialchart"]
path = android/materialchart
url = https://github.com/Taewan-P/material-android-chart
branch = release
1 change: 1 addition & 0 deletions android/.idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 9 additions & 1 deletion android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ android {
targetSdk = 34
versionCode = 2
versionName = "0.1.1"
versionCode = 3
versionName = "0.2.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down Expand Up @@ -67,7 +69,7 @@ dependencies {
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.10.0")
implementation("androidx.activity:activity-ktx:1.8.0")
implementation("androidx.activity:activity-ktx:1.8.1")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.navigation:navigation-fragment-ktx:2.7.5")
implementation("androidx.navigation:navigation-ui-ktx:2.7.5")
Expand Down Expand Up @@ -100,6 +102,12 @@ dependencies {

// Glide
implementation("com.github.bumptech.glide:glide:4.16.0")

// Pull to Refresh
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")

// Material chart
implementation(project(":materialchart"))
}

kapt {
Expand Down
10 changes: 10 additions & 0 deletions android/app/src/main/java/app/priceguard/data/dto/PriceDataDTO.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package app.priceguard.data.dto

import kotlinx.serialization.Serializable

@Serializable
data class PriceDataDTO(
val time: Float? = null,
val price: Int? = null,
val isSoldOut: Boolean? = null
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package app.priceguard.data.dto

import kotlinx.serialization.Serializable

@Serializable
data class PricePatchRequest(
val productCode: String,
val targetPrice: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package app.priceguard.data.dto

import kotlinx.serialization.Serializable

@Serializable
data class PricePatchResponse(
val statusCode: Int,
val message: String
)
18 changes: 10 additions & 8 deletions android/app/src/main/java/app/priceguard/data/dto/ProductDTO.kt
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
package app.priceguard.data.dto

import app.priceguard.data.graph.ProductChartData
import kotlinx.serialization.Serializable

@Serializable
data class ProductDTO(
val productName: String?,
val productCode: String?,
val shop: String?,
val shopUrl: String?,
val imageUrl: String?,
val targetPrice: Int?,
val price: Int?
val productName: String? = null,
val productCode: String? = null,
val shop: String? = null,
val imageUrl: String? = null,
val targetPrice: Int? = null,
val price: Int? = null,
val priceData: List<PriceDataDTO>? = null
)

data class ProductData(
Expand All @@ -19,5 +20,6 @@ data class ProductData(
val shop: String,
val imageUrl: String,
val targetPrice: Int,
val price: Int
val price: Int,
val priceData: List<ProductChartData>
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,3 @@ data class ProductDeleteResponse(
val statusCode: Int,
val message: String
)

enum class ProductDeleteState {
SUCCESS,
NOT_FOUND,
INVALID_REQUEST,
UNAUTHORIZED,
UNDEFINED_ERROR
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package app.priceguard.data.dto

enum class ProductErrorState {
PERMISSION_DENIED,
INVALID_REQUEST,
NOT_FOUND,
EXIST,
UNDEFINED_ERROR
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,5 @@ import kotlinx.serialization.Serializable
data class ProductListResponse(
val statusCode: Int,
val message: String,
val trackingList: List<ProductDTO>?
val trackingList: List<ProductDTO>? = null
)

data class ProductListResult(
val productListState: ProductListState,
val trackingList: List<ProductData>
)

enum class ProductListState {
SUCCESS,
PERMISSION_DENIED,
NOT_FOUND,
UNDEFINED_ERROR
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package app.priceguard.data.dto

import app.priceguard.data.graph.ProductChartData
import kotlinx.serialization.Serializable

@Serializable
Expand All @@ -14,25 +15,19 @@ data class ProductResponse(
val shopUrl: String? = null,
val targetPrice: Int? = null,
val lowestPrice: Int? = null,
val price: Int? = null
val price: Int? = null,
val priceData: List<PriceDataDTO>? = null
)

data class ProductDetailResult(
val state: ProductDetailState,
val productName: String? = null,
val productCode: String? = null,
val shop: String? = null,
val imageUrl: String? = null,
val rank: Int? = null,
val shopUrl: String? = null,
val targetPrice: Int? = null,
val lowestPrice: Int? = null,
val price: Int? = null
val productName: String,
val productCode: String,
val shop: String,
val imageUrl: String,
val rank: Int,
val shopUrl: String,
val targetPrice: Int,
val lowestPrice: Int,
val price: Int,
val priceData: List<ProductChartData>
)

enum class ProductDetailState {
SUCCESS,
PERMISSION_DENIED,
NOT_FOUND,
UNDEFINED_ERROR
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import kotlinx.serialization.Serializable

@Serializable
data class ProductVerifyDTO(
val productName: String?,
val productCode: String?,
val productPrice: Int?,
val shop: String?,
val imageUrl: String?
val productName: String? = null,
val productCode: String? = null,
val productPrice: Int? = null,
val shop: String? = null,
val imageUrl: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import kotlinx.serialization.Serializable
data class ProductVerifyResponse(
val statusCode: Int,
val message: String,
val productName: String?,
val productCode: String?,
val productPrice: Int?,
val shop: String?,
val imageUrl: String?
val productName: String? = null,
val productCode: String? = null,
val productPrice: Int? = null,
val shop: String? = null,
val imageUrl: String? = null
)
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package app.priceguard.data.dto

import app.priceguard.data.graph.ProductChartData
import kotlinx.serialization.Serializable

@Serializable
data class RecommendProductDTO(
val productName: String?,
val productCode: String?,
val shop: String?,
val imageUrl: String?,
val price: Int?,
val rank: Int?
val productName: String? = null,
val productCode: String? = null,
val shop: String? = null,
val imageUrl: String? = null,
val price: Int? = null,
val rank: Int? = null,
val priceData: List<PriceDataDTO>? = null
)

data class RecommendProductData(
Expand All @@ -18,5 +20,6 @@ data class RecommendProductData(
val shop: String,
val imageUrl: String,
val price: Int,
val rank: Int
val rank: Int,
val priceData: List<ProductChartData>
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,5 @@ import kotlinx.serialization.Serializable
data class RecommendProductResponse(
val statusCode: Int,
val message: String,
val recommendList: List<RecommendProductDTO>?
val recommendList: List<RecommendProductDTO>? = null
)

data class RecommendProductResult(
val productListState: RecommendProductState,
val recommendList: List<RecommendProductData>
)

enum class RecommendProductState {
SUCCESS,
WRONG_REQUEST,
PERMISSION_DENIED,
NOT_FOUND,
UNDEFINED_ERROR
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package app.priceguard.data.graph

import app.priceguard.data.dto.PriceDataDTO

class GraphDataConverter {

// TODO: ๊ธฐ๊ฐ„๋ณ„๋กœ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง์„ ํ†ตํ•ด ํ•ด๋‹น ๊ธฐ๊ฐ„์— ๋ฐœ์ƒํ•œ ๊ฐ€๊ฒฉ ๋ณ€๋™๋งŒ ์ถ”์ ํ•˜๋„๋ก ๊ตฌ์กฐ ๋ณ€๊ฒฝ.
fun toDataset(priceData: List<PriceDataDTO>?): List<ProductChartData> {
priceData ?: return listOf()
if (priceData.isEmpty()) {
return listOf()
}
val dataList = mutableListOf<ProductChartData>()
priceData.forEach { dto ->
dto.time ?: return@forEach
dto.price ?: return@forEach
dto.isSoldOut ?: return@forEach
dataList.add(ProductChartData(dto.time / 1000, dto.price.toFloat(), dto.isSoldOut.not()))
}
val currentTime = (System.currentTimeMillis() / 1000).toFloat()
dataList.add(ProductChartData(currentTime, dataList.last().y, dataList.last().valid))
return dataList.toList().sortedBy { it.x }.filter { it.x <= currentTime }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package app.priceguard.data.graph

import app.priceguard.materialchart.data.ChartData

data class ProductChartData(
override val x: Float,
override val y: Float,
override val valid: Boolean
) : ChartData
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package app.priceguard.data.graph

import app.priceguard.materialchart.data.ChartData
import app.priceguard.materialchart.data.ChartDataset
import app.priceguard.materialchart.data.GraphMode
import app.priceguard.materialchart.data.GridLine

data class ProductChartDataset(
override val showXAxis: Boolean,
override val showYAxis: Boolean,
override val isInteractive: Boolean,
override val graphMode: GraphMode,
override val data: List<ChartData>,
override val gridLines: List<GridLine>
) : ChartDataset
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package app.priceguard.data.graph

import app.priceguard.materialchart.data.GridLine

data class ProductChartGridLine(
override val name: String,
override val value: Float
) : GridLine
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package app.priceguard.data.network

import app.priceguard.data.dto.PricePatchRequest
import app.priceguard.data.dto.PricePatchResponse
import app.priceguard.data.dto.ProductAddRequest
import app.priceguard.data.dto.ProductAddResponse
import app.priceguard.data.dto.ProductDeleteResponse
Expand Down Expand Up @@ -46,6 +48,6 @@ interface ProductAPI {

@PATCH("targetPrice")
suspend fun updateTargetPrice(
@Body productAddRequest: ProductAddRequest
): Response<ProductResponse>
@Body pricePatchRequest: PricePatchRequest
): Response<PricePatchResponse>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package app.priceguard.data.network

import app.priceguard.data.dto.ProductErrorState

sealed class ProductRepositoryResult<out T> {

data class Success<out T>(val data: T) : ProductRepositoryResult<T>()

data class Error(val productErrorState: ProductErrorState) : ProductRepositoryResult<Nothing>()
}
Loading

0 comments on commit fda3a6d

Please sign in to comment.