@@ -241,7 +241,7 @@ type VenueListResponse struct {
241241// @Param limit query int false "Items per page" default(7)
242242// @Success 200 {array} VenueListResponse
243243//
244- // @Security ApiKeyAuth
244+ // @Security ApiKeyAuth
245245//
246246// @Router /venues/list-venues [get]
247247func (app * application ) listVenuesHandler (w http.ResponseWriter , r * http.Request ) {
@@ -336,8 +336,6 @@ func nullString(s string) *string {
336336// 3. Update the venue record with the returned image URLs.
337337// If an error occurs at any external step, the venue is deleted to ensure consistency.
338338func (app * application ) CreateAndUploadVenue (ctx context.Context , venue * store.Venue , files []* multipart.FileHeader , w http.ResponseWriter , r * http.Request ) error {
339- // Step 1: Create the venue in the database (without images).
340- fmt .Print ("calling database for Create" )
341339 if err := app .store .Venues .Create (ctx , venue ); err != nil {
342340 return fmt .Errorf ("error creating venue: %w" , err )
343341 }
@@ -352,7 +350,6 @@ func (app *application) CreateAndUploadVenue(ctx context.Context, venue *store.V
352350 return fmt .Errorf ("error uploading images: %w" , err )
353351 }
354352
355- fmt .Print ("calling database to updateImageURLs" )
356353 // Step 3: Update the venue with the uploaded image URLs.
357354 if err := app .store .Venues .UpdateImageURLs (ctx , venue .ID , imageUrls ); err != nil {
358355 // Compensate: Delete the venue if updating image URLs fails.
@@ -390,6 +387,7 @@ func (app *application) CreateAndUploadVenue(ctx context.Context, venue *store.V
390387// @Security ApiKeyAuth
391388// @Router /venues [post]
392389func (app * application ) createVenueHandler (w http.ResponseWriter , r * http.Request ) {
390+ fmt .Println ("🚀 Entering createVenueHandler" )
393391 var payload CreateVenuePayload
394392
395393 // Parse form and JSON payload from multipart form.
@@ -399,19 +397,15 @@ func (app *application) createVenueHandler(w http.ResponseWriter, r *http.Reques
399397 return
400398 }
401399
400+ fmt .Printf ("🎾 Parsed payload: %+v, %d files\n " , payload , len (files ))
401+ //for debug only
402+ for _ , fh := range files {
403+ fmt .Printf ("📷 got file: %q (%d bytes)\n " , fh .Filename , fh .Size )
404+ }
405+
402406 // Retrieve the current user (owner) from the request context.
403407 user := getUserFromContext (r )
404-
405- // Check for an existing venue with the same name for this owner.
406- exists , err := app .store .Venues .CheckIfVenueExists (r .Context (), payload .Name , user .ID )
407- if err != nil {
408- app .internalServerError (w , r , err )
409- return
410- }
411- if exists {
412- app .alreadyExistVenue (w , r , fmt .Errorf ("a venue with this name already exists for this owner" ))
413- return
414- }
408+ fmt .Println ("👤 current user:" , user .ID )
415409
416410 // Prepare the venue model without image URLs initially.
417411 venue := & store.Venue {
@@ -427,12 +421,16 @@ func (app *application) createVenueHandler(w http.ResponseWriter, r *http.Reques
427421 // ImageURLs field remains empty until updated.
428422 }
429423
424+ fmt .Println ("🏗️ About to Create venue in DB:" , venue )
425+
430426 // Use the SAGA pattern to create the venue record and upload images externally.
431427 if err := app .CreateAndUploadVenue (r .Context (), venue , files , w , r ); err != nil {
432428 app .internalServerError (w , r , err )
433429 return
434430 }
435431
432+ fmt .Println ("✅ Venue created successfully:" , venue .ID )
433+
436434 // Return a JSON response with the created venue details.
437435 if err := app .jsonResponse (w , http .StatusCreated , venue ); err != nil {
438436 app .internalServerError (w , r , err )
@@ -515,3 +513,56 @@ func (app *application) getVenueDetailHandler(w http.ResponseWriter, r *http.Req
515513 return
516514 }
517515}
516+
517+ // -----------------------------------------------
518+ // HTTP Handler for Venue Deletion
519+ // -----------------------------------------------
520+
521+ // deleteVenueHandler handles deletion of a venue and its associated images from Cloudinary.
522+
523+ // DeleteVenue godoc
524+ //
525+ // @Summary Delete a venue from the system
526+ // @Description Deletes a venue by ID and removes all associated images from Cloudinary.
527+ // @Tags Venue-Owner
528+ // @Produce json
529+ // @Param venueID path int true "Venue ID"
530+ // @Success 200 {object} map[string]string "Venue deleted successfully"
531+ // @Failure 400 {object} error "Invalid venue ID"
532+ // @Failure 401 {object} error "Unauthorized"
533+ // @Failure 404 {object} error "Venue not found"
534+ // @Failure 500 {object} error "Internal server error"
535+ // @Security ApiKeyAuth
536+ // @Router /venues/{venueID} [delete]
537+ func (app * application ) deleteVenueHandler (w http.ResponseWriter , r * http.Request ) {
538+ venueIDStr := chi .URLParam (r , "venueID" )
539+
540+ // Convert venueID to int64
541+ venueID , err := strconv .ParseInt (venueIDStr , 10 , 64 )
542+ if err != nil {
543+ app .badRequestResponse (w , r , fmt .Errorf ("invalid venueID: %v" , err ))
544+ return
545+ }
546+ urls , err := app .store .Venues .GetImageURLs (r .Context (), venueID )
547+ if err != nil {
548+ app .internalServerError (w , r , err )
549+ return
550+ }
551+
552+ // 2) Delete each from Cloudinary
553+ for _ , url := range urls {
554+ if err := app .deletePhotoFromCloudinary (url ); err != nil {
555+ app .logger .Warnw ("failed to delete image from Cloudinary" , "url" , url , "err" , err )
556+ app .internalServerError (w , r , err )
557+ return
558+
559+ }
560+ }
561+
562+ if err := app .store .Venues .Delete (r .Context (), venueID ); err != nil {
563+ app .internalServerError (w , r , err )
564+ return
565+ }
566+
567+ app .jsonResponse (w , http .StatusOK , map [string ]string {"message" : "Venue deleted successfully" })
568+ }
0 commit comments