Files
aperonight/app/controllers/api/v1/events_controller.rb

100 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
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