carraway 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7413bee588bc81463c7f6157ec89072fa668e57fb3dc82a9ac44d9122dbf1f75
4
- data.tar.gz: 882068dfc6f541197e5090bb06fbd1deba5c878888cdbe75c1e4e43e1966dbee
3
+ metadata.gz: e471f5dd46965102f05fa1ea09778a917a597ab013e3bafccf65609985a047b3
4
+ data.tar.gz: 8b3a5647ec657e5536bc5a66081bfdbb46355f3ddf153dc2bea13af53c9d25b0
5
5
  SHA512:
6
- metadata.gz: 1f2ae24be1f374f31f169b0a4df78ef67d663930b2822c8a3f2383efa8dc73c41d3f8fa28de9a0948c5a5f493154b747b46a368643b2346ca36d098e1ea1996b
7
- data.tar.gz: 21e46ee4e9f196e3eb3f8469c0931f4f9551a066388115c04b6d73d1e8d1e0213dee6b0dfb3428dc0dc4684773f9ba459a62e385236b8603d1db221b3caa6092
6
+ metadata.gz: aac3ab9b4b42cd867ea13618e61950ff9178be52f3ea768e6ed78e8d7087c38a3a7cc2c4ff050d8ef072028ed6e8ef1aebe48b4cfce626ad23dc9658d87050a5
7
+ data.tar.gz: dbd5e5c8a049a62b139dfb55082bcc50cfa74b7dd80d8bdebc4a78b056ce23720c6344d479391275bf9c43a613d0a7524df18ab898534d0c0d8c7f57e37ba87e
data/carraway.gemspec CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency 'thor'
24
24
  spec.add_dependency 'sinatra'
25
25
  spec.add_dependency 'aws-sdk-dynamodb'
26
+ spec.add_dependency 'aws-sdk-s3'
26
27
  spec.add_dependency 'rack-flash3'
27
28
 
28
29
  spec.add_development_dependency "bundler", "~> 1.16"
data/lib/carraway.rb CHANGED
@@ -4,5 +4,6 @@ end
4
4
  require 'carraway/version'
5
5
  require 'carraway/category'
6
6
  require 'carraway/post'
7
+ require 'carraway/file'
7
8
  require 'carraway/config'
8
9
  require 'carraway/server'
@@ -19,6 +19,10 @@ module Carraway
19
19
  def gatsby_endpoint
20
20
  @config['gatsby_endpoint'] || 'http://localhost:8000'
21
21
  end
22
+
23
+ def file_backend
24
+ @config['file_backend']
25
+ end
22
26
  end
23
27
  end
24
28
  end
@@ -0,0 +1,85 @@
1
+ require 'aws-sdk-dynamodb'
2
+ require 'aws-sdk-s3'
3
+
4
+ module Carraway
5
+ class File
6
+ class << self
7
+ def all
8
+ query = { table_name: Config.backend['table_name'] }
9
+ query[:filter_expression] = <<~FILTER
10
+ record_type = :type
11
+ FILTER
12
+ query[:expression_attribute_values] = { ':type' => 'file' }
13
+
14
+ dynamo_client.scan(query).items.map do |item|
15
+ new(
16
+ uid: item['uid'],
17
+ title: item['title'],
18
+ created: item['created']
19
+ )
20
+ end
21
+ end
22
+
23
+ def dynamo_client
24
+ if Config.backend['endpoint']
25
+ Aws::DynamoDB::Client.new(
26
+ endpoint: Config.backend['endpoint'],
27
+ region: Config.backend['region'],
28
+ access_key_id: 'dummy',
29
+ secret_access_key: 'dummy'
30
+ )
31
+ else
32
+ Aws::DynamoDB::Client.new
33
+ end
34
+ end
35
+ end
36
+
37
+ attr_reader :title, :uid, :created
38
+
39
+ def initialize(title:, file: nil, uid: nil, created: nil)
40
+ @title = title
41
+ @file = file
42
+ @uid = uid || generate_uid
43
+ @created = created
44
+ end
45
+
46
+ %i(created).each do |col|
47
+ define_method("#{col}_at") do
48
+ at = send(col)
49
+ at && Time.at(at)
50
+ end
51
+ end
52
+
53
+ # FIXME duplicate impl on Post
54
+ def generate_uid
55
+ [Time.now.strftime('%Y%m%d%H%M%S'), "%05d" % rand(10000)].join
56
+ end
57
+
58
+ def s3_client
59
+ Aws::S3::Client.new
60
+ end
61
+
62
+ def path
63
+ ext = '.pdf' # FIXME Accept other type
64
+ [Config.file_backend['prefix'], '/', @uid, ext].join
65
+ end
66
+
67
+ def save(at = Time.now)
68
+ self.class.dynamo_client.put_item(
69
+ table_name: Config.backend['table_name'],
70
+ item: {
71
+ uid: @uid,
72
+ record_type: 'file',
73
+ title: @title,
74
+ created: at.to_i
75
+ }
76
+ )
77
+ s3_client.put_object(
78
+ body: @file[:tempfile],
79
+ bucket: Config.file_backend['bucket'],
80
+ acl: 'public-read',
81
+ key: path
82
+ )
83
+ end
84
+ end
85
+ end
data/lib/carraway/post.rb CHANGED
@@ -47,11 +47,17 @@ module Carraway
47
47
  query = { table_name: Config.backend['table_name'] }
