EPHEC-Enovatech/sensorygarden-api

View on GitHub
app/controllers/devices_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
class DevicesController < ApplicationController

    before_action :authenticate_user

    def index
        devices = Device.all
        render json: { status: "SUCCESS", message: "All devices currently in DB", data: devices }, status: :ok
    end

    def show
        if check_current_user(params[:user_id])
            devices = Device.where(user_id: params[:user_id]) 
            if !devices.blank?
                render json: { status: "SUCCESS", message: "All devices currently assigned to requested user", data: devices }, status: :ok
            else
                raise(ActiveRecord::RecordNotFound)
            end
        end
    end

    def create
        return unless check_current_user(params[:user_id])
        return unless check_checksum(params[:checksum].to_i, params[:device_id])
        device = Device.new(device_params)
        begin
            device.save
        rescue ActiveRecord::InvalidForeignKey => exception
            render json: { status: 'ERROR', message: 'Erreur : le user-id n\'existe pas', data: exception.message }, status: :not_found
        rescue ActiveRecord::RecordNotUnique => exception
            render json: { status: 'ERROR', message: 'Erreur : ce Sensory Captor existe déjà', data: exception.message }, status: :unprocessable_entity
        else
            render json: { status: 'SUCCESS', message: "Sauvegarde réussie !", data: device }, status: :ok
        end
    end

    def create_checksum
        if check_current_isAdmin?
            if !params[:device_id].blank?
                render json: { status: 'SUCCESS', message: 'Generated checksum', data: gen_checksum(params[:device_id]) }, status: :ok
            else
                render json: { status: 'ERROR', message: 'Missing parameter' }, status: :unprocessable_entity
            end
        end
    end

    def update
        device = Device.find_by(device_id: params[:id])
        if device
            if check_current_user(device.user_id)
                device.update_attributes(device_params)
                render json: { status: "SUCCESS", message: "Votre Sensory Captor a bien été mis à jour", data: device }, status: :ok
            end
        else
            render json: { status: "ERROR", message: "Impossible de modifier votre Sensory Captor" }, status: :not_found
        end
    end

    def destroy
        device = Device.find_by(device_id: params[:id])
        if device
            if check_current_user(device.user_id)
                device.destroy
                render json: { status: "SUCCESS", message: "Sensory Captor supprimé", data: device }, status: :ok
            end
        else 
            render json: { status: "ERROR", message: "Impossible de supprimer ce Sensory Captor" }, status: :not_found
        end
    end

    private

    def device_params
        params.permit(:user_id, :device_id, :deviceName)
    end

    def check_checksum(checksum, param)
        if checksum.blank? || param.blank?
            render json: { status: 'ERROR', message: "Erreur : Le numéro et/ou la vérification ne peuvent être vide" }, status: :unprocessable_entity
            return false
        else
            if checksum === gen_checksum(param)
                return true
            else
                render json: { status: 'ERROR', message: "Erreur : Le code de vérification est incorrecte"}, status: :unprocessable_entity
                return false
            end
        end
    end

    def gen_checksum(param)
        result = 0
        param.length.times do |i|
            result += param[i].ord*(i+1)
        end
        return result%97
    end

end