openbill-ruby 0.1.0 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 28f39a7f445224ead72e3e8b8a72d2f62a30f3cd
4
- data.tar.gz: ef034508c6893247f9e89b4eda58293e092b21d9
3
+ metadata.gz: b81bdc0ec906d8dd0d12577772d4a6bd3c4eabce
4
+ data.tar.gz: f79967c83942d3f7e15df4cb5e62b2ba89048193
5
5
  SHA512:
6
- metadata.gz: 334b9ab15e8f5d698cceb09357a0c245dcbd6129341ceec04a05bb78afcc50c3b5f7e59f205ca251c0badcb5db5ca0f8cb9484628db2340c2c918534e46eaa81
7
- data.tar.gz: 07d8bf25469a1e2ce3b881da68850967e8d60f3950ffdf90be0c81ec1b9d0c7ca5c2b1caa1583715cf0834fa1b271f4caa4e50cb236f05f25340353a75c48b69
6
+ metadata.gz: bc1d4999a0428e9e23ca906417a0e9f7a3891699b1884636c79f9bbc02733f0265b7d01bb1587aa4c9335dea06618134ebbb5e8e8ba9f680239e690bdb98c795
7
+ data.tar.gz: ec4e573a1ff094828af7870f493bf252314d6133182f20e32c13f37ecba2d4a7dbd7692c2efde3a3f1bcc5161ea2f592cf05a7fcaca4da6422a16e5e04e263f7
data/Gemfile CHANGED
@@ -2,3 +2,8 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in openbill.gemspec
4
4
  gemspec
5
+
6
+ gem 'rails', '~> 4.0'
7
+ gem 'sequel'
8
+ gem 'money'
9
+ gem 'money-rails', github: 'RubyMoney/money-rails'
data/README.md CHANGED
@@ -20,6 +20,12 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install openbill
22
22
 
23
+
24
+
25
+ Openbill.create_connection do
26
+ new ActiveRecord::Base.connection.instance_variable_get('@config')
27
+ end
28
+
23
29
  ## Usage
24
30
 
25
31
  TODO: Write usage instructions here
@@ -0,0 +1,20 @@
1
+ class AddOpenbill < ActiveRecord::Migration
2
+ def up
3
+ Dir.entries(sql_dir).select{|f| File.file? sql_dir + f }.sort.each do |file|
4
+ say_with_time "Migrate with #{file}" do
5
+ execute File.read sql_dir + file
6
+ end
7
+ end
8
+ end
9
+
10
+ def down
11
+ execute "DROP TABLE openbill_accounts CASCADE"
12
+ execute "DROP TABLE openbill_transactions CASCADE"
13
+ end
14
+
15
+ private
16
+
17
+ def sql_dir
18
+ Openbill.root + '/sql/'
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ require 'singleton'
2
+
3
+ class Configuration
4
+ include Singleton
5
+
6
+ attr_accessor :database
7
+ end
@@ -0,0 +1,13 @@
1
+ module Openbill
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Openbill
4
+
5
+ initializer 'append_migrations' do |app|
6
+ unless app.root.to_s.match root.to_s
7
+ config.paths["db/migrate"].expanded.each do |expanded_path|
8
+ app.config.paths["db/migrate"] << expanded_path
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -7,10 +7,6 @@ module Openbill
7
7
  DEFAULT_CURRENCY = 'RUB'.freeze
8
8
 
9
9
  class Service
10
- def self.rails_initialize
11
- new ActiveRecord::Base.connection.instance_variable_get('@config')
12
- end
13
-
14
10
  def initialize(db_config)
15
11
  init_db db_config
16
12
  end
@@ -22,7 +18,7 @@ module Openbill
22
18
  def create_account(uri, currency: DEFAULT_CURRENCY, details: nil, meta: {})
23
19
  uri = prepare_uri uri
