This commit is contained in:
2026-04-06 22:13:54 +00:00
commit a0d0b9b7d7
116 changed files with 2572 additions and 0 deletions

0
app/assets/images/.keep Normal file
View File

View File

@@ -0,0 +1,10 @@
/*
* This is a manifest file that'll be compiled into application.css.
*
* With Propshaft, assets are served efficiently without preprocessing steps. You can still include
* application-wide styles in this file, but keep in mind that CSS precedence will follow the standard
* cascading order, meaning styles declared later in the document or manifest will override earlier ones,
* depending on specificity.
*
* Consider organizing styles into separate files for maintainability.
*/

View File

@@ -0,0 +1,5 @@
class ApplicationController < ActionController::Base
# Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
allow_browser versions: :modern
skip_forgery_protection
end

View File

@@ -0,0 +1,51 @@
class AsociadoController < ApplicationController
before_action :set_asociado, only: [:show, :update, :destroy]
# GET /asociado
def index
@asociados = Asociado.all
render json: @asociados
end
# GET /asociado/1
def show
render json: @asociado
end
# POST /asociado
def create
@asociado = Asociado.new(asociado_params)
if @asociado.save
render json: @asociado, status: :created, location: @asociado
else
render json: @asociado.errors, status: :unprocessable_entity
end
end
# PATCH/PUT /asociado/1
def update
if @asociado.update(asociado_params)
render json: @asociado
else
render json: @asociado.errors, status: :unprocessable_entity
end
end
# DELETE /asociado/1
def destroy
@asociado.destroy
end
private
# Use callbacks to share common setup or constraints between actions.
def set_asociado
@asociado = Asociado.find(params[:id])
end
# Only allow a trusted parameter "white list" through.
def asociado_params
params.permit(:nombre, :email, :ciudad, :estado, :direccion, :detalles, :ejemplo_de_precios, :tiempo_de_entregas, :telefono, :contacto_de_preferencia_id, :categoria_id, :status_id, :notas, :verificado)
end
end

View File

@@ -0,0 +1,5 @@
class CategoriaController < ApplicationController
def index
render json: Categoria.all
end
end

View File

View File

@@ -0,0 +1,6 @@
class ContactoDePreferenciaController < ApplicationController
def index
@contactos_de_preferencia = ContactoDePreferencia.all
render :json => @contactos_de_preferencia
end
end

View File

@@ -0,0 +1,14 @@
class NotificationController < ApplicationController
# POST /api/notification
def create
puts "Se ha creado una notificación, se va a crear una solicitud"
# se recibe: {"id" => 1, "user_id" => 2, "book_id" => 1, "returned" => 1, "created_at" => "2025-12-30T23:43:23.170Z", "updated_at" => "2026-03-23T21:43:39.950Z", "notification" => {"id" => 1, "user_id" => 2, "book_id" => 1, "returned" => 1, "created_at" => "2025-12-30T23:43:23.170Z", "updated_at" => "2026-03-23T21:43:39.950Z"}}
Solicitud.new(nombre: "User_id #{params["user_id"]}", email: "draft@draft.com", ciudad: "remota", estado: "remoto", direccion: "127.0.0.1", detalles: "Lend", presupuesto: "1.00", tiempo_de_entrega: "inmediato", telefono: "ninguno", contacto_de_preferencia_id: 1, categoria_id: 1, status_id: 1, notas: "Remote call", verificado: "" ).save
render json: {message: "created"}, status: :created
end
end

View File

@@ -0,0 +1,50 @@
class SolicitudController < ApplicationController
before_action :set_solicitud, only: [:show, :update, :destroy]
# GET /solicitud
def index
@solicitudes = Solicitud.all
render :json => @solicitudes
end
# GET /solicitud/1
def show
render :json => @solicitud
end
# POST /solicitud
def create
@solicitud = Solicitud.new(solicitud_params)
if @solicitud.save
render json: @solicitud, status: :created, location: @solicitud
else
render json: @solicitud.errors, status: :unprocessable_entity
end
end
# PATCH/PUT /solicitud/1
def update
if @solicitud.update(solicitud_params)
render json: @solicitud
else
render json: @solicitud.errors, status: :unprocessable_entity
end
end
# DELETE /solicitud/1
def destroy
@solicitud.destroy
end
private
# Use callbacks to share common setup or constraints between actions.
def set_solicitud
@solicitud = Solicitud.find(params[:id])
end
# Only allow a trusted parameter "white list" through.
def solicitud_params
params.permit(:nombre, :email, :ciudad, :estado, :direccion, :detalles, :presupuesto, :tiempo_de_entrega, :telefono, :contacto_de_preferencia_id, :categoria_id, :status_id, :notas, :verificado)
end
end

