Files
netig.net/routes/noyau.rb
T
2026-11-03 21:38:38 +01:00

136 lines
3.8 KiB
Ruby

class Netig
private
# Enregistrement d'une décision d'adhésion
def record_membership_decision!(r, membership_id, status)
member_id = DB[:members]
.where(account_id: rodauth.session_value)
.get(:id)
unless member_id
r.halt [403, {}, ["Accès interdit."]]
end
message = case status
when "accepted"
"La demande d'adhésion a été acceptée."
when "rejected"
"La demande d'adhésion a été refusée."
end
updated = DB[:memberships]
.where(id: membership_id, status: "pending")
.update(
status: status,
decided_at: Sequel::CURRENT_TIMESTAMP,
recorded_by: member_id
)
if updated == 1
flash["notice"] = message
else
flash["error"] = "Cette demande n'est plus en attente ou n'existe pas."
end
r.redirect "/noyau/memberships"
end
hash_branch "noyau" do |r|
require_core_member!(r)
@page_title = "Gestion de l'association — NETig"
@page_description = "Gestion collective de l'association NETig par le Noyau."
@canonical_url = "https://netig.net/noyau"
# Accueil
r.is do
r.get do
view "noyau"
end
end
# Demandes d'adhésion
r.on "memberships" do
r.is do
r.get do
@page_title = "Demandes d'adhésion — NETig"
@page_description = "Examen des demandes d'adhésion à NETig."
@canonical_url = "https://netig.net/noyau/memberships"
@memberships = DB[:memberships]
.join(:members, id: :member_id)
.join(:accounts, id: Sequel[:members][:account_id])
.where(
Sequel[:memberships][:status] => "pending",
Sequel[:accounts][:status_id] => 2
)
.select_all(:memberships)
.select_append(
Sequel[:members][:kind].as(:member_kind),
Sequel[:members][:first_name].as(:member_first_name),
Sequel[:members][:last_name].as(:member_last_name),
Sequel[:members][:organization_name].as(:member_organization_name),
Sequel[:accounts][:email].as(:account_email)
)
.order(
Sequel.asc(Sequel[:memberships][:requested_at]),
Sequel.asc(Sequel[:memberships][:id])
)
.all
view "noyau/memberships"
end
end
# Décision sur une demande
r.on Integer do |membership_id|
r.post "accept" do
record_membership_decision!(r, membership_id, "accepted")
end
r.post "reject" do
record_membership_decision!(r, membership_id, "rejected")
end
end
end
# Gestion des comptes
r.on "members" do
r.is do
r.get do
@page_title = "Comptes — NETig"
@page_description = "Consultation des comptes de l'association NETig."
@canonical_url = "https://netig.net/noyau/members"
@members = DB[:members]
.join(:accounts, id: :account_id)
.where(Sequel[:accounts][:status_id] => 2)
.select_all(:members)
.select_append(Sequel[:accounts][:email].as(:email))
.order(Sequel[:members][:id])
.all
memberships_by_member = DB[:memberships]
.order(Sequel.desc(:requested_at), Sequel.desc(:id))
.all
.group_by { |membership| membership[:member_id] }
@members.each do |member|
memberships = memberships_by_member.fetch(member[:id], [])
membership = memberships.find do |item|
%w[pending accepted].include?(item[:status])
end
membership ||= memberships.first
member[:membership_status] = membership && membership[:status]
end
view "noyau/members"
end
end
end
end
end