asset_host_core 2.0.0.beta

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.
Files changed (199) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.markdown +138 -0
  3. data/Rakefile +11 -0
  4. data/app/assets/images/asset_host_core/alert-overlay.png +0 -0
  5. data/app/assets/images/asset_host_core/arrow-left.gif +0 -0
  6. data/app/assets/images/asset_host_core/arrow-right.gif +0 -0
  7. data/app/assets/images/asset_host_core/fallback-img-rect.png +0 -0
  8. data/app/assets/images/asset_host_core/videoplayer-play.png +0 -0
  9. data/app/assets/images/asset_host_core/x.png +0 -0
  10. data/app/assets/javascripts/asset_host_core/admin/assets.js.coffee +221 -0
  11. data/app/assets/javascripts/asset_host_core/application.js +20 -0
  12. data/app/assets/javascripts/asset_host_core/assetadmin.js.coffee +56 -0
  13. data/app/assets/javascripts/asset_host_core/assethost.js.coffee.erb +17 -0
  14. data/app/assets/javascripts/asset_host_core/browserui.js.coffee +139 -0
  15. data/app/assets/javascripts/asset_host_core/chooserui.js.coffee +381 -0
  16. data/app/assets/javascripts/asset_host_core/client.js.coffee +29 -0
  17. data/app/assets/javascripts/asset_host_core/clients/BrightcoveVideo.js.coffee +64 -0
  18. data/app/assets/javascripts/asset_host_core/clients/templates/brightcove_embed.jst.eco +18 -0
  19. data/app/assets/javascripts/asset_host_core/clients/templates/vimeo_embed.jst.eco +1 -0
  20. data/app/assets/javascripts/asset_host_core/clients/templates/youtube_embed.jst.eco +1 -0
  21. data/app/assets/javascripts/asset_host_core/clients/vimeo_video.js.coffee +21 -0
  22. data/app/assets/javascripts/asset_host_core/clients/youtube_video.js.coffee +21 -0
  23. data/app/assets/javascripts/asset_host_core/cmsplugin.js.coffee +235 -0
  24. data/app/assets/javascripts/asset_host_core/models.js.coffee +586 -0
  25. data/app/assets/javascripts/asset_host_core/railsCMS.js.coffee +141 -0
  26. data/app/assets/javascripts/asset_host_core/slideshow.js.coffee +428 -0
  27. data/app/assets/javascripts/asset_host_core/templates/after_upload_button.jst.eco +3 -0
  28. data/app/assets/javascripts/asset_host_core/templates/asset_drop_asset.jst.eco +4 -0
  29. data/app/assets/javascripts/asset_host_core/templates/asset_modal.jst.eco +13 -0
  30. data/app/assets/javascripts/asset_host_core/templates/asset_preview.jst.eco +35 -0
  31. data/app/assets/javascripts/asset_host_core/templates/asset_search.jst.eco +2 -0
  32. data/app/assets/javascripts/asset_host_core/templates/browser_asset.jst.eco +1 -0
  33. data/app/assets/javascripts/asset_host_core/templates/browser_asset_tip.jst.eco +3 -0
  34. data/app/assets/javascripts/asset_host_core/templates/edit_modal.jst.eco +40 -0
  35. data/app/assets/javascripts/asset_host_core/templates/import_help.jst.eco +59 -0
  36. data/app/assets/javascripts/asset_host_core/templates/pagination_link.jst.eco +1 -0
  37. data/app/assets/javascripts/asset_host_core/templates/pagination_links.jst.eco +13 -0
  38. data/app/assets/javascripts/asset_host_core/templates/queued_file.jst.eco +11 -0
  39. data/app/assets/javascripts/asset_host_core/templates/save_and_close_view.jst.eco +4 -0
  40. data/app/assets/javascripts/asset_host_core/templates/upload_all_button.jst.eco +4 -0
  41. data/app/assets/javascripts/asset_host_core/templates/url_input.jst.eco +8 -0
  42. data/app/assets/stylesheets/asset_host_core/application.css.scss +384 -0
  43. data/app/assets/stylesheets/asset_host_core/jquery-ui.css +105 -0
  44. data/app/assets/stylesheets/asset_host_core/public.css.scss +204 -0
  45. data/app/assets/stylesheets/asset_host_core/slidetest.css.scss +93 -0
  46. data/app/controllers/asset_host_core/admin/api_users_controller.rb +72 -0
  47. data/app/controllers/asset_host_core/admin/assets_controller.rb +140 -0
  48. data/app/controllers/asset_host_core/admin/base_controller.rb +36 -0
  49. data/app/controllers/asset_host_core/admin/home_controller.rb +13 -0
  50. data/app/controllers/asset_host_core/admin/outputs_controller.rb +55 -0
  51. data/app/controllers/asset_host_core/api/assets_controller.rb +110 -0
  52. data/app/controllers/asset_host_core/api/base_controller.rb +43 -0
  53. data/app/controllers/asset_host_core/api/outputs_controller.rb +33 -0
  54. data/app/controllers/asset_host_core/application_controller.rb +43 -0
  55. data/app/controllers/asset_host_core/public_controller.rb +104 -0
  56. data/app/models/asset_host_core/api_user.rb +44 -0
  57. data/app/models/asset_host_core/api_user_permission.rb +6 -0
  58. data/app/models/asset_host_core/asset.rb +265 -0
  59. data/app/models/asset_host_core/asset_output.rb +69 -0
  60. data/app/models/asset_host_core/brightcove_video.rb +20 -0
  61. data/app/models/asset_host_core/output.rb +52 -0
  62. data/app/models/asset_host_core/permission.rb +19 -0
  63. data/app/models/asset_host_core/video.rb +8 -0
  64. data/app/models/asset_host_core/vimeo_video.rb +17 -0
  65. data/app/models/asset_host_core/youtube_video.rb +17 -0
  66. data/app/views/asset_host_core/admin/api_users/_form_fields.html.erb +5 -0
  67. data/app/views/asset_host_core/admin/api_users/edit.html.erb +26 -0
  68. data/app/views/asset_host_core/admin/api_users/index.html.erb +31 -0
  69. data/app/views/asset_host_core/admin/api_users/new.html.erb +17 -0
  70. data/app/views/asset_host_core/admin/api_users/show.html.erb +23 -0
  71. data/app/views/asset_host_core/admin/assets/index.html.erb +19 -0
  72. data/app/views/asset_host_core/admin/assets/metadata.html.erb +24 -0
  73. data/app/views/asset_host_core/admin/assets/show.html.erb +86 -0
  74. data/app/views/asset_host_core/admin/home/chooser.html.erb +49 -0
  75. data/app/views/asset_host_core/admin/outputs/_form_fields.html.erb +5 -0
  76. data/app/views/asset_host_core/admin/outputs/edit.html.erb +26 -0
  77. data/app/views/asset_host_core/admin/outputs/index.html.erb +27 -0
  78. data/app/views/asset_host_core/admin/outputs/new.html.erb +13 -0
  79. data/app/views/asset_host_core/admin/outputs/show.html.erb +17 -0
  80. data/app/views/asset_host_core/shared/_footerjs.html.erb +3 -0
  81. data/app/views/asset_host_core/shared/_navbar.html.erb +28 -0
  82. data/app/views/kaminari/_first_page.html.erb +3 -0
  83. data/app/views/kaminari/_gap.html.erb +3 -0
  84. data/app/views/kaminari/_last_page.html.erb +3 -0
  85. data/app/views/kaminari/_next_page.html.erb +3 -0
  86. data/app/views/kaminari/_page.html.erb +3 -0
  87. data/app/views/kaminari/_paginator.html.erb +17 -0
  88. data/app/views/kaminari/_prev_page.html.erb +3 -0
  89. data/app/views/layouts/asset_host_core/application.html.erb +54 -0
  90. data/app/views/layouts/asset_host_core/full_width.html.erb +32 -0
  91. data/app/views/layouts/asset_host_core/minimal.html.erb +45 -0
  92. data/config/initializers/simple_form.rb +142 -0
  93. data/config/initializers/simple_form_bootstrap.rb +45 -0
  94. data/config/locales/simple_form.en.yml +26 -0
  95. data/config/routes.rb +49 -0
  96. data/lib/asset_host_core.rb +38 -0
  97. data/lib/asset_host_core/config.rb +39 -0
  98. data/lib/asset_host_core/engine.rb +94 -0
  99. data/lib/asset_host_core/loaders.rb +34 -0
  100. data/lib/asset_host_core/loaders/asset_host.rb +30 -0
  101. data/lib/asset_host_core/loaders/base.rb +22 -0
  102. data/lib/asset_host_core/loaders/brightcove.rb +67 -0
  103. data/lib/asset_host_core/loaders/flickr.rb +114 -0
  104. data/lib/asset_host_core/loaders/url.rb +59 -0
  105. data/lib/asset_host_core/loaders/vimeo.rb +76 -0
  106. data/lib/asset_host_core/loaders/youtube.rb +90 -0
  107. data/lib/asset_host_core/model_methods.rb +61 -0
  108. data/lib/asset_host_core/paperclip.rb +4 -0
  109. data/lib/asset_host_core/paperclip/asset_thumbnail.rb +92 -0
  110. data/lib/asset_host_core/paperclip/attachment.rb +206 -0
  111. data/lib/asset_host_core/paperclip/trimmer.rb +33 -0
  112. data/lib/asset_host_core/resque_job.rb +13 -0
  113. data/lib/asset_host_core/version.rb +3 -0
  114. data/lib/tasks/asset_host_core_tasks.rake +4 -0
  115. data/spec/controllers/admin/api_users_controller_spec.rb +21 -0
  116. data/spec/controllers/admin/assets_controller_spec.rb +59 -0
  117. data/spec/controllers/admin/home_controller_spec.rb +4 -0
  118. data/spec/controllers/admin/outputs_controller_spec.rb +4 -0
  119. data/spec/controllers/api/assets_controller_spec.rb +133 -0
  120. data/spec/controllers/api/outputs_controller_spec.rb +51 -0
  121. data/spec/controllers/public_controller_spec.rb +4 -0
  122. data/spec/factories.rb +39 -0
  123. data/spec/features/api_users_spec.rb +78 -0
  124. data/spec/fixtures/api/brightcove/video.json +137 -0
  125. data/spec/fixtures/api/flickr/photos_getInfo.json +78 -0
  126. data/spec/fixtures/api/flickr/photos_getSizes.json +82 -0
  127. data/spec/fixtures/api/flickr/photos_licenses_getInfo.json +52 -0
  128. data/spec/fixtures/api/vimeo/video.json +28 -0
  129. data/spec/fixtures/api/youtube/discovery.json +5190 -0
  130. data/spec/fixtures/api/youtube/video.json +44 -0
  131. data/spec/fixtures/images/chipmunk.jpg +0 -0
  132. data/spec/fixtures/images/dude.jpg +0 -0
  133. data/spec/fixtures/images/ernie.jpg +0 -0
  134. data/spec/fixtures/images/fry.png +0 -0
  135. data/spec/fixtures/images/hat.jpg +0 -0
  136. data/spec/fixtures/images/spongebob.png +0 -0
  137. data/spec/fixtures/images/stars.jpg +0 -0
  138. data/spec/internal/app/controllers/application_controller.rb +16 -0
  139. data/spec/internal/app/controllers/sessions_controller.rb +24 -0
  140. data/spec/internal/app/models/user.rb +10 -0
  141. data/spec/internal/app/views/sessions/new.html.erb +14 -0
  142. data/spec/internal/config/database.yml +3 -0
  143. data/spec/internal/config/initializers/assethost_config.rb +57 -0
  144. data/spec/internal/config/routes.rb +7 -0
  145. data/spec/internal/db/combustion_test.sqlite +0 -0
  146. data/spec/internal/db/schema.rb +106 -0
  147. data/spec/internal/log/test.log +14769 -0
  148. data/spec/internal/public/favicon.ico +0 -0
  149. data/spec/internal/public/images/1_27f7745237849975ca90591c1fba5934_original. +0 -0
  150. data/spec/internal/public/images/1_7d33319deca787d5bb3f62ff06563ad2_original. +0 -0
  151. data/spec/internal/public/images/1_b6d48c8b1286104ce76649731e09645f_original. +0 -0
  152. data/spec/internal/public/images/1_b6d48c8b1286104ce76649731e09645f_original.jpg +0 -0
  153. data/spec/internal/public/images/1_b6d48c8b1286104ce76649731e09645f_original.txt +0 -0
  154. data/spec/internal/public/images/1_e179cbd27e07cb55042d0db36cdac095_original. +0 -0
  155. data/spec/internal/public/images/1_e669edd3dfd74be66fc38416e82e3a37_original. +0 -0
  156. data/spec/lib/asset_host_core/loaders/asset_host_spec.rb +33 -0
  157. data/spec/lib/asset_host_core/loaders/brightcove_spec.rb +51 -0
  158. data/spec/lib/asset_host_core/loaders/flickr_spec.rb +72 -0
  159. data/spec/lib/asset_host_core/loaders/url_spec.rb +42 -0
  160. data/spec/lib/asset_host_core/loaders/vimeo_spec.rb +51 -0
  161. data/spec/lib/asset_host_core/loaders/youtube_spec.rb +73 -0
  162. data/spec/lib/asset_host_core/loaders_spec.rb +4 -0
  163. data/spec/lib/asset_host_core/model_methods_spec.rb +4 -0
  164. data/spec/lib/asset_host_core/paperclip/asset_thumbnail_spec.rb +4 -0
  165. data/spec/lib/asset_host_core/paperclip/attachment_spec.rb +4 -0
  166. data/spec/lib/asset_host_core/resque_job_spec.rb +4 -0
  167. data/spec/lib/asset_host_core_spec.rb +4 -0
  168. data/spec/models/api_user_spec.rb +58 -0
  169. data/spec/models/asset_output_spec.rb +4 -0
  170. data/spec/models/asset_spec.rb +4 -0
  171. data/spec/models/output_spec.rb +4 -0
  172. data/spec/models/permission_spec.rb +4 -0
  173. data/spec/spec_helper.rb +30 -0
  174. data/spec/support/fixture_loader.rb +9 -0
  175. data/spec/support/param_helper.rb +14 -0
  176. data/spec/support/permission_matcher.rb +17 -0
  177. data/vendor/assets/images/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  178. data/vendor/assets/images/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  179. data/vendor/assets/images/jquery-ui/ui-bg_flat_10_000000_40x100.png +0 -0
  180. data/vendor/assets/images/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  181. data/vendor/assets/images/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  182. data/vendor/assets/images/jquery-ui/ui-bg_glass_65_ffffff_1x400.png +0 -0
  183. data/vendor/assets/images/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  184. data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  185. data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  186. data/vendor/assets/images/jquery-ui/ui-icons_222222_256x240.png +0 -0
  187. data/vendor/assets/images/jquery-ui/ui-icons_228ef1_256x240.png +0 -0
  188. data/vendor/assets/images/jquery-ui/ui-icons_ef8c08_256x240.png +0 -0
  189. data/vendor/assets/images/jquery-ui/ui-icons_ffd27a_256x240.png +0 -0
  190. data/vendor/assets/images/jquery-ui/ui-icons_ffffff_256x240.png +0 -0
  191. data/vendor/assets/javascripts/backbone.js +1158 -0
  192. data/vendor/assets/javascripts/backbone.modelbinding.js +475 -0
  193. data/vendor/assets/javascripts/exif.js +695 -0
  194. data/vendor/assets/javascripts/jquery-ui.js +5614 -0
  195. data/vendor/assets/javascripts/simplemodal.js +698 -0
  196. data/vendor/assets/javascripts/spin.jquery.js +81 -0
  197. data/vendor/assets/javascripts/spin.min.js +1 -0
  198. data/vendor/assets/javascripts/underscore.min.js +1 -0
  199. metadata +658 -0
