Skip to content

Commit e59ecea

Browse files
committedJun 10, 2024
migration to new database, refacto
1 parent 735a121 commit e59ecea

24 files changed

+433
-203
lines changed
 

‎app/src/main/java/com/example/ticketapp/MainActivity.kt

+80-49
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,14 @@ import android.content.IntentFilter
4646
import android.nfc.NdefMessage
4747
import android.nfc.NfcAdapter
4848
import android.os.Bundle
49-
import android.util.Log
5049
import androidx.activity.viewModels
5150
import androidx.compose.foundation.layout.Arrangement
5251
import androidx.compose.foundation.layout.Row
5352
import androidx.compose.foundation.layout.fillMaxWidth
5453
import androidx.compose.foundation.lazy.LazyColumn
5554
import androidx.compose.material3.TextButton
56-
import androidx.compose.runtime.LaunchedEffect
5755
import androidx.compose.ui.Alignment
58-
import androidx.navigation.NavController
56+
import androidx.lifecycle.lifecycleScope
5957
import androidx.navigation.compose.NavHost
6058
import androidx.navigation.compose.composable
6159
import androidx.navigation.compose.rememberNavController
@@ -68,11 +66,15 @@ import com.example.ticketapp.models.Event
6866
import com.example.ticketapp.models.Ticket
6967
import com.example.ticketapp.models.User
7068
import com.example.ticketapp.repository.EventRepository
69+
import com.example.ticketapp.repository.TicketRepository
7170
import com.example.ticketapp.viewmodel.EventViewModel
7271
import com.stripe.android.PaymentConfiguration
73-
import kotlinx.coroutines.GlobalScope
7472
import kotlinx.coroutines.launch
7573
import com.example.ticketapp.viewmodel.EventViewModelFactory
74+
import com.example.ticketapp.viewmodel.TicketViewModel
75+
import com.example.ticketapp.viewmodel.TicketViewModelFactory
76+
import kotlinx.coroutines.Dispatchers
77+
import kotlinx.coroutines.withContext
7678