View File

@@ -0,0 +1,5 @@
class StaticController < ActionController::Base
def index
render file: "#{Rails.root}/public/index.html", layout: false
end
end

View File

@@ -0,0 +1,6 @@
class StatusController < ApplicationController
def index
@status = Status.all
render :json => @status
end
end

View File

@@ -0,0 +1,2 @@
module ApplicationHelper
end

View File

@@ -0,0 +1,3 @@
// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails
import "@hotwired/turbo-rails"
import "controllers"

View File

@@ -0,0 +1,9 @@
import { Application } from "@hotwired/stimulus"
const application = Application.start()
// Configure Stimulus development experience
application.debug = false
window.Stimulus = application
export { application }

View File

@@ -0,0 +1,7 @@
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
connect() {
this.element.textContent = "Hello World!"
}
}

View File

@@ -0,0 +1,4 @@
// Import and register all your controllers from the importmap via controllers/**/*_controller
import { application } from "controllers/application"
import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
eagerLoadControllersFrom("controllers", application)

View File

@@ -0,0 +1,7 @@
class ApplicationJob < ActiveJob::Base
# Automatically retry jobs that encountered a deadlock
# retry_on ActiveRecord::Deadlocked
# Most jobs are safe to ignore if the underlying records are no longer available
# discard_on ActiveJob::DeserializationError
end

View File

@@ -0,0 +1,4 @@
class ApplicationMailer < ActionMailer::Base
default from: "from@example.com"
layout "mailer"
end

View File

@@ -0,0 +1,3 @@
class ApplicationRecord < ActiveRecord::Base
primary_abstract_class
end

5
app/models/asociado.rb Executable file
View File

@@ -0,0 +1,5 @@
class Asociado < ApplicationRecord
belongs_to :contacto_de_preferencia
belongs_to :categoria
belongs_to :status
end

2
app/models/categoria.rb Executable file
View File

@@ -0,0 +1,2 @@
class Categoria < ApplicationRecord
end

View File

View File

@@ -0,0 +1,2 @@
class ContactoDePreferencia < ApplicationRecord
end

5
app/models/solicitud.rb Executable file
View File

@@ -0,0 +1,5 @@
class Solicitud < ApplicationRecord
belongs_to :contacto_de_preferencia
belongs_to :categoria
belongs_to :status
end

2
app/models/status.rb Executable file
View File

@@ -0,0 +1,2 @@
class Status < ApplicationRecord
end

View File

@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html>
<head>
<title><%= content_for(:title) || "Rails Solicitudes" %></title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= yield :head %>
<%# Enable PWA manifest for installable apps (make sure to enable in config/routes.rb too!) %>
<%#= tag.link rel: "manifest", href: pwa_manifest_path(format: :json) %>
<link rel="icon" href="/icon.png" type="image/png">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/icon.png">
<%# Includes all stylesheet files in app/assets/stylesheets %>
<%= stylesheet_link_tag :app, "data-turbo-track": "reload" %>
<%= javascript_importmap_tags %>
</head>
<body>
<%= yield %>
</body>
</html>

View File

@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
/* Email styles need to be inline */
</style>
</head>
<body>
<%= yield %>
</body>
</html>

View File

@@ -0,0 +1 @@
<%= yield %>

View File

@@ -0,0 +1,22 @@
{
"name": "RailsSolicitudes",
"icons": [
{
"src": "/icon.png",
"type": "image/png",
"sizes": "512x512"
},
{
"src": "/icon.png",
"type": "image/png",
"sizes": "512x512",
"purpose": "maskable"
}
],
"start_url": "/",
"display": "standalone",
"scope": "/",
"description": "RailsSolicitudes.",
"theme_color": "red",
"background_color": "red"
}

View File

@@ -0,0 +1,26 @@
// Add a service worker for processing Web Push notifications:
//
// self.addEventListener("push", async (event) => {
// const { title, options } = await event.data.json()
// event.waitUntil(self.registration.showNotification(title, options))
// })
//
// self.addEventListener("notificationclick", function(event) {
// event.notification.close()
// event.waitUntil(
// clients.matchAll({ type: "window" }).then((clientList) => {
// for (let i = 0; i < clientList.length; i++) {
// let client = clientList[i]
// let clientPath = (new URL(client.url)).pathname
//
// if (clientPath == event.notification.data.path && "focus" in client) {
// return client.focus()
// }
// }
//
// if (clients.openWindow) {
// return clients.openWindow(event.notification.data.path)
// }
// })
// )
// })