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
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ dependencies {
// Networking
implementation("com.squareup.moshi:moshi:1.14.0")
implementation("com.squareup.moshi:moshi-kotlin:1.14.0")
implementation 'com.squareup.moshi:moshi-adapters:1.14.0'
implementation 'com.squareup.okhttp3:okhttp'
implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.10'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
Expand Down
22 changes: 16 additions & 6 deletions app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import androidx.core.view.WindowCompat
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import com.cornellappdev.android.eatery.data.repositories.EateryRepository
import com.cornellappdev.android.eatery.data.repositories.UserPreferencesRepository
import com.cornellappdev.android.eatery.data.repositories.UserRepository
import com.cornellappdev.android.eatery.ui.navigation.NavigationSetup
import com.cornellappdev.android.eatery.util.LockScreenOrientation
import dagger.hilt.android.AndroidEntryPoint
Expand All @@ -17,17 +17,15 @@ import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
@Inject
lateinit var userPreferences: UserPreferencesRepository
lateinit var eateryRepository: EateryRepository

@Inject
lateinit var eateryRepository: EateryRepository
lateinit var userRepository: UserRepository

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val hasOnboarded = runBlocking {
return@runBlocking userPreferences.getHasOnboarded()
}
val hasOnboarded = runBlocking { userRepository.hasOnboarded() }

WindowCompat.setDecorFitsSystemWindows(window, false)

Expand All @@ -46,5 +44,17 @@ class MainActivity : ComponentActivity() {
}
}
lifecycle.addObserver(dataRefresher)
runBlocking {
configureTokens()
// todo - uncomment when backend finishes favorites
// userRepository.updateFavorites()
}
}