7779
class MainActivity : ComponentActivity() {
7880

@@ -81,11 +83,13 @@ class MainActivity : ComponentActivity() {
8183
private lateinit var nfcPendingIntent: PendingIntent
8284
private lateinit var intentFiltersArray: Array<IntentFilter>
8385
private val eventDao by lazy { AppDatabase.getDatabase(this).eventDao() }
84-
private val repository by lazy { EventRepository(eventDao) }
86+
private val ticketDao by lazy { AppDatabase.getDatabase(this).ticketDao() }
87+
private val eventRepository by lazy { EventRepository(eventDao) }
88+
private val ticketRepository by lazy { TicketRepository(ticketDao) }
8589
private val eventViewModel: EventViewModel by viewModels {
86-
EventViewModelFactory(repository)
90+
EventViewModelFactory(eventRepository)
8791
}
88-
92+
val viewModel: TicketViewModel by viewModels { TicketViewModelFactory(ticketRepository) }
8993
override fun onCreate(savedInstanceState: Bundle?) {
9094
super.onCreate(savedInstanceState)
9195

@@ -136,7 +140,8 @@ class MainActivity : ComponentActivity() {
136140
}
137141

138142
// Appel de la fonction populateDatabase
139-
populateDatabase()
143+
populateDatabase()
144+
140145

141146
// initialisation de l'adaptateur NFC
142147
nfcAdapter = NfcAdapter.getDefaultAdapter(this)
@@ -193,15 +198,24 @@ class MainActivity : ComponentActivity() {
193198
}
194199

195200
private fun populateDatabase() {
196-
// val eventDao = AppDatabase.getDatabase(this).eventDao()
201+
val eventDao = AppDatabase.getDatabase(this).eventDao()
197202

198203
// Créez des instances de Event
199-
// val event1 = Event(eventId = 1, name = "Les Ardentes", description = " Les Ardentes Festival in Moncton is a must for music fans. Every year, this event brings together internationally renowned artists and emerging talents, offering an eclectic programme ranging from rap and rock to electro and pop.", dateTime = "21-23 Juin 2024", location = "123 Rue Main, Street Moncton")
200-
// val event2 = Event(eventId = 2, name = "Festival Mural", description = "he Mural Festival is an annual event celebrating urban art and creativity, attracting artists from around the world to transform public spaces with vibrant, large-scale murals. Held in a dynamic city environment, the festival features live painting sessions, art exhibitions, workshops, and interactive installations. It aims to engage the community, promote cultural exchange, and rejuvenate urban landscapes through the power of art. ", dateTime = "10-22 Juin 2024", location = "67 Rue Main, Bathurst K.C Irving")
204+
val event1 = Event(eventId = 1, name = "Les Ardentes", description = " Les Ardentes Festival in Moncton is a " +
205+
"must for music fans. Every year, this event brings together " +
206+
"internationally renowned artists and emerging talents, " +
207+
"offering an eclectic programme ranging " +
208+
"from rap and rock to electro and pop.", date= "21-23 Juin 2024", hour= "19h - 23h", location = "123 Rue Main, Street Moncton")
209+
210+
val event2 = Event(eventId = 2, name = "Festival Mural", description = "he Mural Festival is an annual event celebrating urban " +
211+
"art and creativity, attracting artists from around the world to transform public spaces with vibrant, " +
212+
"large-scale murals. Held in a dynamic city environment, " +
213+
"the festival features live painting sessions, art exhibitions, " +
214+
"workshops, and interactive installations. It aims to engage the community, " +
215+
"promote cultural exchange, and rejuvenate urban landscapes through the power of art. ", date = "10-22 Juin 2024", hour="16h00 - 22h00", location = "67 Rue Main, Bathurst K.C Irving")
201216
// GlobalScope.launch {
202217
// // Inserenles événements dans la base de données
203-
//// eventDao.insertEvent(event1)
204-
//// eventDao.insertEvent(event2)
218+
205219
// // Recupere les events de ma db
206220
//// val events = eventDao.getAllEvents()
207221
//
@@ -219,41 +233,45 @@ class MainActivity : ComponentActivity() {
219233
val ticketDao = AppDatabase.getDatabase(this).ticketDao()
220234

221235
// remplir les donneees pour ma table user
222-
val userDao = AppDatabase.getDatabase(this).userDao()
236+
//val userDao = AppDatabase.getDatabase(this).userDao()
223237

224238
// creer des instances de User
225239
val user1 = User(userId = 1, firstName = "John", lastName = "Doe", email = "johndoe@gamil.com", password = "123456")
226240
val user2 = User(userId = 2, firstName = "Jane", lastName = "Doe", email = "janedoe@gamil.com", password = "123456")
227241
val user3 = User(userId = 3, firstName = "Alice", lastName = "Doe", email = "alice@gmail.com", password = "102030")
228242
// creer des instances de Ticket
229-
val ticket1 = Ticket(ticketId = 1, typeTicket = "Standard", price = 36.50, seatNumber = 12, section = 9, nbreTickets = 5)
230-
val ticket2 = Ticket(ticketId = 2, typeTicket = "VIP", price = 124.50, seatNumber = 5, section = 1, nbreTickets = 5)
231-
val ticket3 = Ticket(ticketId = 3, typeTicket = "Standard", price = 65.50, seatNumber = 18, section = 5, nbreTickets = 5)
232-
val ticket4 = Ticket(ticketId = 4, typeTicket = "VIP", price = 154.50, seatNumber = 9, section = 2, nbreTickets = 5)
233-
val ticket5 = Ticket(ticketId = 5, typeTicket = "Standard", price = 40.50, seatNumber = 15, section = 10, nbreTickets = 5)
234-
val ticket6 = Ticket(ticketId = 6, typeTicket = "VIP", price = 118.50, seatNumber = 8, section = 3, nbreTickets = 5)
235-
val ticket7 = Ticket(ticketId = 7, typeTicket = "Standard", price = 60.50, seatNumber = 21, section = 9, nbreTickets = 5)
236-
val ticket8 = Ticket(ticketId = 8, typeTicket = "VIP", price = 185.50, seatNumber = 7, section = 1, nbreTickets = 5)
237-
val ticket9 = Ticket(ticketId = 9, typeTicket = "Standard", price = 56.50, seatNumber = 11, section = 10, nbreTickets = 5)
238-
val ticket10 = Ticket(ticketId = 10, typeTicket = "VIP", price = 150.50, seatNumber = 8, section = 2, nbreTickets = 5)
239-
GlobalScope.launch {
240-
// Inserer les tickets dans la base de donnees
241-
// ticketDao.insertTicket(ticket1)
242-
// ticketDao.insertTicket(ticket2)
243-
// ticketDao.insertTicket(ticket3)
244-
// ticketDao.insertTicket(ticket4)
245-
// ticketDao.insertTicket(ticket5)
246-
// ticketDao.insertTicket(ticket6)
247-
// ticketDao.insertTicket(ticket7)
248-
// ticketDao.insertTicket(ticket8)
249-
// ticketDao.insertTicket(ticket9)
250-
// ticketDao.insertTicket(ticket10)
251-
252-
// Inserer les users dans la base de donnees
253-
userDao.insert(user1)
254-
userDao.insert(user2)
255-
userDao.insert(user3)
256-
243+
val ticket1 = Ticket(ticketId = 1, eventCreatorId = 1, typeTicket = "Standard", price = 36.50, seatNumber = 12, section = "A9")
244+
val ticket2 = Ticket(ticketId = 2, eventCreatorId = 2,typeTicket = "VIP", price = 124.50, seatNumber = 5, section = "C2")
245+
val ticket3 = Ticket(ticketId = 3, eventCreatorId = 2, typeTicket = "Standard", price = 65.50, seatNumber = 18, section = "B1")
246+
val ticket4 = Ticket(ticketId = 4, eventCreatorId = 1, typeTicket = "VIP", price = 154.50, seatNumber = 9, section = "B2")
247+
val ticket5 = Ticket(ticketId = 5, eventCreatorId = 1, typeTicket = "Standard", price = 40.50, seatNumber = 15, section = "A1")
248+
val ticket6 = Ticket(ticketId = 6, eventCreatorId = 2 , typeTicket = "VIP", price = 118.50, seatNumber = 8, section = "C3")
249+
val ticket7 = Ticket(ticketId = 7, eventCreatorId = 2 , typeTicket = "Standard", price = 60.50, seatNumber = 21, section = "A1")
250+
val ticket8 = Ticket(ticketId = 8, eventCreatorId = 1 , typeTicket = "VIP", price = 185.50, seatNumber = 7, section = "D5")
251+
val ticket9 = Ticket(ticketId = 9, eventCreatorId = 1 , typeTicket = "Standard", price = 56.50, seatNumber = 11, section = "H2")
252+
val ticket10 = Ticket(ticketId = 10, eventCreatorId = 2, typeTicket = "VIP", price = 150.50, seatNumber = 8, section = "G7")
253+
lifecycleScope.launch {
254+
withContext(Dispatchers.IO) {
255+
// Inserer les tickets dans la base de donnees
256+
ticketDao.insertTicket(ticket1)
257+
ticketDao.insertTicket(ticket2)
258+
ticketDao.insertTicket(ticket3)
259+
ticketDao.insertTicket(ticket4)
260+
ticketDao.insertTicket(ticket5)
261+
ticketDao.insertTicket(ticket6)
262+
ticketDao.insertTicket(ticket7)
263+
ticketDao.insertTicket(ticket8)
264+
ticketDao.insertTicket(ticket9)
265+
ticketDao.insertTicket(ticket10)
266+
267+
// Inserer les users dans la base de donnees
268+
// userDao.insert(user1)
269+
// userDao.insert(user2)
270+
// userDao.insert(user3)
271+
//
272+
// eventDao.insertEvent(event1)
273+
// eventDao.insertEvent(event2)
274+
}
257275
}
258276
}
259277
//@Preview(showSystemUi = true)
@@ -312,15 +330,28 @@ class MainActivity : ComponentActivity() {
312330
}
313331
}
314332
// Navigation vers la page de réservation de billets
315-
composable("ticketBooking") { TicketBookingScreen(navController) }
333+
// composable("ticketBooking") { TicketBookingScreen(navController) }
334+
// Navigation vers la page de réservation de billets
335+
composable("ticketBooking/{eventId}") { backStackEntry ->
336+
val eventId = backStackEntry.arguments?.getString("eventId")?.toIntOrNull()
337+
if (eventId != null) {
338+
TicketBookingScreen(navController, eventId, ticketDao, eventRepository)
339+
} else {
340+
// Gérer l'erreur
341+
}
342+
}
316343

317344
// Navigation vers la page de confirmation de réservation
318-
composable("confirmBooking/{section}/{type}/{price}") { backStackEntry ->
319-
val section = backStackEntry.arguments?.getString("section")
320-
val type = backStackEntry.arguments?.getString("type")
321-
val price = backStackEntry.arguments?.getString("price")
322-
if (section != null && type != null && price != null) {
323-
ConfirmBooking(navController, section, type, price)
345+
composable("confirmBooking/{eventId}/{eventName}/{eventDate}/{eventHour}/{ticketPrice}") { backStackEntry ->
346+
val eventId = backStackEntry.arguments?.getString("eventId")?.toIntOrNull()
347+
val eventName = backStackEntry.arguments?.getString("eventName")
348+
val eventDate = backStackEntry.arguments?.getString("eventDate")
349+
val eventHour = backStackEntry.arguments?.getString("eventHour")
350+
val ticketPrice = backStackEntry.arguments?.getString("ticketPrice")?.toDoubleOrNull()
351+
if (eventId != null && eventName != null && eventDate != null && eventHour != null) {
352+
if (ticketPrice != null) {
353+
ConfirmBooking(navController, eventName, eventDate, eventHour, ticketPrice)
354+
}
324355
} else {
325356
// Handle error
326357
}

‎app/src/main/java/com/example/ticketapp/components/ConfirmBooking.kt

+32-18
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import androidx.compose.ui.unit.dp
1515
import androidx.compose.ui.unit.sp
1616
import androidx.navigation.NavController
1717
import com.example.ticketapp.PaymentActivity
18+
import com.example.ticketapp.models.Event
19+
import com.example.ticketapp.models.Ticket
1820
import okhttp3.*
1921
import okhttp3.MediaType.Companion.toMediaTypeOrNull
2022
import okhttp3.RequestBody.Companion.toRequestBody
@@ -26,17 +28,23 @@ import kotlin.coroutines.suspendCoroutine
2628

2729
@SuppressLint("RememberReturnType")
2830
@Composable
29-
fun ConfirmBooking(navController: NavController, section: String, type: String, price: String) {
31+
fun ConfirmBooking(
32+
navController: NavController,
33+
eventName: String,
34+
eventDate: String,
35+
eventHour: String,
36+
ticketPrice: Double
37+
) {
3038
val paddingValue = 16.dp
3139
val spacingValue = 24.dp
3240

3341
var paymentIntentClientSecret by remember { mutableStateOf<String?>(null) }
3442
var error by remember { mutableStateOf<String?>(null) }
35-
43+
var total by remember { mutableStateOf(0.0) }
3644
val context = LocalContext.current
3745

3846
LaunchedEffect(Unit) {
39-
fetchPaymentIntent().onSuccess { clientSecret ->
47+
fetchPaymentIntent(total).onSuccess { clientSecret ->
4048
paymentIntentClientSecret = clientSecret
4149
Log.d("PaymentIntent", "Client Secret successfully set: $clientSecret")
4250
}.onFailure { paymentIntentError ->
@@ -53,9 +61,9 @@ fun ConfirmBooking(navController: NavController, section: String, type: String,
5361
verticalArrangement = Arrangement.Top,
5462
) {
5563
BookingTitle()
56-
EventCard(section, type, price)
64+
EventCard(eventName, eventDate, eventHour, ticketPrice)
5765
Spacer(modifier = Modifier.height(spacingValue))
58-
SubtotalCard()
66+
SubtotalCard(ticketPrice)
5967
Spacer(modifier = Modifier.height(spacingValue))
6068
ConfirmButton(context, paymentIntentClientSecret)
6169
}
@@ -74,7 +82,7 @@ fun BookingTitle() {
7482
}
7583

7684
@Composable
77-
fun EventCard(section: String, type: String, price: String) {
85+
fun EventCard(eventName: String, eventDate: String, eventHour: String, ticketPrice: Double) {
7886
Card(
7987
modifier = Modifier
8088
.width(300.dp)
@@ -85,20 +93,23 @@ fun EventCard(section: String, type: String, price: String) {
8593
)
8694
) {
8795
Column(modifier = Modifier.padding(15.dp)) {
88-
Text("Les Ardentes", fontWeight = FontWeight.Bold)
89-
Text(text = "Friday • June 21 • 19.00 - 22.00")
96+
Text(text = eventName, fontWeight = FontWeight.Bold)
97+
Text(text = eventDate)
9098
Spacer(modifier = Modifier.height(10.dp))
91-
Text(text = "Standard Ticket", color = Color.Gray)
92-
Text(text = "CA $${price}", fontWeight = FontWeight.Light)
99+
//Text(text = ticketPrice: Double, color = Color.Gray)
100+
Text(text = "CA $ + $ticketPrice", fontWeight = FontWeight.Light)
93101
Spacer(modifier = Modifier.height(10.dp))
94-
Text(text = "VIP $section", color = Color.Gray)
95-
Text(text = "CA $124.50", fontWeight = FontWeight.Light)
102+
//Text(text = "Quantity", color = Color.Gray)
103+
//Text(text = "CA $124.50", fontWeight = FontWeight.Light)
96104
}
97105
}
98106
}
99107

100108
@Composable
101-
fun SubtotalCard() {
109+
fun SubtotalCard(ticketPrice: Double) {
110+
val TAX_RATE = 0.15 // 15% de taxe
111+
val tax = ticketPrice * TAX_RATE
112+
val total = ticketPrice + tax
102113
Card(
103114
modifier = Modifier
104115
.width(300.dp)
@@ -112,10 +123,10 @@ fun SubtotalCard() {
112123
Row(verticalAlignment = Alignment.CenterVertically) {
113124
Text("Subtotal", fontWeight = FontWeight.Bold)
114125
Spacer(modifier = Modifier.width(120.dp))
115-
Text("CA $282.00", fontWeight = FontWeight.Bold)
126+
Text("CA $total", fontWeight = FontWeight.Bold)
116127
}
117128
Text(text = "Including taxes", modifier = Modifier.padding(top = 1.dp))
118-
Text(text = "2 Tickets : CA $64.50 + CA $124.50", modifier = Modifier.padding(top = 8.dp))
129+
Text(text = "2 Tickets : CA $ticketPrice + TAXES", modifier = Modifier.padding(top = 8.dp))
119130
}
120131
}
121132
}
@@ -146,7 +157,7 @@ fun ConfirmButton(context: android.content.Context, paymentIntentClientSecret: S
146157

147158

148159
// Methode permettant de recuperer le client secret du serveur
149-
private suspend fun fetchPaymentIntent(): Result<String> = suspendCoroutine { continuation ->
160+
private suspend fun fetchPaymentIntent(total: Double): Result<String> = suspendCoroutine { continuation ->
150161
val url = "http://10.0.2.2:4242/create-payment-intent"
151162
val ticketPrice = 15000 // valeur test a changer
152163
val ticketQuantity = 2
@@ -162,10 +173,13 @@ private suspend fun fetchPaymentIntent(): Result<String> = suspendCoroutine { co
162173
"""
163174
// requete post
164175
val mediaType = "application/json; charset=utf-8".toMediaTypeOrNull()
165-
val body = ticketBooked .toRequestBody(mediaType)
176+
val requestBody = JSONObject()
177+
.put("total", total)
178+
.toString()
179+
.toRequestBody(mediaType)
166180
val request = Request.Builder()
167181
.url(url)
168-
.post(body)
182+
.post(requestBody)
169183
.build()
170184

171185
// creer une instance de OkHttpClient et ensuite on prepare la requete

‎app/src/main/java/com/example/ticketapp/components/EventDetails.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ fun EventDetails(navController: NavController, eventId: Int, eventViewModel: Eve
4949
item { EventImage(navController, event) } // Pass event to EventImage
5050
item { Spacer(modifier = Modifier.height(10.dp)) }
5151
item { EventDescription(event.description) }
52-
item { EventInformation(event.location, event.dateTime) }
52+
item { EventInformation(event.location, event.date) }
5353
item { Spacer(modifier = Modifier.height(16.dp)) }
54-
item { BuyTicketButton(16.dp, navController) }
54+
item { BuyTicketButton(16.dp, navController, eventId) }
5555
}
5656
}
5757
}
@@ -138,7 +138,7 @@ fun EventInformation(location: String, dateTime: String) {
138138
}
139139

140140
@Composable
141-
fun BuyTicketButton(spacingValue: Dp, navController: NavController) {
141+
fun BuyTicketButton(spacingValue: Dp, navController: NavController, eventId: Int) {
142142
Row(
143143
modifier = Modifier
144144
.fillMaxWidth()
@@ -147,7 +147,7 @@ fun BuyTicketButton(spacingValue: Dp, navController: NavController) {
147147
) {
148148
Spacer(modifier = Modifier.width(spacingValue))
149149
Button(onClick = {
150-
navController.navigate("ticketBooking")
150+
navController.navigate("ticketBooking/$eventId")
151151
},
152152
modifier = Modifier.width(200.dp),
153153
colors = ButtonDefaults.buttonColors(

‎app/src/main/java/com/example/ticketapp/components/EventsSection.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fun EventsSection(eventViewModel: EventViewModel, navController: NavController)
4343
EventCard(
4444
imageRes = R.drawable.festival,
4545
title = event.name,
46-
dateAndLocation = event.dateTime,
46+
dateAndLocation = event.date + " - " + event.location,
4747
eventId = event.eventId,
4848
navController = navController
4949
)

0 commit comments

Comments
 (0)
Please sign in to comment.