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