private suspend fun configureTokens() {
if (!userRepository.hasLaunchedBefore()) {
userRepository.registerDevice()
}
userRepository.getTokens()
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
@file:Suppress("unused")

package com.cornellappdev.android.eatery.data

import com.cornellappdev.android.eatery.data.models.AccountType
Expand Down Expand Up @@ -85,14 +87,9 @@ class DateTimeAdapter {
}

@FromJson
fun fromJson(dateTime: Long): LocalDateTime {
try {
val instant = Instant.ofEpochSecond(dateTime)
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
} catch (e: ParseException) {
e.printStackTrace()
}
return LocalDateTime.MIN
fun fromJson(dateTime: String): LocalDateTime {
val x = LocalDateTime.ofInstant(Instant.parse(dateTime), ZoneId.systemDefault())
return x
}
}

Expand All @@ -116,18 +113,14 @@ class AccountTypeAdapter {
"brb"
}

AccountType.CITYBUCKS -> {
AccountType.CITY_BUCKS -> {
"city bucks"
}

AccountType.LAUNDRY -> {
"laundry"
}

AccountType.MEALSWIPES -> {
"meal plan"
}

else -> {
"other"
}
Expand Down Expand Up @@ -155,7 +148,7 @@ class AccountTypeAdapter {
return if (accountName.contains("brb", ignoreCase = true)) {
AccountType.BRBS
} else if (accountName.contains("city bucks", ignoreCase = true)) {
AccountType.CITYBUCKS
AccountType.CITY_BUCKS
} else if (accountName.contains("laundry", ignoreCase = true)) {
AccountType.LAUNDRY
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,57 +1,113 @@
package com.cornellappdev.android.eatery.data

import com.cornellappdev.android.eatery.data.models.AccountsResponse
import com.cornellappdev.android.eatery.data.models.ApiResponse
import com.cornellappdev.android.eatery.data.models.AuthTokens
import com.cornellappdev.android.eatery.data.models.DeviceId
import com.cornellappdev.android.eatery.data.models.Eatery
import com.cornellappdev.android.eatery.data.models.Event
import com.cornellappdev.android.eatery.data.models.GetApiAccountsParams
import com.cornellappdev.android.eatery.data.models.GetApiRequestBody
import com.cornellappdev.android.eatery.data.models.FavoriteEatery
import com.cornellappdev.android.eatery.data.models.FavoriteItem
import com.cornellappdev.android.eatery.data.models.FavoritesResponse
import com.cornellappdev.android.eatery.data.models.FcmToken
import com.cornellappdev.android.eatery.data.models.Financials
import com.cornellappdev.android.eatery.data.models.GetApiResponse
import com.cornellappdev.android.eatery.data.models.GetApiTransactionHistoryParams
import com.cornellappdev.android.eatery.data.models.GetApiUserParams
import com.cornellappdev.android.eatery.data.models.LoginPIN
import com.cornellappdev.android.eatery.data.models.LoginRequest
import com.cornellappdev.android.eatery.data.models.RefreshRequest
import com.cornellappdev.android.eatery.data.models.ReportSendBody
import com.cornellappdev.android.eatery.data.models.TransactionsResponse
import com.cornellappdev.android.eatery.data.models.User
import com.cornellappdev.android.eatery.data.models.SessionID
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.POST
import retrofit2.http.Path
import retrofit2.http.Url

interface NetworkApi {
@POST()
suspend fun fetchUser(
@Url url: String,
@Body body: GetApiRequestBody<GetApiUserParams>
): GetApiResponse<User>

@POST()
suspend fun fetchAccounts(
@Url url: String,
@Body body: GetApiRequestBody<GetApiAccountsParams>
): GetApiResponse<AccountsResponse>

@POST()
suspend fun fetchTransactionHistory(
@Url url: String,
@Body body: GetApiRequestBody<GetApiTransactionHistoryParams>
): GetApiResponse<TransactionsResponse>

@GET("/eatery/")
@GET("/eateries/")
suspend fun fetchEateries(): List<Eatery>

@GET("/eatery/{eatery_id}")
@GET("/eateries/{eatery_id}")
suspend fun fetchEatery(@Path(value = "eatery_id") eateryId: String): Eatery

@GET("/eatery/simple")
suspend fun fetchHomeEateries(): List<Eatery>

@GET("/event")
suspend fun fetchEvents(): ApiResponse<List<Event>>


@POST("/report/")
suspend fun sendReport(
@Body report: ReportSendBody
): GetApiResponse<ReportSendBody>

/**
* Called on app launch to get session tokens based on UUID
*/
@POST("/auth/verify-token")
suspend fun verifyToken(
@Body deviceId: DeviceId
): AuthTokens

/**
* Get a new pair of tokens
*/
@POST("/auth/refresh-token")
suspend fun refreshToken(
@Body refreshRequest: RefreshRequest
): AuthTokens

/* All [accessToken]s should start with "Bearer".
* E.g., Authorization: Bearer a97syd9a77asydan9s
* */

@POST("/user/fcm-token")
suspend fun enableNotifications(
@Header("Authorization") accessToken: String,
@Body token: FcmToken
)

@DELETE("/user/fcm-token")
suspend fun disableNotifications(
@Header("Authorization") accessToken: String,
@Body token: FcmToken
)

@POST("/user/favorites/items")
suspend fun addFavoriteItem(
@Header("Authorization") accessToken: String,
@Body item: FavoriteItem
)

@DELETE("/user/favorites/items")
suspend fun deleteFavoriteItem(
@Header("Authorization") accessToken: String,
@Body item: FavoriteItem
)

@POST("/user/favorites/eateries")
suspend fun addFavoriteEatery(
@Header("Authorization") accessToken: String,
@Body eatery: FavoriteEatery
)

@DELETE("/user/favorites/eateries")
suspend fun deleteFavoriteEatery(
@Header("Authorization") accessToken: String,
@Body eatery: FavoriteEatery
)

@POST("/auth/get/authorize")
suspend fun authorizeUser(
@Header("Authorization") accessToken: String,
@Body loginRequest: LoginRequest
)

@POST("/auth/get/refresh")
suspend fun refreshAuthorizedUser(
@Header("Authorization") accessToken: String,
@Body loginPIN: LoginPIN
): SessionID

@GET("/financials")
suspend fun getFinancials(
@Header("Authorization") accessToken: String
): Financials

@GET("/user/favorites/matches")
suspend fun getFavoriteMatches(
@Header("Authorization") accessToken: String,
): FavoritesResponse
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.cornellappdev.android.eatery.data.models

data class AccountBalances(
val brbBalance: Double? = null,
val cityBucksBalance: Double? = null,
val laundryBalance: Double? = null,
val mealSwipes: Int? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,55 +3,15 @@ package com.cornellappdev.android.eatery.data.models
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class ApiResponse<T>(
@Json(name = "success") val success: Boolean,
@Json(name = "data") val data: T? = null,
@Json(name = "error") val error: String? = null
)

// todo - update these
@JsonClass(generateAdapter = true)
data class GetApiResponse<T>(
@Json(name = "response") val response: T? = null,
@Json(name = "exception") val exception: String? = null
)

@JsonClass(generateAdapter = true)
data class GetApiRequestBody<T>(
val version: String,
val method: String,
val params: T
)

@JsonClass(generateAdapter = true)
data class GetApiUserParams(
val sessionId: String
)

@JsonClass(generateAdapter = true)
data class GetApiAccountsParams(
val sessionId: String,
val userId: String
)

@JsonClass(generateAdapter = true)
data class GetApiTransactionHistoryParams(
val paymentSystemType: Int,
val sessionId: String,
val queryCriteria: GetApiTransactionHistoryQueryCriteria
)

@JsonClass(generateAdapter = true)
data class GetApiTransactionHistoryQueryCriteria(
val endDate: String,
val institutionId: String,
val maxReturn: Int,
val startDate: String,
val userId: String
)

@JsonClass(generateAdapter = true)
data class ReportSendBody(
@Json(name = "eatery") val eatery: Int?,
@Json(name = "content") val content: String
)
)
Loading
Loading