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