diff --git a/yls/src/main/kotlin/com/yourssu/logging/system/HashUtil.kt b/yls/src/main/kotlin/com/yourssu/logging/system/HashUtil.kt new file mode 100644 index 0000000..9eff744 --- /dev/null +++ b/yls/src/main/kotlin/com/yourssu/logging/system/HashUtil.kt @@ -0,0 +1,30 @@ +package com.yourssu.logging.system + +import java.lang.StringBuilder +import java.security.MessageDigest + +object HashUtil { + // 캐싱 + private var _id: String? = null + private var _hashedId: String? = null + + fun hashId(id: String): String { + if (_id == id && _hashedId != null) { + return _hashedId!! + } + + _hashedId = hashString(id) + _id = id + return _hashedId!! + } + + internal fun hashString(origin: String, algorithm: String = "SHA-256"): String { + return MessageDigest.getInstance(algorithm) + .digest(origin.toByteArray()) + .let { bytes -> + bytes.fold(StringBuilder(bytes.size * 2)) { str, it -> + str.append("%02x".format(it)) + } + }.toString() + } +} diff --git a/yls/src/main/kotlin/com/yourssu/logging/system/YLS.kt b/yls/src/main/kotlin/com/yourssu/logging/system/YLS.kt index bb2ec75..7ed8c61 100644 --- a/yls/src/main/kotlin/com/yourssu/logging/system/YLS.kt +++ b/yls/src/main/kotlin/com/yourssu/logging/system/YLS.kt @@ -2,19 +2,14 @@ package com.yourssu.logging.system import android.annotation.SuppressLint import android.content.Context -import android.os.Build.VERSION -import android.os.Build.VERSION_CODES import android.util.Log import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import androidx.work.workDataOf import com.google.gson.Gson +import com.yourssu.logging.system.HashUtil.hashId import com.yourssu.logging.system.worker.RemoteLoggingWorker -import java.lang.StringBuilder -import java.security.MessageDigest import java.text.SimpleDateFormat -import java.time.LocalDateTime -import java.time.ZoneOffset import java.util.Date class YLS private constructor() { @@ -33,6 +28,7 @@ class YLS private constructor() { } open fun flush() { + if (queue.isEmpty()) return log(queue) queue.clear() } @@ -70,16 +66,18 @@ class YLS private constructor() { fun init( platform: String, - user: String?, + user: String, logger: Logger, ) { this.defaultEvent = mapOf("platform" to platform) - this.userID = user ?: generateRandomId(10) + this.userID = user this.logger = logger } fun log(vararg events: Pair) { - if (!::logger.isInitialized) throw AssertionError("Not Initialized!") + if (!::logger.isInitialized) { + throw AssertionError("Not initialized! : YLS.init()을 먼저 호출해 주세요.") + } val eventData = YLSEventData( hashedID = hashId(userID), @@ -90,40 +88,19 @@ class YLS private constructor() { } fun flush() { + if (!::logger.isInitialized) { + throw AssertionError("Not initialized! : YLS.init()을 먼저 호출해 주세요.") + } logger.flush() } - internal fun generateRandomId(length: Int): String { + fun generateRandomId(length: Int): String { val charset = '!'..'~' // ASCII 33 ~ 126 return (1..length).map { charset.random() }.joinToString("") } - // hashId() 메서드에서만 사용되는 변수 - private var _id: String? = null - private var _hashedId: String? = null - - internal fun hashId(id: String): String { - if (_id == id && _hashedId != null) { - return _hashedId!! - } - return id.hashString().also { - _id = id - _hashedId = it - } - } - @SuppressLint("SimpleDateFormat") - internal fun getTimestampISO8601(): String = + fun getTimestampISO8601(): String = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(Date()) } } - -internal fun String.hashString(algorithm: String = "SHA-256"): String { - return MessageDigest.getInstance(algorithm) - .digest(this.toByteArray()) - .let { bytes -> - bytes.fold(StringBuilder(bytes.size * 2)) { str, it -> - str.append("%02x".format(it)) - } - }.toString() -} diff --git a/yls/src/main/kotlin/com/yourssu/logging/system/worker/RemoteLoggingWorker.kt b/yls/src/main/kotlin/com/yourssu/logging/system/worker/RemoteLoggingWorker.kt index ea81d87..b754972 100644 --- a/yls/src/main/kotlin/com/yourssu/logging/system/worker/RemoteLoggingWorker.kt +++ b/yls/src/main/kotlin/com/yourssu/logging/system/worker/RemoteLoggingWorker.kt @@ -4,7 +4,6 @@ import android.content.Context import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.google.gson.Gson -import com.yourssu.logging.system.HttpService import com.yourssu.logging.system.YLSEventData import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext diff --git a/yls/src/main/kotlin/com/yourssu/logging/system/Retrofit.kt b/yls/src/main/kotlin/com/yourssu/logging/system/worker/Retrofit.kt similarity index 72% rename from yls/src/main/kotlin/com/yourssu/logging/system/Retrofit.kt rename to yls/src/main/kotlin/com/yourssu/logging/system/worker/Retrofit.kt index 7463e88..5e20060 100644 --- a/yls/src/main/kotlin/com/yourssu/logging/system/Retrofit.kt +++ b/yls/src/main/kotlin/com/yourssu/logging/system/worker/Retrofit.kt @@ -1,5 +1,6 @@ -package com.yourssu.logging.system +package com.yourssu.logging.system.worker +import com.yourssu.logging.system.YLSEventData import retrofit2.Response import retrofit2.http.Body import retrofit2.http.PUT diff --git a/yls/src/test/kotlin/com/yourssu/logging/system/LoggingTest.kt b/yls/src/test/kotlin/com/yourssu/logging/system/LoggingTest.kt index fefc0bf..6fcc696 100644 --- a/yls/src/test/kotlin/com/yourssu/logging/system/LoggingTest.kt +++ b/yls/src/test/kotlin/com/yourssu/logging/system/LoggingTest.kt @@ -1,5 +1,7 @@ package com.yourssu.logging.system +import com.yourssu.logging.system.HashUtil.hashId +import com.yourssu.logging.system.HashUtil.hashString import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Before @@ -41,12 +43,15 @@ class LoggingTest { "screen" to "LoginScreen", ) - testLogger.lastEventData?.let { - assertEquals("abc".hashString(), it.hashedID) - assertEquals("android", it.event["platform"]) - assertEquals("ButtonClicked", it.event["event"]) - assertEquals("LoginScreen", it.event["screen"]) - } ?: assertTrue(false) // if null, then fail + val e = testLogger.lastEventData + if (e != null) { + assertEquals(hashString("abc"), e.hashedID) + assertEquals("android", e.event["platform"]) + assertEquals("ButtonClicked", e.event["event"]) + assertEquals("LoginScreen", e.event["screen"]) + } else { + assertTrue(false) // always fail + } } @Test @@ -74,6 +79,6 @@ class LoggingTest { // 함수 테스트 println(YLS.generateRandomId(10)) println(YLS.getTimestampISO8601()) - println(YLS.hashId("abc")) + println(hashId("abc")) } }