Browse Source

iterator/container macro. general add(Record)

Andrii Zadorozhnii 11 years ago
parent
commit
bde5b5a26e

+ 11 - 6
include/accounts.hrl

@@ -1,3 +1,5 @@
+-include("kvs.hrl").
+
 -type currency()         :: internal | quota | game_points | money | bonus.
 -type currency()         :: internal | quota | game_points | money | bonus.
 -type account_id()       :: {string(), currency()}. %% {username, currency}.
 -type account_id()       :: {string(), currency()}. %% {username, currency}.
 -type transaction_id()   :: string().
 -type transaction_id()   :: string().
@@ -14,14 +16,17 @@
 
 
 -type transaction_info() :: #tx_payment{} | #tx_admin_change{} | #tx_default_assignment{}.
 -type transaction_info() :: #tx_payment{} | #tx_admin_change{} | #tx_default_assignment{}.
 
 
--record(user_transaction, {user,top}).
--record(transaction, {
-        id :: transaction_id(),
+-record(user_transaction, {?CONTAINER, user
+%,top
+}).
+-record(transaction, {?ITERATOR(user_transaction),
+%        id :: transaction_id(),
         commit_time :: erlang:now(),
         commit_time :: erlang:now(),
         amount :: integer(),    %% amount to move between accounts
         amount :: integer(),    %% amount to move between accounts
         remitter :: account_id(), %% accout that gives money/points
         remitter :: account_id(), %% accout that gives money/points
         acceptor :: account_id(), %% account receive money/points
         acceptor :: account_id(), %% account receive money/points
         currency :: currency(),   %% some of the points or money
         currency :: currency(),   %% some of the points or money
-        info :: transaction_info(),
-        next,
-        prev }).
+        info :: transaction_info()
+%        next,
+ %       prev 
+}).

+ 5 - 9
include/acls.hrl

@@ -1,15 +1,11 @@
--record(acl, {
-        id,
-        resource,
-        top}).
+-include("kvs.hrl").
 
 
--record(acl_entry, {
-        id,
+-record(acl, {?CONTAINER}).
+
+-record(acl_entry, {?ITERATOR(acl),
         entry_id,
         entry_id,
         acl_id,
         acl_id,
         accessor,
         accessor,
-        action,
-        next,
-        prev}).
+        action}).
 
 
 -record(feature, {name, id, aclver}).
 -record(feature, {name, id, aclver}).

+ 17 - 23
include/feeds.hrl

@@ -1,20 +1,16 @@
--record(feed, {
-        id,
-        top,
-        aclver,
-        entries_count=0}).
+-include("kvs.hrl").
 
 
--record(iterator, {
-        id,
-        object,
-        prev,
-        type,
-        next}).
+-record(feed, {?CONTAINER, aclver}).
+%        id,
+%        top,
+%        aclver
+%        entries_count=0
+%}).
 
 
--record(entry, {
-        id, % {entry_id, feed_id} we want to hold in key information about feed
+-record(entry, {?ITERATOR(feed),
+%        id, % {entry_id, feed_id} we want to hold in key information about feed
         entry_id, % these fields 
         entry_id, % these fields 
-        feed_id,  % are for secondary indexes
+%        feed_id,  % are for secondary indexes
         from, % author
         from, % author
         to,
         to,
         title,
         title,
@@ -31,10 +27,9 @@
         comments_rear,
         comments_rear,
         comments_count,
         comments_count,
         media = [], %% for oembed
         media = [], %% for oembed
-        etc,        %% field to link additional info
-        type = {user, normal},
-        next,
-        prev}).
+        etc,       %% field to link additional info
+        type = {user, normal}
+}).
 
 
 -record(id_seq, {thing, id}).
 -record(id_seq, {thing, id}).
 
 
@@ -50,8 +45,8 @@
         type :: {atom(), atom() | string()},
         type :: {atom(), atom() | string()},
         thumbnail_height}).
         thumbnail_height}).
 
 
