Update Kotlin models and iOS Swift to align with new Go API format

- Update all Kotlin API models to match Go API response structures
- Fix Swift type aliases (TaskDetail→TaskResponse, Residence→ResidenceResponse, etc.)
- Update TaskCompletionCreateRequest to simplified Go API format (taskId, notes, actualCost, photoUrl)
- Fix optional handling for frequency, priority, category, status in task models
- Replace isPrimaryOwner with ownerId comparison against current user
- Update ResidenceUsersResponse to use owner.id instead of ownerId
- Fix non-optional String fields to use isEmpty checks instead of optional binding
- Add type aliases for backwards compatibility in Kotlin models

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-11-27 11:03:00 -06:00
parent d3e77326aa
commit 60c824447d
48 changed files with 923 additions and 846 deletions

View File

@@ -7,9 +7,9 @@ struct ManageUsersView: View {
let isPrimaryOwner: Bool
@Environment(\.dismiss) private var dismiss
@State private var users: [ResidenceUser] = []
@State private var users: [ResidenceUserResponse] = []
@State private var ownerId: Int32?
@State private var shareCode: ResidenceShareCode?
@State private var shareCode: ShareCodeResponse?
@State private var isLoading = true
@State private var errorMessage: String?
@State private var isGeneratingCode = false
@@ -100,7 +100,7 @@ struct ManageUsersView: View {
if let successResult = result as? ApiResultSuccess<ResidenceUsersResponse>,
let responseData = successResult.data as? ResidenceUsersResponse {
self.users = Array(responseData.users)
self.ownerId = responseData.ownerId as? Int32
self.ownerId = Int32(responseData.owner.id)
self.isLoading = false
} else if let errorResult = result as? ApiResultError {
self.errorMessage = ErrorMessageParser.parse(errorResult.message)
@@ -127,7 +127,7 @@ struct ManageUsersView: View {
let result = try await APILayer.shared.getShareCode(residenceId: Int32(Int(residenceId)))
await MainActor.run {
if let successResult = result as? ApiResultSuccess<ResidenceShareCode> {
if let successResult = result as? ApiResultSuccess<ShareCodeResponse> {
self.shareCode = successResult.data
}
// It's okay if there's no active share code
@@ -148,7 +148,7 @@ struct ManageUsersView: View {
let result = try await APILayer.shared.generateShareCode(residenceId: Int32(Int(residenceId)))
await MainActor.run {
if let successResult = result as? ApiResultSuccess<ResidenceShareCode> {
if let successResult = result as? ApiResultSuccess<ShareCodeResponse> {
self.shareCode = successResult.data
self.isGeneratingCode = false
} else if let errorResult = result as? ApiResultError {

View File

@@ -15,9 +15,9 @@ struct ResidenceDetailView: View {
@State private var showEditResidence = false
@State private var showEditTask = false
@State private var showManageUsers = false
@State private var selectedTaskForEdit: TaskDetail?
@State private var selectedTaskForComplete: TaskDetail?
@State private var selectedTaskForArchive: TaskDetail?
@State private var selectedTaskForEdit: TaskResponse?
@State private var selectedTaskForComplete: TaskResponse?
@State private var selectedTaskForArchive: TaskResponse?
@State private var showArchiveConfirmation = false
@State private var hasAppeared = false
@@ -29,7 +29,15 @@ struct ResidenceDetailView: View {
@StateObject private var subscriptionCache = SubscriptionCacheWrapper.shared
@Environment(\.dismiss) private var dismiss
// Check if current user is the owner of the residence
private func isCurrentUserOwner(of residence: ResidenceResponse) -> Bool {
guard let currentUser = ComposeApp.DataCache.shared.currentUser.value else {
return false
}
return Int(residence.ownerId) == Int(currentUser.id)
}
var body: some View {
ZStack {
Color.appBackgroundPrimary
@@ -100,7 +108,7 @@ struct ResidenceDetailView: View {
ManageUsersView(
residenceId: residence.id,
residenceName: residence.name,
isPrimaryOwner: residence.isPrimaryOwner
isPrimaryOwner: isCurrentUserOwner(of: residence)
)
}
}
@@ -184,7 +192,7 @@ private extension ResidenceDetailView {
}
@ViewBuilder
func contentView(for residence: Residence) -> some View {
func contentView(for residence: ResidenceResponse) -> some View {
ScrollView {
VStack(spacing: 16) {
PropertyHeaderCard(residence: residence)
@@ -251,7 +259,7 @@ private extension ResidenceDetailView {
.disabled(viewModel.isGeneratingReport)
}
if let residence = viewModel.selectedResidence, residence.isPrimaryOwner {
if let residence = viewModel.selectedResidence, isCurrentUserOwner(of: residence) {
Button {
showManageUsers = true
} label: {
@@ -272,7 +280,7 @@ private extension ResidenceDetailView {
}
.accessibilityIdentifier(AccessibilityIdentifiers.Task.addButton)
if let residence = viewModel.selectedResidence, residence.isPrimaryOwner {
if let residence = viewModel.selectedResidence, isCurrentUserOwner(of: residence) {
Button {
showDeleteConfirmation = true
} label: {
@@ -363,9 +371,9 @@ private struct TasksSectionContainer: View {
let tasksResponse: TaskColumnsResponse
@ObservedObject var taskViewModel: TaskViewModel
@Binding var selectedTaskForEdit: TaskDetail?
@Binding var selectedTaskForComplete: TaskDetail?
@Binding var selectedTaskForArchive: TaskDetail?
@Binding var selectedTaskForEdit: TaskResponse?
@Binding var selectedTaskForComplete: TaskResponse?
@Binding var selectedTaskForArchive: TaskResponse?
@Binding var showArchiveConfirmation: Bool
let reloadTasks: () -> Void

View File

@@ -7,7 +7,7 @@ class ResidenceViewModel: ObservableObject {
// MARK: - Published Properties
@Published var residenceSummary: ResidenceSummaryResponse?
@Published var myResidences: MyResidencesResponse?
@Published var selectedResidence: Residence?
@Published var selectedResidence: ResidenceResponse?
@Published var isLoading: Bool = false
@Published var errorMessage: String?
@Published var isGeneratingReport: Bool = false
@@ -65,7 +65,7 @@ class ResidenceViewModel: ObservableObject {
sharedViewModel.getResidence(id: id) { result in
Task { @MainActor in
if let success = result as? ApiResultSuccess<Residence> {
if let success = result as? ApiResultSuccess<ResidenceResponse> {
self.selectedResidence = success.data
self.isLoading = false
} else if let error = result as? ApiResultError {
@@ -101,7 +101,7 @@ class ResidenceViewModel: ObservableObject {
sharedViewModel.updateResidenceState,
loadingSetter: { [weak self] in self?.isLoading = $0 },
errorSetter: { [weak self] in self?.errorMessage = $0 },
onSuccess: { [weak self] (data: Residence) in
onSuccess: { [weak self] (data: ResidenceResponse) in
self?.selectedResidence = data
},
completion: completion,

View File

@@ -121,7 +121,7 @@ struct ResidencesListView: View {
private struct ResidencesContent: View {
let response: MyResidencesResponse
let residences: [ResidenceWithTasks]
let residences: [ResidenceResponse]
var body: some View {
ScrollView(showsIndicators: false) {