X-Git-Url: https://nos-oignons.net/gitweb/gestion-adh.git/blobdiff_plain/ca091d07cdf75c8637229b11c5bafdeaa79bb8a2..f6e098c942a89d011c0875783bd0d0db54e4b67a:/lib/nos_oignons/subscriptions.rb diff --git a/lib/nos_oignons/subscriptions.rb b/lib/nos_oignons/subscriptions.rb index eef7946..de4ddf0 100644 --- a/lib/nos_oignons/subscriptions.rb +++ b/lib/nos_oignons/subscriptions.rb @@ -1,25 +1,65 @@ require 'safe_yaml' SafeYAML::OPTIONS[:default_mode] = :safe -SUBSCRIPTIONS_ROOT = 'Membres' +module NosOignons + SUBSCRIPTIONS_ROOT = 'Membres' + SUBSCRIPTION_FIELDS = [:name, :address, :email, :membership_fee_paid_on] + SUBSCRIPTION_MANDATORY_FIELDS = [:name, :email] -def is_valid_subscription?(content) - return false if content.length == 0 - return false unless content.start_with?("---\n") - begin - data = YAML.load(content) - rescue ArgumentError - # Parse error - return false - end - ['name', 'email'].each do |key| - return false unless data.include?(key) - end - true -end + class Subscription < Struct.new(*SUBSCRIPTION_FIELDS) + class << self + def all + Dir.glob("#{SUBSCRIPTIONS_ROOT}/*.mdwn").sort.collect do |file| + subscription_id = File.basename(file).gsub(/\.mdwn$/, '') + Subscription.new(subscription_id) + end + end + + def filename_for_id(subscription_id) + "Membres/%06d.mdwn" % subscription_id + end + + def read_from_git(ref, file) + IO.popen(['git', 'show', "#{ref}:#{file}"]) do |f| + subscription_id = File.basename(file).gsub(/\.mdwn$/, '') + Subscription.new(subscription_id, f.read) + end + end + end + + attr_reader :subscription_id + + def initialize(subscription_id, page_content=nil) + unless subscription_id =~ /\A\d{6}\z/ + raise ArgumentError.new('bad subscription id format') + end + @subscription_id = subscription_id + unless page_content + page_content = File.open(Subscription.filename_for_id(subscription_id)).read + end + unless page_content.start_with?("---\n") + raise ArgumentError.new('content is not a proper YAML document') + end + data = YAML.load(page_content) + SUBSCRIPTION_FIELDS.each do |field| + self[field] = data[field.to_s] + end + # Immutability for the win + SUBSCRIPTION_FIELDS.each do |field| + instance_eval{ undef :"#{field}=" } + end + SUBSCRIPTION_MANDATORY_FIELDS.each do |sym| + raise ArgumentError.new('missing mandatory fields') unless self[sym] + end + if membership_fee_paid_on && !membership_fee_paid_on.is_a?(Date) + raise ArgumentError.new('membership_fee_paid_on is not a date') + end + end -def is_valid_subscription_file?(ref, file) - IO.popen(['git', 'show', "#{ref}:#{file}"]) do |f| - is_valid_subscription?(f.read) + def up_to_date? + now = Time.now + last_year = Time.new(now.year - 1, now.month, now.day).to_date + membership_fee_paid_on && last_year < membership_fee_paid_on + end end end