101 lines
3.5 KiB
Ruby
Executable File
101 lines
3.5 KiB
Ruby
Executable File
# Contrôleur API pour la gestion des ressources d'événements
|
|
# Fournit des points de terminaison RESTful pour les opérations CRUD sur le modèle Event
|
|
|
|
module Api
|
|
module V1
|
|
class EventsController < ApiController
|
|
# Skip API key authentication for store_cart action (used by frontend forms)
|
|
skip_before_action :authenticate_api_key, only: [ :store_cart ]
|
|
|
|
# Charge l'évén avant certaines actions pour réduire les duplications
|
|
before_action :set_event, only: [ :show, :update, :destroy, :store_cart ]
|
|
|
|
# GET /api/v1/events
|
|
# Récupère tous les événements triés par date de création (du plus récent au plus ancien)
|
|
def index
|
|
@events = Event.all.order(created_at: :desc)
|
|
render json: @events, status: :ok
|
|
end
|
|
|
|
# GET /api/v1/events/:id
|
|
# Récupère un seul événement par son ID
|
|
# Retourne 404 si l'événement n'est pas trouvé
|
|
def show
|
|
render json: @event, status: :ok
|
|
end
|
|
|
|
# POST /api/v1/events
|
|
# Crée un nouvel événement avec les attributs fournis
|
|
# Retourne 201 Created en cas de succès avec les données de l'événement
|
|
# Retourne 422 Unprocessable Entity avec les messages d'erreur en cas d'échec
|
|
def create
|
|
@event = Event.new(event_params)
|
|
if @event.save
|
|
render json: @event, status: :created
|
|
else
|
|
render json: { errors: @event.errors.full_messages }, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
# PATCH/PUT /api/v1/events/:id
|
|
# Met à jour un événement existant avec les attributs fournis
|
|
# Retourne 200 OK avec les données mises à jour en cas de succès
|
|
# Retourne 422 Unprocessable Entity avec les messages d'erreur en cas d'échec
|
|
def update
|
|
if @event.update(event_params)
|
|
render json: @event, status: :ok
|
|
else
|
|
render json: { errors: @event.errors.full_messages }, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
# DELETE /api/v1/events/:id
|
|
# Supprime définitivement un événement
|
|
# Retourne 204 No Content en cas de succès
|
|
def destroy
|
|
@event.destroy
|
|
head :no_content
|
|
end
|
|
|
|
# POST /api/v1/events/:id/store_cart
|
|
# Store cart data in session (AJAX endpoint)
|
|
def store_cart
|
|
cart_data = params[:cart] || {}
|
|
session[:pending_cart] = cart_data
|
|
session[:event_id] = @event.id
|
|
|
|
render json: { status: "success", message: "Cart stored successfully" }
|
|
rescue => e
|
|
error_message = e.message.present? ? e.message : "Erreur inconnue"
|
|
Rails.logger.error "Error storing cart: #{error_message}"
|
|
render json: { status: "error", message: "Failed to store cart" }, status: 500
|
|
end
|
|
|
|
private
|
|
|
|
# Trouve un événement par son ID ou retourne 404 Introuvable
|
|
# Utilisé comme before_action pour les actions show, update et destroy
|
|
def set_event
|
|
@event = Event.find(params[:id])
|
|
rescue ActiveRecord::RecordNotFound
|
|
render json: { error: "Événement non trouvé" }, status: :not_found
|
|
end
|
|
|
|
# Paramètres forts pour la création et la mise à jour des événements
|
|
# Liste blanche des attributs autorisés pour éviter les vulnérabilités de mass assignment
|
|
def event_params
|
|
params.require(:event).permit(
|
|
:name,
|
|
:description,
|
|
:state,
|
|
:venue_name,
|
|
:venue_address,
|
|
:latitude,
|
|
:longitude,
|
|
:featured
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|