--record(comment, {
-        id,          %% {comment_id, entry_id}
+-record(comment, {?ITERATOR(entry),
+%        id,          %% {comment_id, entry_id}
         comment_id,  %% generowane przez id_seq
         comment_id,  %% generowane przez id_seq
         entry_id,    %% index
         entry_id,    %% index
         content,     %% text of comment
         content,     %% text of comment
@@ -60,9 +55,8 @@
         media = [],  %% for oembed
         media = [],  %% for oembed
         parent,
         parent,
         comments,
         comments,
-        comments_rear,
-        next,
-        prev }).
+        comments_rear
+}).
 
 
 
 
 -record(entry_likes, {
 -record(entry_likes, {

+ 4 - 3
include/groups.hrl

@@ -1,14 +1,15 @@
 -include("types.hrl").
 -include("types.hrl").
+-include("kvs.hrl").
 
 
--record(group,{
-        id,
+-record(group,{?ITERATOR(feed),
+%        id,
         name,
         name,
         description,
         description,
         scope :: public | private,
         scope :: public | private,
         creator,
         creator,
         created,
         created,
         owner,
         owner,
-        feeds,
+%        feeds,
         users_count = 0 :: integer(),   % we have to store this, counting would be very expensive and this number is sufficient for sorting and stuff
         users_count = 0 :: integer(),   % we have to store this, counting would be very expensive and this number is sufficient for sorting and stuff
         entries_count = 0}).
         entries_count = 0}).
 
 

+ 17 - 0
include/kvs.hrl

@@ -0,0 +1,17 @@
+-ifndef(KVS_HRL).
+-define(KVS_HRL, true).
+
+-define(USR_FEED, users).
+-define(PRD_FEED, products).
+-define(GRP_FEED, groups).
+-define(FEED(Type), case Type of user -> ?USR_FEED; product -> ?PRD_FEED; group -> ?GRP_FEED; _-> undefined end).
+
+-define(CONTAINER, id, top, entries_count=0).
+-define(ITERATOR(Container), id, container=Container, feed_id, prev, next, feeds=[]).
+
+-record(container, {?CONTAINER}).
+-record(iterator,  {?ITERATOR(undefined)}).
+
+-endif.
+
+

+ 10 - 7
include/payments.hrl

@@ -1,3 +1,5 @@
+-include("kvs.hrl").
+
 -type payment_state() :: added | done | cancelled | pending | untracked |
 -type payment_state() :: added | done | cancelled | pending | untracked |
                          failed | unknown | confirmed | discarded.
                          failed | unknown | confirmed | discarded.
 -type payment_type():: credit_card | mobile | paypal | wire_transfer | facebook.
 -type payment_type():: credit_card | mobile | paypal | wire_transfer | facebook.
@@ -7,24 +9,25 @@
         state    :: any(),
         state    :: any(),
         info     :: any()}).
         info     :: any()}).
 
 
