11module V1
22 module Resources
33 class ContentItems < Grape ::API
4+ helpers ::V1 ::Helpers ::SharedParamsHelper
5+ helpers ::V1 ::Helpers ::ParamsHelper
6+
47 resource :content_items do
8+ include Grape ::Kaminari
9+ paginate per_page : 25
10+
511 desc "Create a content item" , { entity : ::V1 ::Entities ::ContentItem , params : ::V1 ::Entities ::ContentItem . documentation , nickname : "createContentItem" }
612 params do
713 requires :content_type_id , type : Integer , desc : "content type of content item"
814 end
915 post do
10- require_scope! 'create :content_items'
16+ require_scope! 'modify :content_items'
1117 authorize! :create , ::ContentItem
1218 @content_item = ::ContentItem . new ( params . merge ( author_id : current_user . id , creator_id : current_user . id ) )
1319
@@ -27,6 +33,37 @@ class ContentItems < Grape::API
2733
2834 present @content_items , with : ::V1 ::Entities ::ContentItem , field_items : true
2935 end
36+
37+ desc 'Show published content items' , { entity : ::V1 ::Entities ::ContentItem , nickname : "contentItemsFeed" }
38+ params do
39+ use :pagination
40+ requires :content_type_name , type : String , desc : 'ContentType of ContentItem'
41+ end
42+ get :feed do
43+ require_scope! 'view:content_items'
44+ authorize! :view , ::ContentItem
45+
46+ last_updated_at = ContentItem . last_updated_at
47+ params_hash = Digest ::MD5 . hexdigest ( declared ( params ) . to_s )
48+ cache_key = "feed-#{ last_updated_at } -#{ current_tenant . id } -#{ params_hash } "
49+
50+ content_items = ::Rails . cache . fetch ( cache_key , expires_in : 30 . minutes , race_condition_ttl : 10 ) do
51+ content_items = ::GetContentItems . call ( params : declared ( clean_params ( params ) , include_missing : false ) , tenant : current_tenant , published : true ) . content_items
52+ paginated_content_items = paginate ( content_items ) . records . to_a
53+ { records : paginated_content_items , headers : header }
54+ end
55+
56+ header . merge! ( content_items [ :headers ] )
57+ ::V1 ::Entities ::ContentItem . represent content_items [ :records ] , field_items : true
58+ end
59+
60+ desc 'Show a published content item' , { entity : ::V1 ::Entities ::ContentItem , nickname : "showFeedContentItem" }
61+ get 'feed/*id' do
62+ @content_item = ::GetContentItem . call ( id : params [ :id ] , published : true , tenant : current_tenant . id ) . content_item
63+ not_found! unless @content_item
64+ authorize! :view , @content_item
65+ present @content_item , with : ::V1 ::Entities ::ContentItem , field_items : true
66+ end
3067 end
3168 end
3269 end
0 commit comments