반응형

게시글 삭제 메커니즘 변경

기존의 게시글 삭제 메커니즘은 단순 테스트용도로 구현을 해놓았다. 기기 고유 식별자를 통해 내가 쓴 게시글인지 파악하고 내가 쓴 게시글이 맞다면 좌측상단에 x모양의 버튼이 생기고 그것을 누르면 게시글이 삭제되는 식이었다. 만약 내가 쓴 게시글이 아니라면 버튼이 생기지 않았다. 이렇게 버튼이 특정한 상황에 생성되고 사라지고(보이고 안보이고) 하는 기능은 XML파일에서 미리 생성해두고 visibility를 invisible 혹은 gone으로 해놓은 뒤 소스 코드에서 조건을 달성하면 visibility를 true 바꾸어주는 식으로 구현해놓았다.

삭제버튼이 눌리면 작동하는 코드는 아래와 같다.

// 작성기기 아이디, 컨텐츠 내용, 작성날짜가 같은 것을 찾아서 삭제
    fun deletePost(){
        arguments?.getString("postPath")?.let {
            // 작성기기 아이디, 컨텐츠 내용, 작성날짜가 같은 것을 찾아서 삭제
            storeDb.collection("${it}")?.whereEqualTo("id",context?.getDeviceUuid())
                ?.whereEqualTo("content",arguments?.getBundle("detail")?.getString("contentKey")?.let { it })
                ?.whereEqualTo("date", arguments?.getBundle("detail")?.getString("dateKey")?.let { it })
                ?.whereEqualTo("title", arguments?.getBundle("detail")?.getString("titleKey")?.let { it })
                .addSnapshotListener{ documents, e ->
                    documents?.forEach { document ->
                        var del = document.id
                        storeDb.collection("${it}").document("$del").delete()
                        Toast.makeText(context, "게시글이 삭제되었습니다.", Toast.LENGTH_SHORT).show()
                        // 게시글 삭제
                    }
                }
            // 현재 엑티비티 종료
            activity?.finish()
        }
    }

레이아웃 visibility에서 invisible과 gone의 차이

invisible과 gone은 미세한 차이가 있다. 둘다 그 레이아웃은 보여주지 않게 하지만

invisible은 레이아웃의 위치 정보들은 유지된 채로 그 레이아웃만 가리고 gone은 아예 위치까지도 없애버리기 때문에

constraint 레이아웃을 사용하고 제약을 걸어둔 상태에서 visibility를 gone으로 둔다면 레이아웃이 뒤틀릴 수 있다.

 

<Button
        android:visibility="gone"
	 	<-이하 생략->
                        	/>

XML에서는 위에 작성한 것 처럼 visibility를 gone 혹은 invisible로 해놓고

binding.btnDelete.isVisible = true

특정한 조건을 만족시키면 소스 코드에서 위와같이 바인딩으로 접근하여 isVisible을 true로 해주었다.

 

이렇게 간단한 방식으로 구현을 했었지만 이번에 신고 기능을 추가하면서 액션바의 메뉴 레이아웃을 건드려보게 되었다.

 매번 Empty Activity로만 연습을 하다보니 menu라는 부분이 존재하는 줄도 모르고 혼자 layout안에서 menu를 구현해보겠다고 끙끙 거렸었다...

 

바뀐 삭제 매커니즘

위에서 볼 수 있는 것 처럼

내가 쓴 글은 액션바에서 우측상단에 있는 메뉴 버튼을 눌렀을 때 삭제하기 , 신고하기 두가지 아이템이 있어 삭제하기, 신고하기 기능을 이용할 수 있지만

내가 쓴 글이 아니라면 메뉴 버튼을 눌렀을 때 신고하기 버튼만 존재하여 신고하기 기능만 이용할 수 있다.

버그 발생

위의 움짤을 보면 게시글이 삭제된 뒤 자동적으로 내가 쓴 글 목록만 불러오게 되는 모습을 볼 수 있다. 심지어 탭 레이아웃의 값도 제대로 지정이 되지 않았다. 수정을 해보겠다.

2022.03.16 - [프로젝트들[Projects]/위로[GoUp]] - [위로] 버그 수정(프레그먼트 생명 주기 관련)

수정완료..!! onResume()부분에서 탭레이아웃의 눌려져있는 부분을 확인해서 맞는 데이터를 호출하도록 하였다.

 

신고 하기

사실 신고하기도 삭제와 거의 유사하다.

삭제는 내가 쓴 포스트일 경우, 게시자의 디바이스 고유식별자, 게시글 내용 등 모두 일치할 때 데이터에 접근하여 삭제가 가능하도록 하였고, 신고기능은 단순히 게시물을 신고하면 게시글의 정보와 신고자의 정보를 따로 레포트 데이터베이스에 전송하도록 하였다. 

내가 레포트 데이터 베이스를 확인하고 신고받은 게시물과, 이 게시물 작성자, 신고자의 정보를 받고 허위 신고인지, 제대로된 신고인지 확인 후 게시글을 삭제하거나 이용제한을 할 수 있도록.

단순히 요런식이다.

신고하기 기능을 구현한 코드는 아래와 같다.

// 게시글 신고하기
    fun reportPost(){
        // 게시글을 신고하면 신고자의 디바이스 번호, 신고된 게시글의 아이디를 찾아서 reportPosts로 보냄
        // 거기에서 내가 신고된 게시물의 문서 키값을 보고 서버에서 찾아서 삭제할 것임.
        // 만약 허위 신고면 디바이스 번호 식별해서 경고 조치
        arguments?.getString("postPath")?.let {
            storeDb.collection("${it}")
                ?.whereEqualTo("content",arguments?.getBundle("detail")?.getString("contentKey")?.let { it })
                ?.whereEqualTo("date", arguments?.getBundle("detail")?.getString("dateKey")?.let { it })
                ?.whereEqualTo("title", arguments?.getBundle("detail")?.getString("titleKey")?.let { it })
                .addSnapshotListener{ documents, e ->
                    documents?.forEach { document ->
                        // 신고한 유저의 기기 고유 식별자
                        val reportUserId = context?.getDeviceUuid().toString()
                        // 신고당한 문서의 키값(문서아이디)
                        val reportedPostId = document.id
                        // 신고당한 유저의 기기 고유 식별자
                        val reportedUserId = document.get("id").toString()
                        // 신고당한 문서의 제목
                        val reportedPostTitle = document.get("title").toString()
                        // 신고당한 문서의 내용
                        val reportedPostContent = document.get("content").toString()
                        // 신고당한 문서의 날짜
                        val reportedPostDate = document.get("date").toString()
                        // 신고 정보를 리포트함.
                        val reportedPost = ReportedPost(reportUserId,reportedPostId,reportedUserId,reportedPostTitle,reportedPostContent,reportedPostDate)
                        Log.d("신고", "$reportedPost")
                        storeDb.collection("reportedPost")
                            .add(reportedPost)
                        Toast.makeText(context, "신고가 완료되었습니다.", Toast.LENGTH_SHORT).show()
                    }
                }
            // 현재 엑티비티 종료
            activity?.finish()
        }

    }
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기