[PTF] Add post transaction flow networking#90
Conversation
There was a problem hiding this comment.
Pull request overview
This pull request adds networking functionality to the Post Transaction Flow (PTF) feature in the Resell Android app. It connects the previously implemented UI components (from PRs #83 and #86) with the backend API to enable users to submit transaction reviews and feedback after completing a purchase.
Changes:
- Added API services and repositories for transactions, transaction reviews, and feedback
- Implemented transaction completion checking in chat screens to display "Leave Review" banners when applicable
- Connected the transaction rating and feedback submission flows to the backend
Reviewed changes
Copilot reviewed 19 out of 19 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| app/src/main/java/com/cornellappdev/resell/android/model/api/TransactionApiService.kt | New API service for transaction-related endpoints |
| app/src/main/java/com/cornellappdev/resell/android/model/api/TransactionReviewApiService.kt | New API service for transaction review endpoints |
| app/src/main/java/com/cornellappdev/resell/android/model/api/FeedbackApiService.kt | New API service for feedback submission |
| app/src/main/java/com/cornellappdev/resell/android/model/ptf/PostTransactionRatingRepository.kt | Repository for transaction and review operations |
| app/src/main/java/com/cornellappdev/resell/android/model/ptf/FeedbackRepository.kt | Repository for feedback operations |
| app/src/main/java/com/cornellappdev/resell/android/viewmodel/main/PostTransactionRatingViewModel.kt | Added networking to load transaction data and submit reviews |
| app/src/main/java/com/cornellappdev/resell/android/viewmodel/main/ChatViewModel.kt | Added transaction completion check to show PTF banner |
| app/src/main/java/com/cornellappdev/resell/android/viewmodel/feedback/FeedbackDetailsViewModel.kt | Added networking for feedback submission |
| app/src/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt | Updated to use real transaction data from API |
| app/src/main/java/com/cornellappdev/resell/android/ui/screens/main/ChatScreen.kt | Added transaction state UI when transaction is completed |
| app/src/main/java/com/cornellappdev/resell/android/ui/components/chat/ChatTransactionState.kt | New component for displaying transaction state in chat |
| app/src/main/java/com/cornellappdev/resell/android/ui/components/chat/ChatMessageCluster.kt | Updated to handle transaction state messages |
| app/src/main/java/com/cornellappdev/resell/android/ui/components/chat/ResellChatScroll.kt | Added transaction state click handler |
| app/src/main/java/com/cornellappdev/resell/android/model/chats/ChatDocument.kt | Added transactionId field and TransactionInfo data class |
| app/src/main/java/com/cornellappdev/resell/android/model/Chat.kt | Added transactionInfo and transactionId fields to ChatMessageData |
| app/src/main/java/com/cornellappdev/resell/android/model/api/ChatRepository.kt | Updated to handle transactionId in chat messages |
| app/src/main/java/com/cornellappdev/resell/android/model/login/FireStoreRepository.kt | Updated to include transactionId when parsing Firestore messages |
| app/src/main/java/com/cornellappdev/resell/android/model/api/RetrofitInstance.kt | Added lazy initialization for new API services |
| app/src/main/res/drawable/ic_bag.xml | New icon for transaction state indicator |
Comments suppressed due to low confidence (6)
app/src/main/java/com/cornellappdev/resell/android/model/api/FeedbackApiService.kt:10
- Incorrect parameter name in searchFeedback endpoint. The function parameter is named
reportBodybut should be namedsearchBodyorfeedbackBodyto match the actual data type being used (SearchFeedback, not FeedbackBody). This is misleading and inconsistent with the naming in createFeedback where the parameter correctly matches the type.
suspend fun searchFeedback(@Body reportBody : SearchFeedback): SearchFeedback
app/src/main/java/com/cornellappdev/resell/android/viewmodel/main/ChatViewModel.kt:705
- Unusual spacing in safe call operator. There's a space between
?.on line 705, which should be?.without the space. This is inconsistent with standard Kotlin formatting conventions.
?. transactionId
app/src/main/java/com/cornellappdev/resell/android/viewmodel/main/PostTransactionRatingViewModel.kt:130
- Typo in log message: "subtmiting" should be "submitting"
Log.e("PostTransactionRatingViewModel", "Error subtmiting review.", e)
app/src/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt:133
- The elvis operator (?:) on line 133 is unnecessary since
dateis now non-nullable (changed fromDate?toDatein the function parameter). The?.letis also unnecessary. This should be simplified to justSimpleDateFormat("MMMM dd, yyyy", Locale.getDefault()).format(date).
val formattedDate = remember(date) {
date.let { SimpleDateFormat("MMMM dd, yyyy", Locale.getDefault()).format(it) } ?: "Month 00, 0000"
app/src/main/java/com/cornellappdev/resell/android/model/ptf/PostTransactionRatingRepository.kt:17
- The methods getTransactionDetails and getTransactionById are duplicates - they both call the same API endpoint and return the same data. The getTransactionDetails method (lines 15-17) is redundant and should be removed. Only getTransactionById should be kept.
suspend fun getTransactionDetails(transactionId: String): Transaction {
return retrofitInstance.transactionApi.getTransactionById(transactionId).transaction
}
app/src/main/java/com/cornellappdev/resell/android/model/api/TransactionApiService.kt:11
- Inconsistent trailing slash in API endpoint path. The endpoint is defined as "transaction/id/{id}" without a trailing slash, while getTransactionByPostId uses "transaction/postId/{id}/" with a trailing slash. For consistency with the other endpoint in this file and to follow the pattern seen in TransactionReviewApiService, this should either have a trailing slash on both or neither.
@GET("transaction/id/{id}")
suspend fun getTransactionById(@Path("id") id : String) : TransactionResponse
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
.../main/java/com/cornellappdev/resell/android/viewmodel/main/PostTransactionRatingViewModel.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/viewmodel/main/ChatViewModel.kt
Show resolved
Hide resolved
| val transactionFromPostId = postTransactionRatingRepository.getTransactionByPostId(navArgs.postId) | ||
| val transaction = postTransactionRatingRepository.getTransactionById(transactionFromPostId.id) |
There was a problem hiding this comment.
Two sequential API calls when one would suffice. The code first calls getTransactionByPostId to get a transaction, then immediately calls getTransactionById with the returned transaction's ID. This results in two network requests when only one is needed. The getTransactionByPostId already returns the complete Transaction object, so the second call to getTransactionById is redundant. Consider removing line 60 and using transactionFromPostId directly instead of calling getTransactionById.
| val transactionFromPostId = postTransactionRatingRepository.getTransactionByPostId(navArgs.postId) | |
| val transaction = postTransactionRatingRepository.getTransactionById(transactionFromPostId.id) | |
| val transaction = postTransactionRatingRepository.getTransactionByPostId(navArgs.postId) |
There was a problem hiding this comment.
^^ This seems to make sense to fix
There was a problem hiding this comment.
Ahh I did that because in the backend when we fetch a transaction with a post ID, we aren't able to get information about the seller and buyer (the former we need to display the seller's information on the screen): https://github.com/cuappdev/resell-backend/blob/main/src/repositories/TransactionRepository.ts
...rc/main/java/com/cornellappdev/resell/android/viewmodel/feedback/FeedbackDetailsViewModel.kt
Outdated
Show resolved
Hide resolved
|
In the recording, a dialog UI shows up that says "failed to submit review, try again later". Does that mean the submission failed or is it just because it is the dev server? |
app/src/main/java/com/cornellappdev/resell/android/model/api/FeedbackApiService.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/model/api/FeedbackApiService.kt
Outdated
Show resolved
Hide resolved
| .create(SettingsApiService::class.java) | ||
| } | ||
|
|
||
| val transactionApi: TransactionApiService by lazy { |
There was a problem hiding this comment.
Nit: This is technically fine and can be ignored for this pr since that was how it was for the previous api services, but for future refactors, there seems to be a lot of repeated code between the apiservices aside from the .create(...
There was a problem hiding this comment.
Yeahh for sure, I agree. Maybe we can refactor it out
app/src/main/java/com/cornellappdev/resell/android/model/api/TransactionApiService.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/model/api/FeedbackApiService.kt
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/model/api/TransactionApiService.kt
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/model/api/TransactionReviewApiService.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/model/api/TransactionReviewApiService.kt
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/model/chats/ChatDocument.kt
Outdated
Show resolved
Hide resolved
| else -> R.drawable.ic_bag | ||
| } | ||
|
|
||
| fun convertToUtcMinusFiveDate(): Date { |
There was a problem hiding this comment.
Nit: This logic seems to be repeated, so we could probably make some sort of reusable function
There was a problem hiding this comment.
Realized the function was never called so I removed it
app/src/main/java/com/cornellappdev/resell/android/model/chats/ChatDocument.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/model/ptf/FeedbackRepository.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/model/ptf/PostTransactionRatingRepository.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/model/ptf/PostTransactionRatingRepository.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/model/ptf/PostTransactionRatingRepository.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/ui/components/chat/ChatMessageCluster.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/ui/components/chat/ChatTransactionState.kt
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/ui/components/chat/ChatTransactionState.kt
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/ui/components/chat/ChatTransactionState.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/ui/components/chat/ChatTransactionState.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/cornellappdev/resell/android/ui/components/chat/ChatTransactionState.kt
Outdated
Show resolved
Hide resolved
| messageType = MessageType.State, | ||
| content = "This transaction has been completed", | ||
| transactionInfo = TransactionInfo( | ||
| completeTime = Timestamp(Date()), |
There was a problem hiding this comment.
Should we be getting the timestamp of the actual completion of the transaction from the vm or is this just a placeholder or something else?
There was a problem hiding this comment.
This was a mistake on my part, we should be getting the completion date from the vm! Fixed.
...rc/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt
Outdated
Show resolved
Hide resolved
...rc/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt
Outdated
Show resolved
Hide resolved
...rc/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt
Outdated
Show resolved
Hide resolved
...rc/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt
Outdated
Show resolved
Hide resolved
...rc/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt
Outdated
Show resolved
Hide resolved
...rc/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt
Show resolved
Hide resolved
...rc/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt
Outdated
Show resolved
Hide resolved
...rc/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt
Outdated
Show resolved
Hide resolved
...rc/main/java/com/cornellappdev/resell/android/ui/screens/main/PostTransactionRatingScreen.kt
Outdated
Show resolved
Hide resolved
.../main/java/com/cornellappdev/resell/android/viewmodel/main/PostTransactionRatingViewModel.kt
Show resolved
Hide resolved
.../main/java/com/cornellappdev/resell/android/viewmodel/main/PostTransactionRatingViewModel.kt
Outdated
Show resolved
Hide resolved
Each listing should only be allowed to have one transaction review submitted per user, so the dialog UI that shows up is because I had already created a transaction review for that listing. Though, instead of "failed to submit review, try again letter" it should really show something along the lines of "transaction review already submitted!" I'll go ahead and implement that. |
Overview
Added networking between PTF UI and backend. This PR includes a fully networked transaction completed chat navigation, Post Transaction Review Screen, transaction review submission, and feedback submission.
Changes Made
Test Coverage
Next Steps
Related PRs or Issues
Past UI PRs:
Screenshots (delete if not applicable)
Screen Shot Name
screen-20260222-184737-1771804027748.1.1.mp4