Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.cramsan.edifikana.api

import com.cramsan.edifikana.lib.model.UnitId
import com.cramsan.edifikana.lib.model.network.CreateUnitNetworkRequest
import com.cramsan.edifikana.lib.model.network.GetUnitsQueryParams
import com.cramsan.edifikana.lib.model.network.UnitListNetworkResponse
import com.cramsan.edifikana.lib.model.network.UnitNetworkResponse
import com.cramsan.edifikana.lib.model.network.UpdateUnitNetworkRequest
import com.cramsan.framework.annotations.NetworkModel
import com.cramsan.framework.annotations.api.NoPathParam
import com.cramsan.framework.annotations.api.NoQueryParam
import com.cramsan.framework.annotations.api.NoRequestBody
import com.cramsan.framework.annotations.api.NoResponseBody
import com.cramsan.framework.networkapi.Api
import io.ktor.http.HttpMethod

/**
* API definition for unit CRUD operations.
*/
@OptIn(NetworkModel::class)
object UnitApi : Api("unit") {

val createUnit = operation<
CreateUnitNetworkRequest,
NoQueryParam,
NoPathParam,
UnitNetworkResponse
>(HttpMethod.Post)

val getUnit = operation<
NoRequestBody,
NoQueryParam,
UnitId,
UnitNetworkResponse
>(HttpMethod.Get)

val getUnits = operation<
NoRequestBody,
GetUnitsQueryParams,
NoPathParam,
UnitListNetworkResponse
>(HttpMethod.Get)

val updateUnit = operation<
UpdateUnitNetworkRequest,
NoQueryParam,
UnitId,
UnitNetworkResponse
>(HttpMethod.Put)

val deleteUnit = operation<
NoRequestBody,
NoQueryParam,
UnitId,
NoResponseBody
>(HttpMethod.Delete)
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.cramsan.edifikana.lib.model.NotificationId
import com.cramsan.edifikana.lib.model.OrganizationId
import com.cramsan.edifikana.lib.model.PropertyId
import com.cramsan.edifikana.lib.model.TimeCardEventId
import com.cramsan.edifikana.lib.model.UnitId
import com.cramsan.edifikana.lib.model.UserId
import com.cramsan.edifikana.lib.utils.requireSuccess
import com.cramsan.edifikana.server.dependencyinjection.DatastoreModule
Expand All @@ -22,6 +23,7 @@ import com.cramsan.edifikana.server.service.models.Notification
import com.cramsan.edifikana.server.service.models.Organization
import com.cramsan.edifikana.server.service.models.Property
import com.cramsan.edifikana.server.service.models.TimeCardEvent
import com.cramsan.edifikana.server.service.models.Unit
import com.cramsan.edifikana.lib.model.InviteRole
import com.cramsan.edifikana.server.service.models.User
import com.cramsan.framework.test.CoroutineTest
Expand Down Expand Up @@ -52,6 +54,7 @@ abstract class SupabaseIntegrationTest : CoroutineTest(), KoinTest {
protected val organizationDatastore: SupabaseOrganizationDatastore by inject()
protected val notificationDatastore: SupabaseNotificationDatastore by inject()
protected val membershipDatastore: SupabaseMembershipDatastore by inject()
protected val unitDatastore: SupabaseUnitDatastore by inject()

private val eventLogResources = mutableSetOf<EventLogEntryId>()
private val propertyResources = mutableSetOf<PropertyId>()
Expand All @@ -62,6 +65,7 @@ abstract class SupabaseIntegrationTest : CoroutineTest(), KoinTest {
private val organizationResources = mutableSetOf<OrganizationId>()
private val invitationResources = mutableSetOf<InviteId>()
private val notificationResources = mutableSetOf<NotificationId>()
private val unitResources = mutableSetOf<UnitId>()

@BeforeEach
fun supabaseSetup() {
Expand Down Expand Up @@ -108,6 +112,10 @@ abstract class SupabaseIntegrationTest : CoroutineTest(), KoinTest {
notificationResources.add(notificationId)
}

private fun registerUnitForDeletion(unitId: UnitId) {
unitResources.add(unitId)
}

protected fun createTestUser(email: String): UserId {
val userId = runBlocking {
userDatastore.createUser(
Expand Down Expand Up @@ -137,6 +145,27 @@ abstract class SupabaseIntegrationTest : CoroutineTest(), KoinTest {
return organizationId
}

protected fun createTestUnit(
propertyId: PropertyId,
orgId: OrganizationId,
unitNumber: String,
): UnitId {
val unitId = runBlocking {
unitDatastore.createUnit(
propertyId = propertyId,
orgId = orgId,
unitNumber = unitNumber,
bedrooms = null,
bathrooms = null,
sqFt = null,
floor = null,
notes = null,
).getOrThrow().id
}
registerUnitForDeletion(unitId)
return unitId
}

protected fun createTestProperty(name: String, userId: UserId, organizationId: OrganizationId): PropertyId {
val propertyId = runBlocking {
propertyDatastore.createProperty(
Expand Down Expand Up @@ -217,6 +246,12 @@ abstract class SupabaseIntegrationTest : CoroutineTest(), KoinTest {
}
}

fun Result<Unit>.registerUnitForDeletion(): Result<Unit> {
return this.onSuccess { unit ->
registerUnitForDeletion(unit.id)
}
}

fun registerSupabaseUserForDeletion(userId: String) {
supabaseUsers.add(userId)
}
Expand Down Expand Up @@ -271,6 +306,10 @@ abstract class SupabaseIntegrationTest : CoroutineTest(), KoinTest {
results += employeeDatastore.deleteEmployee(it)
results += employeeDatastore.purgeEmployee(it)
}
unitResources.forEach {
results += unitDatastore.deleteUnit(it)
results += unitDatastore.purgeUnit(it)
}
propertyResources.forEach {
results += propertyDatastore.deleteProperty(it)
results += propertyDatastore.purgeProperty(it)
Expand All @@ -293,6 +332,7 @@ abstract class SupabaseIntegrationTest : CoroutineTest(), KoinTest {
eventLogResources.clear()
timeCardResources.clear()
employeeResources.clear()
unitResources.clear()
propertyResources.clear()
userResources.clear()
organizationResources.clear()
Expand Down
Loading
Loading