24
20
  Openbill::Account.create(
25
- uri: uri,
21
+ uri: uri,
26
22
  details: details,
27
23
  meta: meta,
28
24
  amount_currency: currency
@@ -34,12 +30,12 @@ module Openbill
34
30
  amount = prepare_amount amoount
35
31
  uri = prepare_uri uri
36
32
 
37
- Transaction.create(
33
+ Openbill::Transaction.create(
38
34
  from_account_id: from_account_id,
39
35
  to_account_id: to_account_id,
40
36
  amount_cents: amount.cents,
41
37
  amount_currency: amount.currency,
42
- uri: uri,
38
+ uri: uri,
43
39
  details: details,
44
40
  meta: meta
45
41
  )
@@ -1,3 +1,3 @@
1
1
  module Openbill
2
- VERSION = "0.1.0"
2
+ VERSION = '0.1.5'
3
3
  end
@@ -0,0 +1 @@
1
+ require 'openbill'
data/lib/openbill.rb CHANGED
@@ -1,20 +1,36 @@
1
- require 'singleton'
2
-
1
+ require 'openbill/engine'
3
2
  module Openbill
3
+ autoload :Service, 'openbill/service'
4
+ autoload :Account, 'openbill/account'
5
+ autoload :Transaction, 'openbill/transaction'
6
+ autoload :Configuration, 'openbill/configuration'
7
+
4
8
  ACCOUNTS_TABLE_NAME = :openbill_accounts
5
9
  TRANSACTIONS_TABLE_NAME = :openbill_transactions
6
10
 
7
11
  class << self
8
- include Singleton
12
+ def root
13
+ File.dirname __dir__
14
+ end
15
+
16
+ def configure
17
+ yield self.config
18
+ end
9
19
 
10
- delegate :create_account, :get_account_by_uri, :make_transaction, to: :current
20
+ def config
21
+ Configuration.instance
22
+ end
11
23
 
12
24
  def generate_uri(resource, id)
13
25
  "obp://local/#{resource}/#{id}"
14
26
  end
15
27
 
28
+ def create_connection(&block)
29
+ @create_connection_block = block
30
+ end
31
+
16
32
  def current
17
- @current ||= Openbill::Service.rails_initialize
33
+ @current ||= Openbill::Service.new config.database
18
34
  end
19
35
  end
20
36
  end
data/sql/0_db.sql ADDED
@@ -0,0 +1,44 @@
1
+ CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
2
+ CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;
3
+
4
+ -- CREATE EXTENSION IF NOT EXISTS intarray WITH SCHEMA public;
5
+
6
+ CREATE TABLE OPENBILL_ACCOUNTS (
7
+ id BIGSERIAL PRIMARY KEY,
8
+ uri character varying(2048) not null,
9
+ amount_cents numeric not null default 0,
10
+ amount_currency char(3) not null default 'USD',
11
+ details text,
12
+ transactions_count integer not null default 0,
13
+ last_transaction_id integer,
14
+ last_transaction_at timestamp without time zone,
15
+ meta hstore not null default ''::hstore,
16
+ created_at timestamp without time zone default current_timestamp,
17
+ updated_at timestamp without time zone default current_timestamp
18
+ );
19
+
20
+ CREATE UNIQUE INDEX index_accounts_on_id ON OPENBILL_ACCOUNTS USING btree (id);
21
+ CREATE UNIQUE INDEX index_accounts_on_uri ON OPENBILL_ACCOUNTS USING btree (uri);
22
+ CREATE INDEX index_accounts_on_meta ON OPENBILL_ACCOUNTS USING gin (meta);
23
+ CREATE INDEX index_accounts_on_created_at ON OPENBILL_ACCOUNTS USING btree (created_at);
24
+
25
+ CREATE TABLE OPENBILL_TRANSACTIONS (
26
+ id BIGSERIAL PRIMARY KEY,
27
+ username character varying(255) not null,
28
+ created_at timestamp without time zone default current_timestamp,
29
+ from_account_id integer not null,
30
+ to_account_id integer not null,
31
+ amount_cents numeric not null CONSTRAINT positive CHECK (amount_cents>0),
32
+ amount_currency char(3) not null,
33
+ uri character varying(2048) not null,
34
+ details text not null,
35
+ meta hstore not null default ''::hstore,
36
+ foreign key (from_account_id) REFERENCES OPENBILL_ACCOUNTS (id) ON DELETE RESTRICT ON UPDATE RESTRICT,
37
+ foreign key (to_account_id) REFERENCES OPENBILL_ACCOUNTS (id)
38
+ );
39
+
40
+ CREATE UNIQUE INDEX index_transactions_on_uri ON OPENBILL_TRANSACTIONS USING btree (uri);
41
+ CREATE INDEX index_transactions_on_meta ON OPENBILL_TRANSACTIONS USING gin (meta);
42
+ CREATE INDEX index_transactions_on_created_at ON OPENBILL_TRANSACTIONS USING btree (created_at);
43
+
44
+ ALTER TABLE OPENBILL_ACCOUNTS ADD FOREIGN KEY(last_transaction_id) REFERENCES OPENBILL_TRANSACTIONS(id) ON DELETE RESTRICT ON UPDATE RESTRICT;
@@ -0,0 +1,27 @@
1
+ -- Запрещаем удаление и какое-либо изменение accounts
2
+
3
+ CREATE OR REPLACE FUNCTION disable_update_account() RETURNS TRIGGER AS $disable_update_account$
4
+ DECLARE
5
+ query text;
6
+ BEGIN
7
+ IF current_query() like 'insert into OPENBILL_TRANSACTIONS%' THEN
8
+ RETURN NEW;
9
+ ELSE
10
+ RAISE EXCEPTION 'Cannot update directly update amount_cents and timestamps of account';
11
+ END IF;
12
+ END
13
+
14
+ $disable_update_account$ LANGUAGE plpgsql;
15
+
16
+ CREATE TRIGGER disable_update_account
17
+ BEFORE UPDATE ON OPENBILL_ACCOUNTS FOR EACH ROW EXECUTE PROCEDURE disable_update_account();
18
+
19
+ CREATE OR REPLACE FUNCTION disable_delete_account() RETURNS TRIGGER AS $disable_delete_account$
20
+ BEGIN
21
+ RAISE EXCEPTION 'Cannot delete account';
22
+ END
23
+
24
+ $disable_delete_account$ LANGUAGE plpgsql;
25
+
26
+ CREATE TRIGGER disable_delete_account
27
+ BEFORE DELETE ON OPENBILL_ACCOUNTS FOR EACH ROW EXECUTE PROCEDURE disable_delete_account();
@@ -0,0 +1,11 @@
1
+ -- Запрещаем удаление и какое-либо изменение transactions
2
+
3
+ CREATE OR REPLACE FUNCTION disable_update_transaction() RETURNS TRIGGER AS $disable_update_transaction$
4
+ BEGIN
5
+ RAISE EXCEPTION 'Cannot update or delete transaction';
6
+ END
7
+
8
+ $disable_update_transaction$ LANGUAGE plpgsql;
9
+
10
+ CREATE TRIGGER disable_update_transaction
11
+ BEFORE UPDATE OR DELETE ON OPENBILL_TRANSACTIONS FOR EACH ROW EXECUTE PROCEDURE disable_update_transaction();
@@ -0,0 +1,40 @@
1
+ CREATE OR REPLACE FUNCTION process_account_transaction() RETURNS TRIGGER AS $process_transaction$
2
+ DECLARE
3
+ result text;
4
+ BEGIN
5
+ -- У всех счетов и транзакции должна быть одинаковая валюта
6
+
7
+ SELECT id FROM OPENBILL_ACCOUNTS where id = NEW.from_account_id and amount_currency = NEW.amount_currency INTO result;
8
+ IF NOT FOUND THEN
9
+ RAISE EXCEPTION 'Account (from #%) has wrong currency', NEW.from_account_id;
10
+ END IF;
11
+
12
+ SELECT * FROM OPENBILL_ACCOUNTS where id = NEW.to_account_id and amount_currency = NEW.amount_currency INTO result;
13
+ IF NOT FOUND THEN
14
+ RAISE EXCEPTION 'Account (to #%) has wrong currency', NEW.to_account_id;
15
+ END IF;
16
+
17
+
18
+ -- установить last_transaction_id, counts и _at
19
+ UPDATE OPENBILL_ACCOUNTS SET amount_cents = amount_cents - NEW.amount_cents, last_transaction_id = NEW.id, last_transaction_at = NEW.created_at, transactions_count = transactions_count + 1 WHERE id = NEW.from_account_id;
20
+ UPDATE OPENBILL_ACCOUNTS SET amount_cents = amount_cents + NEW.amount_cents, last_transaction_id = NEW.id, last_transaction_at = NEW.created_at, transactions_count = transactions_count + 1 WHERE id = NEW.to_account_id;
21
+
22
+ return NEW;
23
+ END
24
+
25
+ $process_transaction$ LANGUAGE plpgsql;
26
+
27
+ CREATE TRIGGER process_account_transaction
28
+ AFTER INSERT ON OPENBILL_TRANSACTIONS FOR EACH ROW EXECUTE PROCEDURE process_account_transaction();
29
+
30
+ -- current_user
31
+
32
+ CREATE OR REPLACE FUNCTION add_current_user_to_transaction() RETURNS TRIGGER AS $add_current_user_to_transaction$
33
+ BEGIN
34
+ NEW.username := current_user;
35
+ RETURN NEW;
36
+ END
37
+ $add_current_user_to_transaction$ LANGUAGE plpgsql;
38
+
39
+ CREATE TRIGGER add_current_user_to_transaction
40
+ BEFORE INSERT ON OPENBILL_TRANSACTIONS FOR EACH ROW EXECUTE PROCEDURE add_current_user_to_transaction();
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openbill-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danil Pismenny
@@ -68,12 +68,20 @@ files:
68
68
  - Rakefile
69
69
  - bin/console
70
70
  - bin/setup
71
+ - db/migrate/20160320150928_add_openbill.rb
72
+ - lib/openbill-ruby.rb
71
73
  - lib/openbill.rb
72
74
  - lib/openbill/account.rb
75
+ - lib/openbill/configuration.rb
76
+ - lib/openbill/engine.rb
73
77
  - lib/openbill/service.rb
74
78
  - lib/openbill/transaction.rb
75
79
  - lib/openbill/version.rb
76
80
  - openbill-ruby.gemspec
81
+ - sql/0_db.sql
82
+ - sql/1_trigger_disable_delete_account.sql
83
+ - sql/2_trigger_disable_update_transaction.sql
84
+ - sql/3_trigger_process_account_transaction.sql
77
85
  homepage: http://brandymint.com
78
86
  licenses:
79
87
  - MIT