--record(payment, {
-        id              :: any(),
+-record(payment, {?ITERATOR(user_payment),
+%        id              :: any(),
         external_id     :: any(),     % id of the purchase in external payment system if any
         external_id     :: any(),     % id of the purchase in external payment system if any
         user_id         :: any(),
         user_id         :: any(),
         payment_type    :: payment_type(),
         payment_type    :: payment_type(),
         state           :: payment_state(),
         state           :: payment_state(),
         membership,
         membership,
         product,
         product,
-        next            :: any(),
-        prev            :: any(),
+%        next            :: any(),
+ %       prev            :: any(),
         start_time      :: erlang:now(),
         start_time      :: erlang:now(),
         end_time        :: erlang:now(),
         end_time        :: erlang:now(),
         state_log = []  :: [#state_change{}],
         state_log = []  :: [#state_change{}],
         info            :: any() }).
         info            :: any() }).
 
 
--record(user_payment, {
-        user :: any(),
-        top   :: any() }).
+-record(user_payment, {?CONTAINER,
+        user :: any()
+%        top   :: any() 
+}).
 
 
 -define(MP_STATE_ADDED,      added).
 -define(MP_STATE_ADDED,      added).
 -define(MP_STATE_DONE,       done).
 -define(MP_STATE_DONE,       done).

+ 3 - 3
include/products.hrl

@@ -1,3 +1,5 @@
+-include("kvs.hrl").
+
 -record(ext_product_info, {
 -record(ext_product_info, {
         vendor_id,
         vendor_id,
         id,
         id,
@@ -10,14 +12,12 @@
         retailer_price,
         retailer_price,
         user_price }).
         user_price }).
 
 
--record(product, {
-        id,
+-record(product, {?ITERATOR(feed),
         ext_id                 :: term(),    % ext
         ext_id                 :: term(),    % ext
         vendor_id              :: integer(), % auto
         vendor_id              :: integer(), % auto
         categories             :: list(integer()), % admin
         categories             :: list(integer()), % admin
         creator,
         creator,
         owner,
         owner,
-        feeds,
         title,
         title,
         brief,
         brief,
         cover,
         cover,

+ 2 - 2
include/users.hrl

@@ -1,6 +1,7 @@
 -include("types.hrl").
 -include("types.hrl").
+-include("kvs.hrl").
 
 
--record(user, {
+-record(user, {?ITERATOR(feed),
         email,
         email,
         username :: username_type() | '_', %% Dialyzer and record MatchSpec warnings http://j.mp/vZ8670
         username :: username_type() | '_', %% Dialyzer and record MatchSpec warnings http://j.mp/vZ8670
         display_name,
         display_name,
@@ -22,7 +23,6 @@
         verification_code :: string() | '_',
         verification_code :: string() | '_',
         zone,
         zone,
         type,
         type,
-        feeds=[],
         comments,
         comments,
         discussions,
         discussions,
         transactions,
         transactions,

+ 95 - 8
src/kvs.erl

@@ -16,6 +16,7 @@
 -include_lib("stdlib/include/qlc.hrl").
 -include_lib("stdlib/include/qlc.hrl").
 -include_lib("kvs/include/feed_state.hrl").
 -include_lib("kvs/include/feed_state.hrl").
 -compile(export_all).
 -compile(export_all).
+-define(r, {sr, record_info(fields, acl)}).
 
 
 start() -> DBA = ?DBA, DBA:start().
 start() -> DBA = ?DBA, DBA:start().
 dir() -> DBA = ?DBA, DBA:dir().
 dir() -> DBA = ?DBA, DBA:dir().
@@ -24,6 +25,98 @@ initialize() -> DBA = ?DBA, DBA:initialize().
 delete() -> DBA = ?DBA, DBA:delete().
 delete() -> DBA = ?DBA, DBA:delete().
 init_indexes() -> DBA = ?DBA, DBA:init_indexes().
 init_indexes() -> DBA = ?DBA, DBA:init_indexes().
 
 
+add(Record) when is_tuple(Record) ->
+    Id = element(#iterator.id, Record),
+
+    case kvs:get(element(1,Record), Id) of {ok, _} -> error_logger:info_msg("Exist: ~p", [Id]),{error, exist};
+    {error, not_found} ->
+        Type = element(1, Record),
+        CName = element(#iterator.container, Record),
+        Cid = element(#iterator.feed_id, Record),
+
+        Container = case kvs:get(CName, Cid) of {ok,C} -> C; {error, not_found} ->
+            % shoud be general
+            case CName of
+                acl  -> A = #acl{ id = Cid}, kvs:put(A), A;
+                feed -> F = #feed{id = ?FEED(Type)}, kvs:put(F), F;
+                _ -> error end end,
+        if Container == error -> {error, no_container}; true ->
+            Next = undefined,
+            Prev = case element(#container.top, Container) of undefined -> undefined;
+              Tid -> case kvs:get(Type, Tid) of {error, not_found} -> undefined;
+                 {ok, Top} -> NewTop = setelement(#iterator.next, Top, Id), kvs:put(NewTop), element(#iterator.id, NewTop) end end,
+
+            C1 = setelement(#container.top, Container, Id),
+            C2 = setelement(#container.entries_count, C1, element(#container.entries_count, Container)+1),
+            kvs:put(C2),
+
+            R  = setelement(#iterator.feeds, Record, [{F1, kvs_feed:create()} || F1 <- element(#iterator.feeds, Record)]),
+            R1 = setelement(#iterator.next,  R,  Next),
+            R2 = setelement(#iterator.prev,  R1, Prev),
+            R3 = setelement(#iterator.feed_id, R2, element(#container.id, Container)),
+            kvs:put(R3),
+            error_logger:info_msg("PUT: ~p", [R3]),
+            {ok, R3} end end.
+
+remove(RecordName, RecordId) ->
+    case kvs:get(RecordName, RecordId) of {error, not_found} -> error_logger:info_msg("not found");
+    {ok, E} ->
+        Id = element(#iterator.id, E),
+        CName = element(#iterator.container, E),
+        Cid = element(#iterator.feed_id, E),
+        error_logger:info_msg("Remove entry ~p from {~p, ~p}", [Id, CName, Cid]),
+
+        {ok, Container} = kvs:get(CName, Cid),
+        Top = element(#container.top, Container),
+
+        Next = element(#iterator.next, E),
+        Prev = element(#iterator.prev, E),
+        case kvs:get(RecordName, Next) of {ok, NE} -> NewNext = setelement(#iterator.prev, Prev, NE), kvs:put(NewNext); _ -> ok end,
+        case kvs:get(RecordName, Prev) of {ok, PE} -> NewPrev = setelement(#iterator.next, Next, PE), kvs:put(NewPrev); _ -> ok end,
+
+        C1 = case Top of Id -> setelement(#container.top, Container, Prev); _ -> Container end,
+        C2 = setelement(#container.entries_count, C1, element(#container.entries_count, Container)-1),
+        kvs:put(C2),
+        error_logger:info_msg("Remove record ~p id: ~p", [RecordName, Id]),
+        kvs:delete(RecordName, Id) end.
+
+%remove(FeedId, EId) ->
+%  {ok, #feed{top = TopId} = Feed} = kvs:get(feed,FeedId),
+%
+%  case kvs:get(entry, {EId, FeedId}) of
+%    {ok, #entry{prev = Prev, next = Next}}->
+%      case kvs:get(entry, Next) of {ok, NE} -> kvs:put(NE#entry{prev = Prev});  _ -> ok end,
+%      case kvs:get(entry, Prev) of {ok, PE} -> kvs:put(PE#entry{next = Next});  _ -> ok end,
+%      case TopId of {EId, FeedId} -> kvs:put(Feed#feed{top = Prev, entries_count=Feed#feed.entries_count-1});
+%        _ -> kvs:put(Feed#feed{entries_count=Feed#feed.entries_count-1}) end;
+%    {error, _} -> error_logger:info_msg("Not found") end,
+%
+%  kvs:delete(entry, {EId, FeedId}).
+
+
+%entry_traversal(undefined, _) -> [];
+%entry_traversal(_, 0) -> [];
+%entry_traversal(Next, Count)->
+%  case kvs:get(entry, Next) of {error, _} -> [];
+%    {ok, R} -> [R | entry_traversal(R#entry.prev, Count-1)] end.
+
+%entries({_, FeedId}, undefined, PageAmount) ->
+%    case kvs:get(feed, FeedId) of
+%        {ok, O} -> entry_traversal(O#feed.top, PageAmount);
+%        {error, _} -> [] end;
+%entries({_, FeedId}, StartFrom, PageAmount) ->
+%    case kvs:get(entry,{StartFrom, FeedId}) of
+%        {ok, #entry{prev = Prev}} -> entry_traversal(Prev, PageAmount);
+%        _ -> [] end.
+
+%purge_feed(FeedId) ->
+%    {ok,Feed} = kvs:get(feed,FeedId),
+%    Removal = entry_traversal(Feed#feed.top, -1),
+%    [kvs:delete(entry,Id)||#entry{id=Id}<-Removal],
+%    kvs:put(Feed#feed{top=undefined}).
+%purge_unverified_feeds() ->
+%    [ [purge_feed(Fid)|| {_, Fid} <- Feeds ] || #user{feeds=Feeds, email=E} <- kvs:all(user), E==undefined].
+
 traversal( _, _, undefined, _) -> [];
 traversal( _, _, undefined, _) -> [];
 traversal(_, _, _, 0) -> [];
 traversal(_, _, _, 0) -> [];
 traversal(RecordType, PrevPos, Next, Count)->
 traversal(RecordType, PrevPos, Next, Count)->
@@ -41,8 +134,8 @@ init_db() ->
             add_seq_ids(),
             add_seq_ids(),
             kvs_account:create_account(system),
             kvs_account:create_account(system),
             %add_sample_users(),
             %add_sample_users(),
-            add_sample_packages(),
-            add_sample_payments(),
+%            add_sample_packages(),
+%            add_sample_payments(),
             add_translations();
             add_translations();
         {ok,_} -> ignore end.
         {ok,_} -> ignore end.
 
 
@@ -140,9 +233,6 @@ update(Record, Meta) ->
     DBA=?DBA,
     DBA=?DBA,
     DBA:update(Record, Meta).
     DBA:update(Record, Meta).
 
 
-get(user, Key) ->
-  DBA=?DBA,
-  case DBA:get(iterator, Key) of {ok, #iterator{object=O}} -> {ok, O}; E -> E end;
 get(RecordName, Key) ->
 get(RecordName, Key) ->
     DBA=?DBA,
     DBA=?DBA,
     DBA:get(RecordName, Key).
     DBA:get(RecordName, Key).
@@ -168,9 +258,6 @@ delete_by_index(Tab, IndexId, IndexVal) -> DBA=?DBA,DBA:delete_by_index(Tab, Ind
 multi_select(RecordName, Keys) -> DBA=?DBA,DBA:multi_select(RecordName, Keys).
 multi_select(RecordName, Keys) -> DBA=?DBA,DBA:multi_select(RecordName, Keys).
 select(From, PredicateFunction) -> ?INFO("db:select ~p, ~p",[From,PredicateFunction]), DBA=?DBA, DBA:select(From, PredicateFunction).
 select(From, PredicateFunction) -> ?INFO("db:select ~p, ~p",[From,PredicateFunction]), DBA=?DBA, DBA:select(From, PredicateFunction).
 count(RecordName) -> DBA=?DBA,DBA:count(RecordName).
 count(RecordName) -> DBA=?DBA,DBA:count(RecordName).
-%all(user, Feed) ->
-%  case kvs:get(feed, Feed) of {error, not_found} -> [];
-%    {ok,F}-> traversal(iterator, #iterator.prev, F#feed.top, undefined) end.
 all(RecordName) -> DBA=?DBA,DBA:all(RecordName).
 all(RecordName) -> DBA=?DBA,DBA:all(RecordName).
 all_by_index(RecordName, Index, IndexValue) -> DBA=?DBA,DBA:all_by_index(RecordName, Index, IndexValue).
 all_by_index(RecordName, Index, IndexValue) -> DBA=?DBA,DBA:all_by_index(RecordName, Index, IndexValue).
 next_id(RecordName) -> DBA=?DBA,DBA:next_id(RecordName).
 next_id(RecordName) -> DBA=?DBA,DBA:next_id(RecordName).

+ 12 - 51
src/kvs_acl.erl

@@ -7,36 +7,35 @@
 -include_lib("kvs/include/groups.hrl").
 -include_lib("kvs/include/groups.hrl").
 -include_lib("kvs/include/feeds.hrl").
 -include_lib("kvs/include/feeds.hrl").
 
 
-define_access(default  = Accessor, Resource, Action) -> do_define_access(Accessor, Resource, Action);
-define_access({user, _Username} = Accessor, Resource, Action) -> do_define_access(Accessor, Resource, Action);
-define_access({user_type, _Usertype} = Accessor, Resource, Action) -> do_define_access(Accessor, Resource, Action);
-define_access({ip, _Ip} = Accessor, Resource, Action) -> do_define_access(Accessor, Resource, Action).
-
-do_define_access(Accessor, Resource, Action) -> acl_add_entry(select_type(Resource), Accessor, Action).
+define_access(Accessor, Resource, Action) -> 
+    Entry = #acl_entry{ id = {Accessor, Resource},
+                        accessor= Accessor,
+                        action  = Action,
+                        feed_id = Resource},
+    case kvs:add(Entry) of {error, exist} -> kvs:put(Entry#acl_entry{action=Action}); {ok, E} -> E end.
 
 
 check(Keys) ->
 check(Keys) ->
     Acls = [Acl || {ok, Acl = #acl_entry{}} <- [kvs:get(acl_entry, Key) || Key <- Keys]],
     Acls = [Acl || {ok, Acl = #acl_entry{}} <- [kvs:get(acl_entry, Key) || Key <- Keys]],
-    case Acls of
-        [] -> none;
+    case Acls of [] -> none;
         [#acl_entry{action = Action} | _] -> Action end.
         [#acl_entry{action = Action} | _] -> Action end.
 
 
-check_access(#user{email = UId, type = UType}, #feed{id = FId}) ->
+check_access(#user{id = UId, type = UType}, #feed{id = FId}) ->
     Feed = {feed, FId},
     Feed = {feed, FId},
     Query = [ {{user, UId}, Feed}, {{user_type, UType}, Feed}, {default, Feed}],
     Query = [ {{user, UId}, Feed}, {{user_type, UType}, Feed}, {default, Feed}],
     check(Query);
     check(Query);
 
 
-check_access(#user{email = UId, type = UType}, #group{id = GId}) ->
+check_access(#user{id = UId, type = UType}, #group{id = GId}) ->
     Group = {group, GId},
     Group = {group, GId},
     Query = [ {{user, UId}, Group}, {{user_type, UType}, Group}, {default, Group}],
     Query = [ {{user, UId}, Group}, {{user_type, UType}, Group}, {default, Group}],
     check(Query);
     check(Query);
 
 
 
 
-check_access(#user{email = AId, type = AType}, #user{email = RId}) ->
+check_access(#user{id = AId, type = AType}, #user{id = RId}) ->
     User = {user, RId},
     User = {user, RId},
     Query = [ {{user, AId}, User}, {{user_type, AType}, User}, {default, User} ],
     Query = [ {{user, AId}, User}, {{user_type, AType}, User}, {default, User} ],
     check(Query);
     check(Query);
 
 
-check_access({user_type, Type}, #user{email = RId}) ->
+check_access({user_type, Type}, #user{id = RId}) ->
     User = {user, RId},
     User = {user, RId},
     Query = [ {{user_type, Type}, User}, {default, User} ],
     Query = [ {{user_type, Type}, User}, {default, User} ],
     check(Query);
     check(Query);
@@ -55,7 +54,7 @@ check_access({ip, _Ip} = Accessor, {feature, _Feature} = Resource) ->
     Query = [{Accessor, Resource}, {default, Resource}],
     Query = [{Accessor, Resource}, {default, Resource}],
     check(Query);
     check(Query);
 
 
-check_access(#user{email = AId, type = AType}, {feature, _Feature} = R) ->
+check_access(#user{id = AId, type = AType}, {feature, _Feature} = R) ->
     Query = [ {{user, AId}, R}, {{user_type, AType}, R}, {default, R} ],
     Query = [ {{user, AId}, R}, {{user_type, AType}, R}, {default, R} ],
     check(Query);
     check(Query);
 
 
@@ -65,44 +64,6 @@ check_access(UId, {feature, _Feature} = Resource) ->
         E -> E
         E -> E
     end.
     end.
 
 
-select_type({user, Id}) -> {user, Id};
-select_type({group, Id}) -> {group, Id};
-select_type({product, Id}) -> {product, Id};
-select_type({feed, FId}) -> {feed, FId};
-select_type({feature, Feature}) ->  {feature, Feature}.
-
 entries(AclId) -> case kvs:get(acl, AclId) of {ok,RO} -> read_entries(RO#acl.top, []); {error, _} -> [] end.
 entries(AclId) -> case kvs:get(acl, AclId) of {ok,RO} -> read_entries(RO#acl.top, []); {error, _} -> [] end.
 read_entries(undefined, Result) -> Result;
 read_entries(undefined, Result) -> Result;
 read_entries(Next, Result) -> case kvs:get(acl_entry, Next) of {ok,RO} -> read_entries(RO#acl_entry.prev, Result ++ [RO]); {error, _} -> Result end.
 read_entries(Next, Result) -> case kvs:get(acl_entry, Next) of {ok,RO} -> read_entries(RO#acl_entry.prev, Result ++ [RO]); {error, _} -> Result end.
-
-acl_add_entry(Resource, Accessor, Action) ->
-  Acl = case kvs:get(acl, Resource) of {ok, A} -> A;
-    {error, _} -> A = #acl{id = Resource, resource=Resource}, kvs:put(A), A end,
-
-  EntryId = {Accessor, Resource},
-
-  case kvs:get(acl_entry, EntryId) of {error, _} ->
-    Next = undefined,
-    Prev = case Acl#acl.top of undefined -> undefined;
-      Top -> case kvs:get(acl_entry, Top) of {ok, TopEntry} ->
-        EditedEntry = TopEntry#acl_entry{next = EntryId},
-        kvs:put(EditedEntry), % update prev entry
-        TopEntry#acl_entry.id;
-      {error, _} -> undefined end end,
-
-    %% update acl with top of acl entries list
-    kvs:put(Acl#acl{top = EntryId}),
-
-    Entry  = #acl_entry{id = EntryId,
-                        entry_id = EntryId,
-                        accessor = Accessor,
-                        action = Action,
-                        next = Next,
-                        prev = Prev},
-
-    ok = kvs:put(Entry),
-    Entry;
-
-    %% if acl entry for Accessor and Acl is defined - just change action
-    {ok, AclEntry} -> kvs:put(AclEntry#acl_entry{action = Action}), AclEntry end.
-

+ 27 - 43
src/kvs_feed.erl

@@ -17,23 +17,6 @@ create() ->
     ok = kvs:put(#feed{id = FId} ),
     ok = kvs:put(#feed{id = FId} ),
     FId.
     FId.
 
 
-add_entry(E=#entry{}) ->
-  case kvs:get(entry, E#entry.id) of {ok, _} -> error_logger:info_msg("Add entry ~p failed. Already exist!", [E#entry.id]);
-    {error, not_found}-> case kvs:get(feed, E#entry.feed_id) of
-      {error, not_found} -> error_logger:info_msg("Add entry failed, no feed ~p", [E#entry.feed_id]);
-      {ok, Feed} ->
-        Next = undefined,
-        Prev = case Feed#feed.top of undefined -> undefined;
-          X -> case kvs:get(entry, X) of {error,_} -> undefined;
-            {ok, Top} -> Edited = Top#entry{next=E#entry.id}, kvs:put(Edited), Top#entry.id end end,
-
-        kvs:put(#feed{id=E#entry.feed_id, top=E#entry.id, entries_count=Feed#feed.entries_count+1}),
-
-        Entry  = E#entry{next = Next, prev = Prev},
-        kvs:put(Entry),
-        error_logger:info_msg("PUT entry: ~p", [Entry#entry.id]),
-        {ok, Entry} end end.
-
 entry_traversal(undefined, _) -> [];
 entry_traversal(undefined, _) -> [];
 entry_traversal(_, 0) -> [];
 entry_traversal(_, 0) -> [];
 entry_traversal(Next, Count)->
 entry_traversal(Next, Count)->
@@ -41,8 +24,8 @@ entry_traversal(Next, Count)->
     {ok, R} -> [R | entry_traversal(R#entry.prev, Count-1)] end.
     {ok, R} -> [R | entry_traversal(R#entry.prev, Count-1)] end.
 
 
 entries({_, FeedId}, undefined, PageAmount) ->
 entries({_, FeedId}, undefined, PageAmount) ->
-    case kvs:get(feed, FeedId) of
-        {ok, O} -> entry_traversal(O#feed.top, PageAmount);
+   case kvs:get(feed, FeedId) of
+       {ok, O} -> entry_traversal(O#feed.top, PageAmount);
         {error, _} -> [] end;
         {error, _} -> [] end;
 entries({_, FeedId}, StartFrom, PageAmount) ->
 entries({_, FeedId}, StartFrom, PageAmount) ->
     case kvs:get(entry,{StartFrom, FeedId}) of
     case kvs:get(entry,{StartFrom, FeedId}) of
@@ -101,18 +84,18 @@ comments_count(Uid) ->
         {ok, UEC} -> UEC#user_etries_count.comments;
         {ok, UEC} -> UEC#user_etries_count.comments;
         {error, _} -> 0 end.
         {error, _} -> 0 end.
 
 
-remove_entry(FeedId, EId) ->
-  {ok, #feed{top = TopId} = Feed} = kvs:get(feed,FeedId),
-
-  case kvs:get(entry, {EId, FeedId}) of
-    {ok, #entry{prev = Prev, next = Next}}->
-      case kvs:get(entry, Next) of {ok, NE} -> kvs:put(NE#entry{prev = Prev});  _ -> ok end,
-      case kvs:get(entry, Prev) of {ok, PE} -> kvs:put(PE#entry{next = Next});  _ -> ok end,
-      case TopId of {EId, FeedId} -> kvs:put(Feed#feed{top = Prev, entries_count=Feed#feed.entries_count-1});
-        _ -> kvs:put(Feed#feed{entries_count=Feed#feed.entries_count-1}) end;
-    {error, _} -> error_logger:info_msg("Not found") end,
-
-  kvs:delete(entry, {EId, FeedId}).
+%remove_entry(FeedId, EId) ->
+%  {ok, #feed{top = TopId} = Feed} = kvs:get(feed,FeedId),
+%
+%  case kvs:get(entry, {EId, FeedId}) of
+%    {ok, #entry{prev = Prev, next = Next}}->
+%      case kvs:get(entry, Next) of {ok, NE} -> kvs:put(NE#entry{prev = Prev});  _ -> ok end,
+%      case kvs:get(entry, Prev) of {ok, PE} -> kvs:put(PE#entry{next = Next});  _ -> ok end,
+%      case TopId of {EId, FeedId} -> kvs:put(Feed#feed{top = Prev, entries_count=Feed#feed.entries_count-1});
+%        _ -> kvs:put(Feed#feed{entries_count=Feed#feed.entries_count-1}) end;
+%    {error, _} -> error_logger:info_msg("Not found") end,
+%
+%  kvs:delete(entry, {EId, FeedId}).
 
 
 edit_entry(FeedId, EId, NewDescription) ->
 edit_entry(FeedId, EId, NewDescription) ->
     case kvs:get(entry,{EId, FeedId}) of
     case kvs:get(entry,{EId, FeedId}) of
@@ -153,14 +136,14 @@ user_likes(UserId, {Page, PageAmount}) ->
         {ok, Likes} -> lists:nthtail((Page-1)*PageAmount, like_list(Likes#user_likes.one_like_head, PageAmount*Page));
         {ok, Likes} -> lists:nthtail((Page-1)*PageAmount, like_list(Likes#user_likes.one_like_head, PageAmount*Page));
         {error, _} -> [] end.
         {error, _} -> [] end.
 
 
-purge_feed(FeedId) ->
-    {ok,Feed} = kvs:get(feed,FeedId),
-    Removal = entry_traversal(Feed#feed.top, -1),
-    [kvs:delete(entry,Id)||#entry{id=Id}<-Removal],
-    kvs:put(Feed#feed{top=undefined}).
+%purge_feed(FeedId) ->
+%    {ok,Feed} = kvs:get(feed,FeedId),
+%    Removal = entry_traversal(Feed#feed.top, -1),
+%    [kvs:delete(entry,Id)||#entry{id=Id}<-Removal],
+%    kvs:put(Feed#feed{top=undefined}).
 
 
-purge_unverified_feeds() ->
-    [ [purge_feed(Fid)|| {_, Fid} <- Feeds ] || #user{feeds=Feeds, email=E} <- kvs:all(user), E==undefined].
+%purge_unverified_feeds() ->
+%    [ [purge_feed(Fid)|| {_, Fid} <- Feeds ] || #user{feeds=Feeds, email=E} <- kvs:all(user), E==undefined].
 
 
 %% MQ API
 %% MQ API
 
 
@@ -171,7 +154,7 @@ handle_notice([kvs_feed, _, Owner, entry, Eid, add],
       {_,_} ->
       {_,_} ->
         EntryId = case Eid of new -> kvs:uuid(); _-> Eid end,
         EntryId = case Eid of new -> kvs:uuid(); _-> Eid end,
         E = Entry#entry{id = {EntryId, Fid}, entry_id = EntryId },
         E = Entry#entry{id = {EntryId, Fid}, entry_id = EntryId },
-        add_entry(E),
+        kvs:add(E),
 
 
         % todo: group entry counts should be counted for each feed
         % todo: group entry counts should be counted for each feed
         case RouteType of group ->
         case RouteType of group ->
@@ -180,9 +163,10 @@ handle_notice([kvs_feed, _, Owner, entry, Eid, add],
           error_logger:info_msg("count: ~p", [GE]),
           error_logger:info_msg("count: ~p", [GE]),
           kvs:put(Group#group{entries_count = GE+1}),
           kvs:put(Group#group{entries_count = GE+1}),
 
 
-          {ok, Subs} = kvs:get(group_subscription, {E#entry.from, Owner}),
-          SE = Subs#group_subscription.posts_count,
-          kvs:put(Subs#group_subscription{posts_count = SE+1});
+        case kvs:get(group_subscription, {E#entry.from, Owner}) of 
+            {ok, Subs} -> SE = Subs#group_subscription.posts_count,
+                kvs:put(Subs#group_subscription{posts_count = SE+1});
+            {error,not_found} -> error_logger:info_msg("no group subscription found") end;
           _ -> skip end
           _ -> skip end
  end,
  end,
 % self() ! {feed_refresh, Fid, ?CACHED_ENTRIES};
 % self() ! {feed_refresh, Fid, ?CACHED_ENTRIES};
@@ -208,7 +192,7 @@ handle_notice([kvs_feed,_, Owner, entry, {_,Fid}, delete],
               [#entry{entry_id=Eid},_], #state{owner=Owner, feeds=Feeds} = State) ->
               [#entry{entry_id=Eid},_], #state{owner=Owner, feeds=Feeds} = State) ->
 
 
   case lists:keyfind(Fid,2,Feeds) of false -> skip;
   case lists:keyfind(Fid,2,Feeds) of false -> skip;
-    {_,_} -> kvs_feed:remove_entry(Fid, Eid) end,
+    {_,_} -> kvs:remove(Fid, Eid) end,
   %    self() ! {feed_refresh, FeedId, ?CACHED_ENTRIES};
   %    self() ! {feed_refresh, FeedId, ?CACHED_ENTRIES};
   {noreply, State};
   {noreply, State};
 
 

+ 6 - 6
src/kvs_group.erl

@@ -17,12 +17,12 @@ retrieve_groups(User) ->
                                    _ -> undefined end end || {UC, GId} <- UC_GId],
                                    _ -> undefined end end || {UC, GId} <- UC_GId],
                [X||X<-Result,X/=undefined] end.
                [X||X<-Result,X/=undefined] end.
 
 
-register(#group{} = Register) ->
-  Group = Register#group{id=case Register#group.id of undefined -> kvs:uuid(); Id -> Id end, created = erlang:now(), feeds=[{Feed, kvs_feed:create()} || Feed <- Register#group.feeds]},
-  kvs:put(Group),
-  error_logger:info_msg("PUT ~p", [Group]),
-  add(Group#group.creator, Group#group.id, member),
-  {ok, Group}.
+%register(#group{} = Register) ->
+%  Group = Register#group{id=case Register#group.id of undefined -> kvs:uuid(); Id -> Id end, created = erlang:now(), feeds=[{Feed, kvs_feed:create()} || Feed <- Register#group.feeds]},
+%  kvs:put(Group),
+%  error_logger:info_msg("PUT ~p", [Group]),
+%  add(Group#group.creator, Group#group.id, member),
+%  {ok, Group}.
 
 
 delete(GroupName) ->
 delete(GroupName) ->
     case kvs:get(group,GroupName) of 
     case kvs:get(group,GroupName) of 

+ 6 - 6
src/kvs_products.erl → src/kvs_product.erl

@@ -1,4 +1,4 @@
--module(kvs_products).
+-module(kvs_product).
 -copyright('Synrc Research Center s.r.o.').
 -copyright('Synrc Research Center s.r.o.').
 -include_lib("kvs/include/products.hrl").
 -include_lib("kvs/include/products.hrl").
 -include_lib("kvs/include/users.hrl").
 -include_lib("kvs/include/users.hrl").
@@ -11,11 +11,11 @@
 -include_lib("mqs/include/mqs.hrl").
 -include_lib("mqs/include/mqs.hrl").
 -compile(export_all).
 -compile(export_all).
 
 
-register(#product{feeds=Ch} = Registration) ->
-  P = Registration#product{id = kvs:uuid(), feeds= [{Feed, kvs_feed:create()} || Feed <- Ch], creation_date = erlang:now()},
-  kvs:put(P),
-  error_logger:info_msg("PUT PRODUCT: ~p feeds:~p", [P#product.id, P#product.feeds]),
-  {ok, P}.
+%register(#product{feeds=Ch} = Registration) ->
+%  P = Registration#product{id = kvs:uuid(), feeds= [{Feed, kvs_feed:create()} || Feed <- Ch], creation_date = erlang:now()},
+%  kvs:put(P),
+ % error_logger:info_msg("PUT PRODUCT: ~p feeds:~p", [P#product.id, P#product.feeds]),
+ % {ok, P}.
 
 
 delete(Name) ->
 delete(Name) ->
   case kvs:get(product, Name) of
   case kvs:get(product, Name) of

+ 8 - 23
src/kvs_user.erl

@@ -9,27 +9,6 @@
 -include_lib("mqs/include/mqs.hrl").
 -include_lib("mqs/include/mqs.hrl").
 -compile(export_all).
 -compile(export_all).
 
 
-register(#user{email=Email, feeds=Ch} = Registration, Feed) ->
-  case kvs:get(iterator, Email) of {ok,_} -> {error, email_taken};
-  {error, _} ->
-    HashedPassword = case Registration#user.password of undefined -> undefined; PlainPassword -> kvs:sha(PlainPassword) end,
-    RegisterData = Registration#user{feeds=[{Feed, kvs_feed:create()} || Feed <- Ch], password = HashedPassword},
-
-    Next = undefined,
-    Prev = case Feed#feed.top of undefined -> undefined;
-      T -> case kvs:get(iterator, T) of {error,not_found} -> undefined;
-        {ok, Top} -> UpdTop = Top#iterator{next=Email}, kvs:put(UpdTop), UpdTop#iterator.id end end,
-
-    kvs:put(Feed#feed{top=Email, entries_count=Feed#feed.entries_count+1}),
-    Iterator = #iterator{id=Email, object=RegisterData, next=Next, prev=Prev},
-    kvs:put(Iterator),
-    kvs:put(RegisterData),%todo:  by_index support
-    error_logger:info_msg("PUT USER: ~p", [RegisterData]),
-    kvs_account:create_account(Email),
-    {ok, DefaultQuota} = kvs:get(config, "accounts/default_quota",  300),
-    kvs_account:transaction(Email, quota, DefaultQuota, #tx_default_assignment{}),
-    {ok, RegisterData} end.
-
 delete(UserName) ->
 delete(UserName) ->
     case kvs_user:get(UserName) of
     case kvs_user:get(UserName) of
         {ok, User} ->
         {ok, User} ->
@@ -44,8 +23,7 @@ delete(UserName) ->
         E -> E end.
         E -> E end.
 
 
 get({facebook, FBId}) -> user_by_facebook_id(FBId);
 get({facebook, FBId}) -> user_by_facebook_id(FBId);
-get({googleplus, GId}) -> user_by_googleplus_id(GId);
-get(UId) -> kvs:get(user, UId).
+get({googleplus, GId}) -> user_by_googleplus_id(GId).
 
 
 subscribe(Who, Whom) ->
 subscribe(Who, Whom) ->
     Record = #subscription{key={Who,Whom}, who = Who, whom = Whom},
     Record = #subscription{key={Who,Whom}, who = Who, whom = Whom},
@@ -130,6 +108,13 @@ user_by_googleplus_id(GId) ->
         {ok,{_,User,_}} -> kvs:get(user,User);
         {ok,{_,User,_}} -> kvs:get(user,User);
         Else -> Else end.
         Else -> Else end.
 
 
+handle_notice([kvs_user, user, registered], {_,_,#user{id=Who}=U}, #state{owner=Who}=State)->
+    error_logger:info_msg("Notification about registered me ~p", [U]),
+    kvs_account:create_account(Who),
+    {ok, DefaultQuota} = kvs:get(config, "accounts/default_quota",  300),
+    kvs_account:transaction(Who, quota, DefaultQuota, #tx_default_assignment{}),
+    {noreply, State};
+
 handle_notice([kvs_user, login, user, Who, update_status],
 handle_notice([kvs_user, login, user, Who, update_status],
               Message,
               Message,
               #state{owner=Who} = State) ->
               #state{owner=Who} = State) ->

+ 0 - 1
src/store_mnesia.erl

@@ -55,7 +55,6 @@ initialize() ->
     ?CREATE_TAB(acl),
     ?CREATE_TAB(acl),
     ?CREATE_TAB(acl_entry),
     ?CREATE_TAB(acl_entry),
     ?CREATE_TAB(feed),
     ?CREATE_TAB(feed),
-    ?CREATE_TAB(iterator),
     ?CREATE_TAB(team),
     ?CREATE_TAB(team),
     ?CREATE_TAB(entry),
     ?CREATE_TAB(entry),
     ?CREATE_TAB(comment),
     ?CREATE_TAB(comment),