Android/Study

[Android] 포스팅 업로드 구현 (4) - Repository

Tenacity_Dev 2024. 2. 28. 18:19
728x90

전체 코드

data class PostDto(
    val uuid: String = "",
    val writerUuid: String = "",
    val content: String = "",
    val imageUrl: String = "",
    val dateTime: Date = Date()
)
    @RequiresApi(Build.VERSION_CODES.O)
    suspend fun uploadPost(
        content: String,
        imageUri: Uri
    ): Result<Unit> {
        val currentUser = Firebase.auth.currentUser
        require(currentUser != null)
        val db = Firebase.firestore
        val storageRef = Firebase.storage.reference
        val postCollection = db.collection("posts")
        val imageFileName: String = UUID.randomUUID().toString() + ".png"
        val imageRef = storageRef.child(imageFileName)
        val postUuid = UUID.randomUUID().toString()

        try {
            imageRef.putFile(imageUri).await()
        } catch (e: Exception) {
            return Result.failure(e)
        }

        return try {
            val postDto = PostDto(
                uuid = postUuid,
                writerUuid = currentUser.uid,
                content = content,
                imageUrl = imageFileName,
                dateTime = Date()
            )
            postCollection.document(postUuid).set(postDto).await()
            Result.success(Unit)
        } catch (e: Exception) {
            Result.failure(e)
        }
    }
}

 

  1. @RequiresApi(Build.VERSION_CODES.O) 어노테이션:
    • Android API 레벨이 Oreo(26) 이상이 필요한 경우를 나타냅니다.
  2. suspend fun uploadPost(content: String, imageUri: Uri): Result<Unit>:
    • uploadPost 함수는 게시물 내용(content)과 이미지의 URI(imageUri)를 매개변수로 받습니다.
    • suspend 키워드는 코루틴 내에서 비동기 호출이 가능하도록 합니다.
    • Result<Unit>은 작업의 성공 또는 실패를 나타내는 Result 클래스를 반환하며, 성공 시 Unit 값을 갖습니다.
  3. Firebase 인증 및 Firestore 초기화:
    • Firebase.auth.currentUser를 사용하여 현재 사용자를 가져옵니다.
    • Firebase.firestore로 Firestore 데이터베이스에 대한 참조를 얻습니다.
  4. 이미지 저장소 및 컬렉션 설정:
    • Firebase.storage.reference를 사용하여 Firebase 스토리지에 대한 참조를 얻습니다.
    • db.collection("posts")로 "posts" 컬렉션에 대한 참조를 얻습니다.
  5. 이미지 업로드:
    • 이미지 파일 이름을 생성하고 해당 이름으로 스토리지 참조를 만듭니다.
    • imageRef.putFile(imageUri).await()를 사용하여 이미지를 비동기적으로 업로드합니다.
  6. 게시물 데이터베이스에 추가:
    • PostDto 클래스를 사용하여 게시물 데이터를 구성합니다.
    • postCollection.document(postUuid).set(postDto).await()를 사용하여 Firestore에 게시물을 추가합니다.
  7. 결과 반환:
    • 성공적으로 게시물을 업로드하면 Result.success(Unit)를 반환합니다.
    • 실패한 경우에는 Result.failure(e)를 반환하며, 예외 정보가 전달됩니다.
728x90