48
48
  if published_only
49
49
  query[:filter_expression] = <<~FILTER
50
- attribute_exists(published)
50
+ record_type = :type
51
+ AND attribute_exists(published)
51
52
  AND (NOT attribute_type(published, :t))
52
53
  AND published < :now
53
54
  FILTER
54
- query[:expression_attribute_values] = { ':t' => 'NULL', ':now' => Time.now.to_i }
55
+ query[:expression_attribute_values] = { ':t' => 'NULL', ':now' => Time.now.to_i, ':type' => 'post' }
56
+ else
57
+ query[:filter_expression] = <<~FILTER
58
+ record_type = :type
59
+ FILTER
60
+ query[:expression_attribute_values] = { ':type' => 'post' }
55
61
  end
56
62
 
57
63
  client.scan(query).items.map do |item|
@@ -152,6 +158,7 @@ module Carraway
152
158
  title: @title,
153
159
  body: @body,
154
160
  path: path,
161
+ record_type: 'post',
155
162
  category: @category.key,
156
163
  created: @created.to_i,
157
164
  updated: @updated.to_i,
@@ -5,7 +5,7 @@ require 'time'
5
5
 
6
6
  module Carraway
7
7
  class Server < Sinatra::Base
8
- set :views, File.expand_path('../views', __FILE__)
8
+ set :views, ::File.expand_path('../views', __FILE__)
9
9
  set :method_override, true
10
10
  enable :sessions
11
11
  use Rack::Flash
@@ -26,11 +26,13 @@ module Carraway
26
26
  end
27
27
 
28
28
  get '/carraway/new' do
29
+ @files = File.all
29
30
  erb :new
30
31
  end
31
32
 
32
33
  get %r{/carraway/edit/(\d+)} do |uid|
33
34
  @post = Post.find(uid)
35
+ @files = File.all
34
36
  # FIXME handle not found
35
37
  erb :edit
36
38
  end
@@ -105,5 +107,17 @@ module Carraway
105
107
  flash[:message] = "Deleted #{@post.uid}"
106
108
  redirect "/carraway/"
107
109
  end
110
+
111
+ get '/carraway/files' do
112
+ @files = File.all
113
+ erb :files
114
+ end
115
+
116
+ post '/carraway/files' do
117
+ file = File.new(title: params[:title], file: params[:file])
118
+ file.save # FIXME validation and error
119
+ flash[:message] = "Saved #{file.path}"
120
+ redirect "/carraway/files"
121
+ end
108
122
  end
109
123
  end
@@ -1,3 +1,3 @@
1
1
  module Carraway
2
- VERSION = "0.6.0"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -32,6 +32,8 @@
32
32
  <button type="submit" class="waves-effect waves-light btn">保存</button>
33
33
  </div>
34
34
  </form>
35
+ <%= erb :file_modal, layout: false %>
36
+
35
37
  <a class="waves-effect waves-light btn blue" href="<%= "/carraway/preview/#{@post.uid}" %>" target="_blank">プレビュー</a>
36
38
  <% if @post.published %>