@@ -0,0 +1,140 @@
1
+ module AssetHostCore
2
+ module Admin
3
+ class AssetsController < BaseController
4
+ before_filter :get_asset, only: [:show, :update, :replace, :destroy]
5
+ skip_before_filter :verify_authenticity_token, only: [:upload, :replace]
6
+
7
+ #----------
8
+
9
+ def index
10
+ @assets = Asset.visible.order("updated_at desc")
11
+ .page(params[:page])
12
+ .per(24)
13
+ end
14
+
15
+ #----------
16
+
17
+ def search
18
+ @query = params[:q]
19
+
20
+ @assets = Asset.visible.search(@query,
21
+ :page => params[:page] ? params[:page].to_i : 1,
22
+ :per_page => 24,
23
+ :order => "created_at DESC, @relevance DESC",
24
+ :field_weights => {
25
+ :title => 10,
26
+ :caption => 5
27
+ }
28
+ )
29
+
30
+ render :index
31
+ end
32
+
33
+ #----------
34
+
35
+ def upload
36
+ file = params[:file]
37
+
38
+ # FIXME: Put in place to keep Firefox 7 happy
39
+ if !file.original_filename
40
+ file.original_filename = "upload.jpg"
41
+ end
42
+
43
+ asset = Asset.new(image: file)
44
+
45
+ if asset.save
46
+ render json: asset.as_json
47
+ else
48
+ render text: 'ERROR'
49
+ end
50
+ end
51
+
52
+ #----------
53
+
54
+ def metadata
55
+ @assets = Asset.where(id: params[:ids].split(','))
56
+ end
57
+
58
+ #----------
59
+
60
+ def update_metadata
61
+ params[:assets].each do |id, attributes|
62
+ asset = Asset.find(id)
63
+ asset.update_attributes(attributes)
64
+ end
65
+
66
+ redirect_to a_assets_path
67
+ end
68
+
69
+ #----------
70
+
71
+ def show
72
+ # Use "visible" here because we are choosing next/prev based on the
73
+ # index listing. Hard-coding the order here (ID) because the
74
+ # AssetHostBrowserUI uses ID if no ORDER option is passed in, which
75
+ # it currently isn't, so the grid is ordered by ID.
76
+ @assets = AssetHostCore::Asset.visible.order('id desc')
77
+ @prev = @assets.where('id > ?', @asset.id).last
78
+ @next = @assets.where('id < ?', @asset.id).first
79
+ end
80
+
81
+ #----------
82
+
83
+ def update
84
+ if @asset.update_attributes(params[:asset])
85
+ flash[:notice] = "Successfully updated asset."
86
+ redirect_to a_asset_path(@asset)
87
+ else
88
+ flash[:notice] = @asset.errors.full_messages.join("<br/>")
89
+ render :action => :edit
90
+ end
91
+ end
92
+
93
+ #----------
94
+
95
+ def replace
96
+ file = params[:file]
97
+
98
+ if !file
99
+ render :text => 'ERROR' and return
100
+ end
101
+
102
+ # FIXME: Put in place to keep Firefox 7 happy
103
+ if !file.original_filename
104
+ file.original_filename = "upload.jpg"
105
+ end
106
+
107
+ # tell paperclip to replace our image
108
+ @asset.image = file
109
+
110
+ if @asset.save
111
+ render json: @asset.as_json
112
+ else
113
+ puts "Error: #{@asset.errors.to_s}"
114
+ render :text => 'ERROR'
115
+ end
116
+ end
117
+
118
+ #----------
119
+
120
+ def destroy
121
+ if @asset.destroy
122
+ flash[:notice] = "Deleted asset #{@asset.title}."
123
+ redirect_to a_assets_path
124
+ else
125
+ flash[:error] = "Unable to delete asset."
126
+ redirect_to a_asset_path(@asset)
127
+ end
128
+ end
129
+
130
+
131
+ #----------
132
+
133
+ protected
134
+
135
+ def get_asset
136
+ @asset = Asset.find(params[:id])
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,36 @@
1
+ module AssetHostCore
2
+ module Admin
3
+ class BaseController < ApplicationController
4
+ layout 'asset_host_core/application'
5
+
6
+ before_filter :_authenticate_user!
7
+
8
+ helper_method :_current_user
9
+ helper_method :_sign_out_path
10
+
11
+ def _authenticate_user!
12
+ instance_eval &AssetHostCore::Config.authentication_method
13
+ end
14
+
15
+
16
+ def _current_user
17
+ instance_eval &AssetHostCore::Config.current_user_method
18
+ end
19
+
20
+
21
+ def _sign_out_path
22
+ instance_eval &AssetHostCore::Config.sign_out_path
23
+ end
24
+
25
+
26
+ private
27
+
28
+ def authorize_admin
29
+ unless current_user.is_admin?
30
+ flash[:error] = "You must be a superuser to do that."
31
+ redirect_to assethost.a_root_path and return false
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,13 @@
1
+ module AssetHostCore
2
+ module Admin
3
+ class HomeController < BaseController
4
+ def chooser
5
+ @assets = AssetHostCore::Asset.order("updated_at desc")
6
+ .page(params[:page])
7
+ .per(24)
8
+
9
+ render layout: 'asset_host_core/minimal'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,55 @@
1
+ module AssetHostCore
2
+ module Admin
3
+ class OutputsController < BaseController
4
+ layout 'asset_host_core/full_width'
5
+
6
+ before_filter :authorize_admin
7
+ before_filter :get_output, except: [:index, :new, :create]
8
+
9
+
10
+ def index
11
+ @outputs = Output.all
12
+ end
13
+
14
+
15
+ def update
16
+ if @output.update_attributes(params[:output])
17
+ flash[:notice] = "Updated Output."
18
+ redirect_to a_outputs_path
19
+ else
20
+ render :edit
21
+ end
22
+ end
23
+
24
+
25
+ def new
26
+ @output = Output.new
27
+ end
28
+
29
+
30
+ def create
31
+ @output = Output.new(params[:output])
32
+
33
+ if @output.save
34
+ flash[:notice] = "Created Output."
35
+ redirect_to a_outputs_path
36
+ else
37
+ render :new
38
+ end
39
+ end
40
+
41
+
42
+ def destroy
43
+ @output.destroy
44
+ flash[:notice] = "Destroyed Output."
45
+ redirect_to a_outputs_path
46
+ end
47
+
48
+ private
49
+
50
+ def get_output
51
+ @output = Output.find(params[:id])
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,110 @@
1
+ module AssetHostCore
2
+ module Api
3
+ class AssetsController < BaseController
4
+ before_filter :set_access_control_headers
5
+
6
+ before_filter -> { authorize(:read) }, only: [:index, :show, :tag]
7
+ before_filter -> { authorize(:write) }, only: [:update, :create]
8
+
9
+ before_filter :get_asset, only: [:show, :update, :tag]
10
+
11
+
12
+ def index
13
+ if params[:q].present?
14
+ @assets = Asset.visible.search(params[:q],
15
+ :page => params[:page] ? params[:page].to_i : 1,
16
+ :per_page => 24,
17
+ :order => "created_at DESC, @relevance DESC",
18
+ :field_weights => {
19
+ :title => 10,
20
+ :caption => 3
21
+ }
22
+ )
23
+ else
24
+ @assets = Asset.visible.order("updated_at desc")
25
+ .page(params[:page])
26
+ .per(24)
27
+ end
28
+
29
+ response.headers['X-Next-Page'] = (@assets.last_page? ? nil : @assets.current_page + 1).to_s
30
+ response.headers['X-Total-Entries'] = @assets.total_count.to_s
31
+
32
+ respond_with @assets
33
+ end
34
+
35
+
36
+ def show
37
+ respond_with @asset
38
+ end
39
+
40
+
41
+ def update
42
+ if @asset.update_attributes(params[:asset])
43
+ respond_with @asset
44
+ else
45
+ respond_with @asset.errors.full_messages, :status => :error
46
+ end
47
+ end
48
+
49
+
50
+ def create
51
+ if !params[:url]
52
+ render_bad_request(message: "Must provide an asset URL")
53
+ return false
54
+ end
55
+
56
+ # see if we have a loader for this URL
57
+ if asset = AssetHostCore.as_asset(params[:url])
58
+ if params[:note].present?
59
+ asset.notes += "\n#{params[:note]}"
60
+ end
61
+
62
+ asset.is_hidden = params[:hidden].present?
63
+ asset.caption = params[:caption] if params[:caption].present?
64
+ asset.owner = params[:owner] if params[:owner].present?
65
+ asset.title = params[:title] if params[:title].present?
66
+
67
+ asset.save
68
+ respond_with asset, location: a_asset_path(asset)
69
+
70
+ else
71
+ render_not_found(message: "Unable to find or load an asset at " \
72
+ "the URL #{params[:url]}")
73
+ return false
74
+ end
75
+ end
76
+
77
+
78
+ def tag
79
+ output = Output.find_by_code!(params[:style])
80
+ ao = @asset.outputs.where(output_id: output.id).first
81
+
82
+ tag = {
83
+ :id => @asset.id,
84
+ :tag => @asset.image.tag(params[:style].to_sym),
85
+ :updated_at => @asset.image_updated_at,
86
+ :owner => @asset.owner,
87
+ :width => ao.try(:width),
88
+ :height => ao.try(:height)
89
+ }
90
+
91
+ respond_with tag
92
+ end
93
+
94
+
95
+ private
96
+
97
+ def authorize(ability)
98
+ super ability, "AssetHostCore::Asset"
99
+ end
100
+
101
+ def get_asset
102
+ @asset = Asset.find_by_id(params[:id])
103
+
104
+ if !@asset
105
+ render_not_found and return false
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,43 @@
1
+ module AssetHostCore
2
+ module Api
3
+ class BaseController < ApplicationController
4
+ layout false
5
+
6
+ before_filter :authenticate_api_user
7
+ respond_to :json
8
+
9
+
10
+ private
11
+
12
+ def set_access_control_headers
13
+ response.headers['Access-Control-Allow-Origin'] =
14
+ request.env['HTTP_ORIGIN'] || "*"
15
+ end
16
+
17
+
18
+ # For the authentication/authorization checks, if the API is being
19
+ # accessed by AssetHost, then we should give it full write permission.
20
+ # If we add write ability via the API to Outputs or anything else,
21
+ # we should reassess this decision.
22
+ def authenticate_api_user
23
+ return true if current_user
24
+ @api_user = ApiUser.authenticate(params[:auth_token])
25
+
26
+ if !@api_user
27
+ render_unauthorized and return false
28
+ end
29
+ end
30
+
31
+
32
+ def authorize(ability, resource)
33
+ return true if current_user
34
+
35
+ if !@api_user.may?(ability, resource)
36
+ render_forbidden and return false
37
+ else
38
+ return true
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,33 @@
1
+ module AssetHostCore
2
+ module Api
3
+ class OutputsController < BaseController
4
+ before_filter -> { authorize(:read) }, only: [:index, :show]
5
+ before_filter :get_output, only: [:show]
6
+
7
+
8
+ def index
9
+ @outputs = Output.all
10
+ respond_with @outputs
11
+ end
12
+
13
+ def show
14
+ respond_with @output
15
+ end
16
+
17
+
18
+ private
19
+
20
+ def authorize(ability)
21
+ super ability, "AssetHostCore::Output"
22
+ end
23
+
24
+ def get_output
25
+ @output = Output.find_by_code(params[:id])
26
+
27
+ if !@output
28
+ render_not_found and return false
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ module AssetHostCore
2
+ class ApplicationController < ::ApplicationController
3
+
4
+
5
+ private
6
+
7
+ def render_not_found(options={})
8
+ options[:message] ||= "Not Found"
9
+ render_error(status: 404, message: options[:message])
10
+ end
11
+
12
+ def render_bad_request(options={})
13
+ options[:message] ||= "Bad Request"
14
+ render_error(status: 400, message: options[:message])
15
+ end
16
+
17
+ def render_unauthorized(options={})
18
+ options[:message] ||= "Unauthorized"
19
+ render_error(status: 401, message: options[:message])
20
+ end
21
+
22
+ def render_forbidden(options={})
23
+ options[:message] ||= "Forbidden"
24
+ render_error(status: 403, message: options[:message])
25
+ end
26
+
27
+
28
+ def render_error(options={})
29
+ options[:message] ||= "Error"
30
+
31
+ respond_to do |format|
32
+ format.html { render status: options[:status] }
33
+
34
+ format.json do
35
+ render :json => {
36
+ :status => options[:status],
37
+ :error => options[:message]
38
+ }, :status => options[:status]
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end