Добавление товара в корзину с главного экрана

This commit is contained in:
Данила Мочалов 2023-12-22 01:47:27 +04:00
parent 32c72e0efa
commit 247fe61d9e
17 changed files with 825 additions and 68 deletions

View File

@ -0,0 +1,208 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "fd664bd9d0a27511fb20675444548276",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `user_login` TEXT NOT NULL, `user_password` TEXT NOT NULL, `user_role` TEXT NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "login",
"columnName": "user_login",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "password",
"columnName": "user_password",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "role",
"columnName": "user_role",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "orders",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `order_status` TEXT NOT NULL, `user_id` INTEGER, `date` INTEGER NOT NULL, FOREIGN KEY(`user_id`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "order_status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "user_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "date",
"columnName": "date",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_orders_user_id",
"unique": false,
"columnNames": [
"user_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_orders_user_id` ON `${TABLE_NAME}` (`user_id`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"user_id"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "products",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `product_title` TEXT NOT NULL, `product_price` INTEGER NOT NULL, `product_old_price` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "title",
"columnName": "product_title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "price",
"columnName": "product_price",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "oldPrice",
"columnName": "product_old_price",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "order_product",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`order_id` INTEGER NOT NULL, `product_id` INTEGER NOT NULL, `quantity` INTEGER NOT NULL, `total_price` INTEGER NOT NULL, PRIMARY KEY(`order_id`, `product_id`))",
"fields": [
{
"fieldPath": "orderId",
"columnName": "order_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "productId",
"columnName": "product_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "quantity",
"columnName": "quantity",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "totalPrice",
"columnName": "total_price",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"order_id",
"product_id"
]
},
"indices": [
{
"name": "index_order_product_order_id",
"unique": false,
"columnNames": [
"order_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_order_product_order_id` ON `${TABLE_NAME}` (`order_id`)"
},
{
"name": "index_order_product_product_id",
"unique": false,
"columnNames": [
"product_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_order_product_product_id` ON `${TABLE_NAME}` (`product_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'fd664bd9d0a27511fb20675444548276')"
]
}
}

View File

@ -0,0 +1,208 @@
{
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "1ce8ad5b9b5decfebb42bc2f3c33393d",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `user_login` TEXT NOT NULL, `user_password` TEXT NOT NULL, `user_role` TEXT NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "login",
"columnName": "user_login",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "password",
"columnName": "user_password",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "role",
"columnName": "user_role",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "orders",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `order_status` TEXT NOT NULL, `user_id` INTEGER, `date` TEXT NOT NULL, FOREIGN KEY(`user_id`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "order_status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "user_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "date",
"columnName": "date",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_orders_user_id",
"unique": false,
"columnNames": [
"user_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_orders_user_id` ON `${TABLE_NAME}` (`user_id`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"user_id"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "products",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `product_title` TEXT NOT NULL, `product_price` INTEGER NOT NULL, `product_old_price` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "title",
"columnName": "product_title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "price",
"columnName": "product_price",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "oldPrice",
"columnName": "product_old_price",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "order_product",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`order_id` INTEGER NOT NULL, `product_id` INTEGER NOT NULL, `quantity` INTEGER NOT NULL, `total_price` INTEGER NOT NULL, PRIMARY KEY(`order_id`, `product_id`))",
"fields": [
{
"fieldPath": "orderId",
"columnName": "order_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "productId",
"columnName": "product_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "quantity",
"columnName": "quantity",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "totalPrice",
"columnName": "total_price",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"order_id",
"product_id"
]
},
"indices": [
{
"name": "index_order_product_order_id",
"unique": false,
"columnNames": [
"order_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_order_product_order_id` ON `${TABLE_NAME}` (`order_id`)"
},
{
"name": "index_order_product_product_id",
"unique": false,
"columnNames": [
"product_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_order_product_product_id` ON `${TABLE_NAME}` (`product_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1ce8ad5b9b5decfebb42bc2f3c33393d')"
]
}
}

View File

@ -0,0 +1,196 @@
{
"formatVersion": 1,
"database": {
"version": 3,
"identityHash": "12eb76256f54b2c513a3073a2e582c4c",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `user_login` TEXT NOT NULL, `user_password` TEXT NOT NULL, `user_role` TEXT NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "login",
"columnName": "user_login",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "password",
"columnName": "user_password",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "role",
"columnName": "user_role",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "orders",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `order_status` TEXT NOT NULL, `user_id` INTEGER, `date` TEXT NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "order_status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "user_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "date",
"columnName": "date",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_orders_user_id",
"unique": false,
"columnNames": [
"user_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_orders_user_id` ON `${TABLE_NAME}` (`user_id`)"
}
],
"foreignKeys": []
},
{
"tableName": "products",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `product_title` TEXT NOT NULL, `product_price` INTEGER NOT NULL, `product_old_price` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "title",
"columnName": "product_title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "price",
"columnName": "product_price",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "oldPrice",
"columnName": "product_old_price",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "order_product",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`order_id` INTEGER NOT NULL, `product_id` INTEGER NOT NULL, `quantity` INTEGER NOT NULL, `total_price` INTEGER NOT NULL, PRIMARY KEY(`order_id`, `product_id`))",
"fields": [
{
"fieldPath": "orderId",
"columnName": "order_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "productId",
"columnName": "product_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "quantity",
"columnName": "quantity",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "totalPrice",
"columnName": "total_price",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"order_id",
"product_id"
]
},
"indices": [
{
"name": "index_order_product_order_id",
"unique": false,
"columnNames": [
"order_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_order_product_order_id` ON `${TABLE_NAME}` (`order_id`)"
},
{
"name": "index_order_product_product_id",
"unique": false,
"columnNames": [
"product_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_order_product_product_id` ON `${TABLE_NAME}` (`product_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '12eb76256f54b2c513a3073a2e582c4c')"
]
}
}

View File

@ -3,6 +3,8 @@ package com.example.shawarma
import android.app.Application import android.app.Application
import androidx.room.Room import androidx.room.Room
import com.example.shawarma.data.api.MyServerService import com.example.shawarma.data.api.MyServerService
import com.example.shawarma.data.api.repos.RestOrderProductRepository
import com.example.shawarma.data.api.repos.RestOrderRepository
import com.example.shawarma.data.api.repos.RestProductRepository import com.example.shawarma.data.api.repos.RestProductRepository
import com.example.shawarma.data.api.repos.RestUserRepository import com.example.shawarma.data.api.repos.RestUserRepository
import com.example.shawarma.data.db.AppDatabase import com.example.shawarma.data.db.AppDatabase
@ -61,14 +63,26 @@ object AppModule {
@Provides @Provides
@Singleton @Singleton
fun provideOrderRepository(db: AppDatabase) : OrderRepository { fun provideOrderRepository(db: AppDatabase, restOrderRepository: RestOrderRepository) : OrderRepository {
return OrderRepository(db.orderDao()) return OrderRepository(db.orderDao(), db.productDao(), db.orderProductDao(), restOrderRepository)
} }
@Provides @Provides
@Singleton @Singleton
fun provideOrderProductRepository(db: AppDatabase) : OrderProductRepository { fun provideRestOrderRepository(service: MyServerService) : RestOrderRepository {
return OrderProductRepository(db.orderProductDao()) return RestOrderRepository(service)
}
@Provides
@Singleton
fun provideOrderProductRepository(db: AppDatabase, restOrderProductRepository: RestOrderProductRepository) : OrderProductRepository {
return OrderProductRepository(db.orderProductDao(), restOrderProductRepository)
}
@Provides
@Singleton
fun provideRestOrderProductRepository(service: MyServerService) : RestOrderProductRepository {
return RestOrderProductRepository(service)
} }

View File

@ -1,5 +1,7 @@
package com.example.shawarma.data.api package com.example.shawarma.data.api
import com.example.shawarma.data.api.models.OrderModelRemote
import com.example.shawarma.data.api.models.OrderProductRemote
import com.example.shawarma.data.api.models.ProductListResponse import com.example.shawarma.data.api.models.ProductListResponse
import com.example.shawarma.data.api.models.ProductModelRemote import com.example.shawarma.data.api.models.ProductModelRemote
import com.example.shawarma.data.api.models.TokenModelRemote import com.example.shawarma.data.api.models.TokenModelRemote
@ -19,6 +21,9 @@ import retrofit2.http.Path
interface MyServerService { interface MyServerService {
//
// USER
//
@POST("register") @POST("register")
suspend fun createUser( suspend fun createUser(
@Body user: UserModelRemote, @Body user: UserModelRemote,
@ -34,6 +39,13 @@ interface MyServerService {
@Body user: UserModelRemote @Body user: UserModelRemote
) :UserModelRemote? ) :UserModelRemote?
@GET("user")
suspend fun getUser(@Header("Authorization") token: String) : UserModelRemote?
//
// PRODUCTS
//
@GET("user/products/{after}") @GET("user/products/{after}")
suspend fun getProductsList(@Path("after") after: Int, @Header("Authorization") token: String) : ProductListResponse suspend fun getProductsList(@Path("after") after: Int, @Header("Authorization") token: String) : ProductListResponse
@ -58,8 +70,25 @@ interface MyServerService {
@DELETE("product/{id}") @DELETE("product/{id}")
suspend fun deleteProduct(@Path("id") id: Int, @Header("Authorization") token: String) suspend fun deleteProduct(@Path("id") id: Int, @Header("Authorization") token: String)
//
// ORDERS
//
@GET("order/unpaid")
suspend fun getUnpaidOrder(@Header("Authorization") token: String) : OrderModelRemote
@POST("order")
suspend fun insertOrder(@Body order: OrderModelRemote, @Header("Authorization") token: String) : OrderModelRemote?
//
// ORDER PRODUCTS
//
@POST("order/product")
suspend fun insertOrderProduct(@Body orderProduct: OrderProductRemote, @Header("Authorization") token: String)
@PUT("order/product")
suspend fun updateOrderProduct(@Body orderProduct: OrderProductRemote, @Header("Authorization") token: String)
companion object { companion object {
private const val BASE_URL = "https://10.0.2.2:80/api/" private const val BASE_URL = "https://10.0.2.2:80/api/"

View File

@ -0,0 +1,42 @@
package com.example.shawarma.data.api.models
import com.example.shawarma.data.models.OrderModel
import com.example.shawarma.data.models.OrderProductModel
import kotlinx.serialization.Serializable
@Serializable
data class OrderModelRemote(
val id: Int? = null,
val status: String = "",
val user_id: Int? = -1,
val date: String = "",
val order_products: List<OrderProductRemote> = listOf()
)
fun OrderModelRemote.toOrderModel() : OrderModel = OrderModel(
id, status, user_id, date = date
)
fun OrderModel.toOrderModelRemote() : OrderModelRemote = OrderModelRemote(
id, status, userId, date.toString()
)
@Serializable
data class OrderProductRemote(
val id: Int? = null,
val order_id: Int = -1,
val product_id: Int = -1,
val quantity: Int = 0,
val total_price: Int = 0,
val order: OrderModelRemote? = null,
val product: ProductModelRemote? = null
)
fun OrderProductRemote.toOrderProductModel() : OrderProductModel = OrderProductModel(
order_id, product_id, quantity, total_price
)
fun OrderProductModel.toOrderProductRemote() : OrderProductRemote = OrderProductRemote(
order_id = orderId, product_id = productId, quantity = quantity, total_price = totalPrice
)

View File

@ -10,6 +10,7 @@ data class ProductModelRemote(
val price: Int = 0, val price: Int = 0,
val old_price: Int? = null, val old_price: Int? = null,
val order_products: List<OrderProductRemote> = listOf()
) )
@Serializable @Serializable

View File

@ -0,0 +1,17 @@
package com.example.shawarma.data.api.repos
import com.example.shawarma.data.api.MyServerService
import com.example.shawarma.data.api.models.OrderProductRemote
import javax.inject.Inject
class RestOrderProductRepository @Inject constructor(
private val service: MyServerService
) {
suspend fun insertOrderProduct(token: String, orderProduct: OrderProductRemote) {
service.insertOrderProduct(orderProduct, token)
}
suspend fun updateOrderProduct(token: String, orderProduct: OrderProductRemote) {
service.updateOrderProduct(orderProduct, token)
}
}

View File

@ -1,4 +1,17 @@
package com.example.shawarma.data.api.repos package com.example.shawarma.data.api.repos
class RestOrderRepository { import com.example.shawarma.data.api.MyServerService
import com.example.shawarma.data.api.models.OrderModelRemote
import javax.inject.Inject
class RestOrderRepository@Inject constructor(
private val service: MyServerService
) {
suspend fun getUnpaidOrder(token:String) : OrderModelRemote {
return service.getUnpaidOrder(token)
}
suspend fun insertOrder(token: String, order: OrderModelRemote): OrderModelRemote? {
return service.insertOrder(order, token)
}
} }

View File

@ -21,4 +21,8 @@ class RestUserRepository @Inject constructor(
suspend fun checkLogin(user: UserModel): UserModelRemote? { suspend fun checkLogin(user: UserModel): UserModelRemote? {
return service.checkLogin(user.toUserModelRemote()) return service.checkLogin(user.toUserModelRemote())
} }
suspend fun getUser(token: String) : UserModelRemote? {
return service.getUser(token)
}
} }

View File

@ -1,6 +1,7 @@
package com.example.shawarma.data.db package com.example.shawarma.data.db
import android.content.Context import android.content.Context
import androidx.room.AutoMigration
import androidx.room.Database import androidx.room.Database
import androidx.room.Room import androidx.room.Room
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
@ -26,8 +27,9 @@ import kotlinx.coroutines.launch
ProductModel::class, ProductModel::class,
OrderProductModel::class, OrderProductModel::class,
], ],
version = 1, version = 3,
exportSchema = false autoMigrations = [AutoMigration (from = 1, to = 2), AutoMigration (from = 2, to = 3)],
exportSchema = true
) )
@TypeConverters(Converter::class) @TypeConverters(Converter::class)
abstract class AppDatabase : RoomDatabase() { abstract class AppDatabase : RoomDatabase() {

View File

@ -2,19 +2,10 @@ package com.example.shawarma.data.models
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
import java.util.Date
@Entity( @Entity(
tableName = "orders", tableName = "orders"
foreignKeys = [
ForeignKey(
entity = UserModel::class,
parentColumns = ["id"],
childColumns = ["user_id"],
)
]
) )
data class OrderModel( data class OrderModel(
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
@ -25,7 +16,7 @@ data class OrderModel(
@ColumnInfo(name = "user_id", index = true) @ColumnInfo(name = "user_id", index = true)
val userId: Int?, val userId: Int?,
@ColumnInfo(name = "date") @ColumnInfo(name = "date")
val date: Date val date: String
) )
fun getOrdersByUserId() : List<OrderModel> { fun getOrdersByUserId() : List<OrderModel> {

View File

@ -1,17 +1,22 @@
package com.example.shawarma.data.repos package com.example.shawarma.data.repos
import com.example.shawarma.data.api.models.toOrderProductRemote
import com.example.shawarma.data.api.repos.RestOrderProductRepository
import com.example.shawarma.data.interfaces.dao.OrderProductDao import com.example.shawarma.data.interfaces.dao.OrderProductDao
import com.example.shawarma.data.models.OrderProductModel import com.example.shawarma.data.models.OrderProductModel
import javax.inject.Inject import javax.inject.Inject
class OrderProductRepository @Inject constructor( class OrderProductRepository @Inject constructor(
private val orderProductDao: OrderProductDao private val orderProductDao: OrderProductDao,
private val restOrderProductRepository: RestOrderProductRepository
) { ) {
suspend fun insert(order: OrderProductModel) { suspend fun insert(token: String, orderProduct: OrderProductModel) {
return orderProductDao.insert(order) orderProductDao.insert(orderProduct)
return restOrderProductRepository.insertOrderProduct(token, orderProduct.toOrderProductRemote())
} }
suspend fun update(order: OrderProductModel) { suspend fun update(token: String, orderProduct: OrderProductModel) {
return orderProductDao.update(order) orderProductDao.update(orderProduct)
return restOrderProductRepository.updateOrderProduct(token, orderProduct.toOrderProductRemote())
} }
suspend fun delete(order: OrderProductModel) { suspend fun delete(order: OrderProductModel) {
return orderProductDao.delete(order) return orderProductDao.delete(order)

View File

@ -1,16 +1,31 @@
package com.example.shawarma.data.repos package com.example.shawarma.data.repos
import com.example.shawarma.data.api.models.toOrderModel
import com.example.shawarma.data.api.models.toOrderModelRemote
import com.example.shawarma.data.api.models.toOrderProductModel
import com.example.shawarma.data.api.models.toProductModel
import com.example.shawarma.data.api.repos.RestOrderRepository
import com.example.shawarma.data.interfaces.dao.OrderDao import com.example.shawarma.data.interfaces.dao.OrderDao
import com.example.shawarma.data.interfaces.dao.OrderProductDao
import com.example.shawarma.data.interfaces.dao.ProductDao
import com.example.shawarma.data.models.OrderModel import com.example.shawarma.data.models.OrderModel
import com.example.shawarma.data.models.OrderWithProducts import com.example.shawarma.data.models.OrderWithProducts
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import javax.inject.Inject import javax.inject.Inject
class OrderRepository @Inject constructor( class OrderRepository @Inject constructor(
private val orderDao: OrderDao private val orderDao: OrderDao,
private val productDao: ProductDao,
private val orderProductDao: OrderProductDao,
private val restRepository: RestOrderRepository
){ ){
suspend fun insert(order: OrderModel): Long { suspend fun insert(token: String, order: OrderModel): OrderModel? {
return orderDao.insert(order) val result = restRepository.insertOrder(token, order.toOrderModelRemote())
if (result == null) {
return result
}
return result.toOrderModel()
} }
suspend fun update(order:OrderModel) { suspend fun update(order:OrderModel) {
return orderDao.update(order) return orderDao.update(order)
@ -27,8 +42,20 @@ class OrderRepository @Inject constructor(
fun getByUserId(userId: Int): Flow<List<OrderWithProducts>> { fun getByUserId(userId: Int): Flow<List<OrderWithProducts>> {
return orderDao.getByUserId(userId) return orderDao.getByUserId(userId)
} }
fun getUnpaidByUser(userId: Int) : Flow<OrderWithProducts?> { suspend fun getUnpaidByUser(token: String) : OrderWithProducts? {
return orderDao.getUnpaidByUser(userId) val order = restRepository.getUnpaidOrder(token)
if (orderDao.getUnpaidByUser(order.user_id!!).first() != null) {
return orderDao.getUnpaidByUser(order.user_id!!).first()
}
if (order!!.id != null) {
orderDao.insert(order.toOrderModel())
for (product in order.order_products) {
orderProductDao.insert(product.toOrderProductModel())
productDao.insert(product.product!!.toProductModel())
}
return orderDao.getUnpaidByUser(order.user_id!!).first()
}
return null
} }
fun getPaidByUser(userId: Int) : Flow<List<OrderWithProducts>> { fun getPaidByUser(userId: Int) : Flow<List<OrderWithProducts>> {
return orderDao.getPaidByUser(userId) return orderDao.getPaidByUser(userId)

View File

@ -167,7 +167,7 @@ fun ProductCard(product: ProductModel){
) )
Button( Button(
onClick = { onClick = {
product.id?.let { homeViewModel.addProductToCart(it, preferencesManager.getData("user_id", "null")) } product.id?.let { homeViewModel.addProductToCart(it, preferencesManager.getData("token", "null")) }
}, },
colors = ButtonDefaults.buttonColors( colors = ButtonDefaults.buttonColors(
backgroundColor = MyLightYellow, backgroundColor = MyLightYellow,

View File

@ -25,17 +25,17 @@ class CartViewModel @Inject constructor(
get() = _paidOrders get() = _paidOrders
fun getOrders(userId: String) { fun getOrders(userId: String) {
if (userId == "null") return // if (userId == "null") return
viewModelScope.launch { // viewModelScope.launch {
orderRepository.getUnpaidByUser(userId.toInt()).collect { // orderRepository.getUnpaidByUser(userId.toInt()).collect {
_unpaidOrder.postValue(it) // _unpaidOrder.postValue(it)
} // }
} // }
viewModelScope.launch { // viewModelScope.launch {
orderRepository.getPaidByUser(userId.toInt()).collect { // orderRepository.getPaidByUser(userId.toInt()).collect {
_paidOrders.postValue(it) // _paidOrders.postValue(it)
} // }
} // }
} }
fun payForOrder(order: OrderWithProducts) { fun payForOrder(order: OrderWithProducts) {
val model = order.order val model = order.order
@ -46,28 +46,28 @@ class CartViewModel @Inject constructor(
} }
fun removeProductFromOrder(order: OrderWithProducts, productId: Int) { fun removeProductFromOrder(order: OrderWithProducts, productId: Int) {
val model = order.orderWithProducts[productId].orderProductModel // val model = order.orderWithProducts[productId].orderProductModel
if(model.quantity == 1) { // if(model.quantity == 1) {
// delete // // delete
viewModelScope.launch { // viewModelScope.launch {
orderProductRepository.delete(model) // orderProductRepository.delete(model)
} // }
} // }
else{ // else{
// update // // update
model.quantity -= 1 // model.quantity -= 1
viewModelScope.launch { // viewModelScope.launch {
orderProductRepository.update(model) // orderProductRepository.update(model)
} // }
} // }
} }
fun addProductToOrder(order: OrderWithProducts, productId: Int) { fun addProductToOrder(order: OrderWithProducts, productId: Int) {
val model = order.orderWithProducts[productId].orderProductModel // val model = order.orderWithProducts[productId].orderProductModel
// update // // update
model.quantity += 1 // model.quantity += 1
viewModelScope.launch { // viewModelScope.launch {
orderProductRepository.update(model) // orderProductRepository.update(model)
} // }
} }
} }

View File

@ -34,18 +34,18 @@ class HomeViewModel @Inject constructor(
} }
fun addProductToCart(productId: Int, userId: String) { fun addProductToCart(productId: Int, token: String) {
if (userId == "null") return
viewModelScope.launch { viewModelScope.launch {
val product = productRepository.getById(productId).first() val product = productRepository.getById(productId).first()
val order = orderRepository.getUnpaidByUser(userId.toInt()).first() val order = orderRepository.getUnpaidByUser(token)
if (order == null) { if (order == null) {
val calendar: Calendar = Calendar.getInstance() val calendar: Calendar = Calendar.getInstance()
calendar.time = Date() calendar.time = Date()
calendar.add(Calendar.HOUR_OF_DAY, 4) calendar.add(Calendar.HOUR_OF_DAY, 4)
val newOrderId = orderRepository.insert(OrderModel(null, OrderStatus.Неоплачено.name, userId.toInt(),calendar.time)) val newOrder = orderRepository.insert(token, OrderModel(null, OrderStatus.Неоплачено.name, null, calendar.time.toString()))
orderProductRepository.insert(OrderProductModel(newOrderId.toInt(), productId, 1, product.price)) if (newOrder != null) {
orderProductRepository.insert(token, OrderProductModel(newOrder.id!!, productId, 1, product.price))
}
} }
else { else {
var isAlreadyAdded = false var isAlreadyAdded = false
@ -54,12 +54,12 @@ class HomeViewModel @Inject constructor(
val model = prod.orderProductModel val model = prod.orderProductModel
model.quantity += 1 model.quantity += 1
model.totalPrice += prod.product.price model.totalPrice += prod.product.price
orderProductRepository.update(model) orderProductRepository.update(token, model)
isAlreadyAdded = true isAlreadyAdded = true
} }
} }
if (!isAlreadyAdded) { if (!isAlreadyAdded) {
orderProductRepository.insert(OrderProductModel(order.order.id!!, productId, 1, product.price)) orderProductRepository.insert(token, OrderProductModel(order.order.id!!, productId, 1, product.price))
} }
} }
} }