37
39
  <form action="/carraway/unpublish" method="POST" class="col s12">
@@ -0,0 +1,39 @@
1
+ <a class="waves-effect waves-light btn modal-trigger" href="#file-modal">ファイルをリンク</a>
2
+ <div id="file-modal" class="modal">
3
+ <div class="modal-content">
4
+ <table>
5
+ <thead>
6
+ <tr>
7
+ <th></th>
8
+ <th>タイトル</th>
9
+ <th>作成日</th>
10
+ <th>パス</th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <% @files.each do |file| %>
15
+ <tr>
16
+ <td><button onclick="useFile('<%= file.title %>', '<%= file.path%>')">使う</button></td>
17
+ <td><%= file.title %></td>
18
+ <td><%= file.created_at %></td>
19
+ <td><%= file.path %></td>
20
+ </tr>
21
+ <% end %>
22
+ </tbody>
23
+ </table>
24
+ </div>
25
+ <div class="modal-footer">
26
+ <a href="#!" class="modal-close waves-effect waves-green btn-flat">閉じる</a>
27
+ </div>
28
+ </div>
29
+ <script>
30
+ var useFile = function(title, path) {
31
+ var body = document.getElementById('body');
32
+ body.value = body.value + '[' + title + '](/' + path + ')'
33
+ }
34
+
35
+ document.addEventListener('DOMContentLoaded', function() {
36
+ var elems = document.querySelectorAll('.modal');
37
+ var instances = M.Modal.init(elems);
38
+ });
39
+ </script>
@@ -0,0 +1,34 @@
1
+ <h3>Files</h3>
2
+ <div class="row">
3
+ <form action="/carraway/files" method="POST" class="col s12" enctype="multipart/form-data">
4
+ <div class="row">
5
+ <div class="input-field col s12">
6
+ <input type="text" id="title" name="title" placeholder="ファイルタイトル">
7
+ <label for="title">ファイルタイトル</label>
8
+ </div>
9
+ <div class="input-field col s12">
10
+ <input type="file" id="file" name="file" placeholder="ファイル">
11
+ </div>
12
+ </div>
13
+
14
+ <button type="submit" class="waves-effect waves-light btn">保存</button>
15
+ </form>
16
+ </div>
17
+ <table>
18
+ <thead>
19
+ <tr>
20
+ <th>タイトル</th>
21
+ <th>作成日</th>
22
+ <th>パス</th>
23
+ </tr>
24
+ </thead>
25
+ <tbody>
26
+ <% @files.each do |file| %>
27
+ <tr>
28
+ <td><%= file.title %></td>
29
+ <td><%= file.created_at %></td>
30
+ <td><%= file.path %></td>
31
+ </tr>
32
+ <% end %>
33
+ </tbody>
34
+ </table>
@@ -13,6 +13,7 @@
13
13
  <a href="/carraway/" class="brand-logo">Carraway</a>
14
14
  <ul id="nav-mobile" class="right hide-on-med-and-down">
15
15
  <li><a href="/carraway/">記事一覧</a></li>
16
+ <li><a href="/carraway/files">ファイル一覧</a></li>
16
17
  <li><a href="/carraway/new">新規作成</a></li>
17
18
  </ul>
18
19
  </div>
@@ -20,4 +20,5 @@
20
20
 
21
21
  <button type="submit" class="waves-effect waves-light btn">保存</button>
22
22
  </form>
23
+ <%= erb :file_modal, layout: false %>
23
24
  </div>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carraway
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - adorechic
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-03 00:00:00.000000000 Z
11
+ date: 2018-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk-s3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rack-flash3
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -147,10 +161,13 @@ files:
147
161
  - lib/carraway/category.rb
148
162
  - lib/carraway/cli.rb
149
163
  - lib/carraway/config.rb
164
+ - lib/carraway/file.rb
150
165
  - lib/carraway/post.rb
151
166
  - lib/carraway/server.rb
152
167
  - lib/carraway/version.rb
153
168
  - lib/carraway/views/edit.erb
169
+ - lib/carraway/views/file_modal.erb
170
+ - lib/carraway/views/files.erb
154
171
  - lib/carraway/views/layout.erb
155
172
  - lib/carraway/views/new.erb
156
173
  - lib/carraway/views/top.erb