From 45c3fadd930a474951bd918a50e1ea2b00af75c7 Mon Sep 17 00:00:00 2001 From: ankonym Date: Tue, 25 Aug 2015 14:11:00 +0200 Subject: Make sure codes can only be used once, fix validations We introduced a count on invite codes to make sure that (at the moment) codes can only be used once. (The code will also allow multi-use codes in the future.) Also, some of our validations weren't validating against the correct data, which is now fixed. --- app/models/account.rb | 5 +++-- app/models/invite_code.rb | 3 +++ app/models/invite_code_validator.rb | 20 ++++++++++++++++++-- app/models/user.rb | 2 ++ 4 files changed, 26 insertions(+), 4 deletions(-) (limited to 'app/models') diff --git a/app/models/account.rb b/app/models/account.rb index af470ed..a57e3f7 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -1,7 +1,7 @@ # -# The Account model takes care of the livecycle of a user. +# The Account model takes care of the lifecycle of a user. # It composes a User record and it's identity records. -# It also allows for other engines to hook into the livecycle by +# It also allows for other engines to hook into the lifecycle by # monkeypatching the create, update and destroy methods. # There's an ActiveSupport load_hook at the end of this file to # make this more easy. @@ -19,6 +19,7 @@ class Account identity = nil user = nil user = User.new(attrs) + user.save if !user.tmp? && user.persisted? identity = user.identity diff --git a/app/models/invite_code.rb b/app/models/invite_code.rb index d52436f..30a6498 100644 --- a/app/models/invite_code.rb +++ b/app/models/invite_code.rb @@ -3,10 +3,13 @@ require 'coupon_code' class InviteCode < CouchRest::Model::Base use_database 'invite_codes' property :invite_code, String, :read_only => true + property :invite_count, Integer, :default => 0, :accessible => true + timestamps! design do view :by_invite_code + view :by_invite_count end def initialize(attributes = {}, options = {}) diff --git a/app/models/invite_code_validator.rb b/app/models/invite_code_validator.rb index 978d3f5..73c333a 100644 --- a/app/models/invite_code_validator.rb +++ b/app/models/invite_code_validator.rb @@ -1,7 +1,17 @@ class InviteCodeValidator < ActiveModel::Validator def validate(user) - if not_existent?(user.invite_code) + + user_invite_code = InviteCode.find_by_invite_code user.invite_code + + if not_existent?(user_invite_code.invite_code) add_error_to_user("This is not a valid code", user) + + elsif count_greater_than_zero?(user_invite_code.invite_count) + add_error_to_user("This code has already been used", user) + + else + user_invite_code.invite_count += 1 + user_invite_code.save end end @@ -10,7 +20,13 @@ class InviteCodeValidator < ActiveModel::Validator InviteCode.find_by_invite_code(code) == nil end + def count_greater_than_zero?(code) + code > 0 + end + def add_error_to_user(error, user) user.errors[:invite_code] << error end -end \ No newline at end of file +end + + diff --git a/app/models/user.rb b/app/models/user.rb index 06e1a0f..a4dd132 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -39,8 +39,10 @@ class User < CouchRest::Model::Base :email => true, :mx_with_fallback => true + validates_with InviteCodeValidator + timestamps! design do -- cgit v1.2.3