summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lehnardt <jan@apache.org>2022-06-24 17:01:04 +0200
committerJan Lehnardt <jan@apache.org>2022-12-16 16:56:18 +0100
commitd95945c8c54bf59570734d2023a918ad4d09ca59 (patch)
treea13b4e1d46d19b87f6852d9a9bf15c79e5378001
parentea4e3cc43600c0f64983bbd3ba7240d1405b6d3e (diff)
downloadcouchdb-d95945c8c54bf59570734d2023a918ad4d09ca59.tar.gz
feat(access): handle new records in couch_doc
-rw-r--r--src/couch/src/couch_doc.erl44
1 files changed, 37 insertions, 7 deletions
diff --git a/src/couch/src/couch_doc.erl b/src/couch/src/couch_doc.erl
index 95b1c8b41..61ea4cbe8 100644
--- a/src/couch/src/couch_doc.erl
+++ b/src/couch/src/couch_doc.erl
@@ -26,6 +26,8 @@
-export([with_ejson_body/1]).
-export([is_deleted/1]).
+-export([has_access/1, has_no_access/1]).
+
-include_lib("couch/include/couch_db.hrl").
-spec to_path(#doc{}) -> path().
@@ -40,15 +42,28 @@ to_branch(Doc, [RevId | Rest]) ->
[{RevId, ?REV_MISSING, to_branch(Doc, Rest)}].
% helpers used by to_json_obj
+reduce_access({Access}) -> Access;
+reduce_access(Access) -> Access.
+
to_json_rev(0, []) ->
[];
to_json_rev(Start, [FirstRevId | _]) ->
[{<<"_rev">>, ?l2b([integer_to_list(Start), "-", revid_to_str(FirstRevId)])}].
-to_json_body(true, {Body}) ->
+% TODO: remove if we can
+% to_json_body(Del, Body) ->
+% to_json_body(Del, Body, []).
+
+to_json_body(true, {Body}, []) ->
Body ++ [{<<"_deleted">>, true}];
-to_json_body(false, {Body}) ->
- Body.
+to_json_body(false, {Body}, []) ->
+ Body;
+to_json_body(true, {Body}, Access0) ->
+ Access = reduce_access(Access0),
+ Body ++ [{<<"_deleted">>, true}] ++ [{<<"_access">>, {Access}}];
+to_json_body(false, {Body}, Access0) ->
+ Access = reduce_access(Access0),
+ Body ++ [{<<"_access">>, Access}].
to_json_revisions(Options, Start, RevIds0) ->
RevIds =
@@ -138,14 +153,15 @@ doc_to_json_obj(
deleted = Del,
body = Body,
revs = {Start, RevIds},
- meta = Meta
+ meta = Meta,
+ access = Access
} = Doc,
Options
) ->
{
[{<<"_id">>, Id}] ++
to_json_rev(Start, RevIds) ++
- to_json_body(Del, Body) ++
+ to_json_body(Del, Body, Access) ++
to_json_revisions(Options, Start, RevIds) ++
to_json_meta(Meta) ++
to_json_attachments(Doc#doc.atts, Options)
@@ -401,7 +417,7 @@ max_seq(Tree, UpdateSeq) ->
end,
couch_key_tree:fold(FoldFun, UpdateSeq, Tree).
-to_doc_info_path(#full_doc_info{id = Id, rev_tree = Tree, update_seq = FDISeq}) ->
+to_doc_info_path(#full_doc_info{id = Id, rev_tree = Tree, update_seq = FDISeq, access = Access}) ->
RevInfosAndPath = [
{rev_info(Node), Path}
|| {_Leaf, Path} = Node <-
@@ -419,7 +435,7 @@ to_doc_info_path(#full_doc_info{id = Id, rev_tree = Tree, update_seq = FDISeq})
),
[{_RevInfo, WinPath} | _] = SortedRevInfosAndPath,
RevInfos = [RevInfo || {RevInfo, _Path} <- SortedRevInfosAndPath],
- {#doc_info{id = Id, high_seq = max_seq(Tree, FDISeq), revs = RevInfos}, WinPath}.
+ {#doc_info{id = Id, high_seq = max_seq(Tree, FDISeq), revs = RevInfos, access = Access}, WinPath}.
rev_info({#leaf{} = Leaf, {Pos, [RevId | _]}}) ->
#rev_info{
@@ -459,6 +475,20 @@ is_deleted(Tree) ->
false
end.
+get_access({Props}) ->
+ get_access(couch_doc:from_json_obj({Props}));
+get_access(#doc{access=Access}) ->
+ Access.
+
+has_access(Doc) ->
+ has_access1(get_access(Doc)).
+
+has_no_access(Doc) ->
+ not has_access1(get_access(Doc)).
+
+has_access1([]) -> false;
+has_access1(_) -> true.
+
get_validate_doc_fun({Props}) ->
get_validate_doc_fun(couch_doc:from_json_obj({Props}));
get_validate_doc_fun(#doc{body = {Props}} = DDoc) ->