corpshort 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/app/views/404.erb +11 -0
- data/app/views/index.erb +2 -2
- data/lib/corpshort/app.rb +34 -5
- data/lib/corpshort/backends/dynamodb.rb +2 -1
- data/lib/corpshort/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05aa697749fa6aa8a335a07eca4da3e91aeb0ceb231b699d7e47a019c2894a2f
|
4
|
+
data.tar.gz: ffe3816d9caade8ba866f69c2fbe8f8145aecd6271ec47821d4a9c5a7f7c95e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39c7de94d9c1291c6b54eb7820947466d8e2a4bc4b660e553c14f7c2c32c95171ec7da50218f7ba920fab5d951842b9f1d4036eb5278465be18c37e20000bb3d
|
7
|
+
data.tar.gz: 3bd7f264425161ec818b349c8aae7b52d0305faf93f4484f919fdef96ee522d55e94054f72440d515ac13d5782e5a0d9efd29a9d8ae6411082dac7ea4a81e318
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
corpshort (0.
|
4
|
+
corpshort (0.2.0)
|
5
5
|
aws-sdk-dynamodb
|
6
6
|
erubi
|
7
7
|
prawn
|
@@ -15,8 +15,8 @@ GEM
|
|
15
15
|
remote: https://rubygems.org/
|
16
16
|
specs:
|
17
17
|
aws-eventstream (1.0.1)
|
18
|
-
aws-partitions (1.
|
19
|
-
aws-sdk-core (3.21.
|
18
|
+
aws-partitions (1.92.0)
|
19
|
+
aws-sdk-core (3.21.3)
|
20
20
|
aws-eventstream (~> 1.0)
|
21
21
|
aws-partitions (~> 1.0)
|
22
22
|
aws-sigv4 (~> 1.0)
|
data/app/views/404.erb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
<p>Ooh! Link you've request doesn't exist. Create it for someone?</p>
|
2
|
+
|
3
|
+
<section class='new-link'>
|
4
|
+
<form action='/+/links' method='POST'>
|
5
|
+
<p><input type='text' name='url' placeholder='https://...' class='new-link-url' autocomplete=off></p>
|
6
|
+
<p class='new-link-down'>⬇︎</p>
|
7
|
+
<p><input type='text' name='linkname' placeholder='Choose a short name (Recommended)' class='new-link-name' autocomplete=off></p>
|
8
|
+
<p><input type='submit' value='Shorten'></p>
|
9
|
+
</form>
|
10
|
+
</section>
|
11
|
+
|
data/app/views/index.erb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
<section class='new-link'>
|
2
2
|
<form action='/+/links' method='POST'>
|
3
|
-
<p><input type='text' name='url' placeholder='https://...' class='new-link-url'></p>
|
3
|
+
<p><input type='text' name='url' placeholder='https://...' value="<%= session[:last_form]&.dig(:url)&.sub(?", '') %>" class='new-link-url' autocomplete=off></p>
|
4
4
|
<p class='new-link-down'>⬇︎</p>
|
5
|
-
<p><input type='text' name='
|
5
|
+
<p><input type='text' name='linkname' placeholder='Choose a short name (Recommended)' value="<%= session[:last_form]&.dig(:linkname)&.sub(?", '') %>" class='new-link-name' autocomplete=off></p>
|
6
6
|
<p><input type='submit' value='Shorten'></p>
|
7
7
|
</form>
|
8
8
|
</section>
|
data/lib/corpshort/app.rb
CHANGED
@@ -86,6 +86,12 @@ module Corpshort
|
|
86
86
|
@backend ||= conf.fetch(:backend)
|
87
87
|
end
|
88
88
|
|
89
|
+
def random_name
|
90
|
+
chars_a = [*('A'..'Z')]
|
91
|
+
chars_b = [*('a'..'z'), *('0'..'9')]
|
92
|
+
[*1.times.map { |_| chars_a.sample }, *3.times.map { |_| chars_b.sample }].shuffle.join
|
93
|
+
end
|
94
|
+
|
89
95
|
def link_name(name = params[:name])
|
90
96
|
name.tr('_', '-')
|
91
97
|
end
|
@@ -136,19 +142,40 @@ module Corpshort
|
|
136
142
|
end
|
137
143
|
|
138
144
|
post '/+/links' do
|
139
|
-
unless params[:
|
145
|
+
unless params[:url]
|
140
146
|
session[:error] = "Name and URL are required"
|
141
147
|
redirect '/'
|
142
148
|
end
|
143
149
|
|
150
|
+
name_given = params[:linkname] && !params[:linkname].strip.empty?
|
151
|
+
name = link_name(name_given ? params[:linkname] : random_name)
|
152
|
+
retries = 0
|
144
153
|
begin
|
145
|
-
link = Link.new({name:
|
154
|
+
link = Link.new({name: name, url: params[:url]})
|
146
155
|
link.save!(backend, create_only: true)
|
147
|
-
rescue Corpshort::Link::ValidationError
|
156
|
+
rescue Corpshort::Link::ValidationError
|
157
|
+
session[:last_form] = {linkname: link.name, url: link.url}
|
148
158
|
session[:error] = $!.message
|
149
159
|
redirect '/'
|
160
|
+
rescue Corpshort::Backends::Base::ConflictError
|
161
|
+
if name_given
|
162
|
+
session[:last_form] = {linkname: link.name, url: link.url}
|
163
|
+
session[:error] = 'Link with the specified name already exists'
|
164
|
+
redirect '/'
|
165
|
+
else
|
166
|
+
name = link_name(random_name)
|
167
|
+
retries += 1
|
168
|
+
if retries > 20
|
169
|
+
session[:error] = 'Could not generate unique name. Try again later.'
|
170
|
+
redirect '/'
|
171
|
+
else
|
172
|
+
sleep 0.1
|
173
|
+
retry
|
174
|
+
end
|
175
|
+
end
|
150
176
|
end
|
151
177
|
|
178
|
+
session[:last_form] = nil
|
152
179
|
redirect "/#{link.name}+"
|
153
180
|
end
|
154
181
|
|
@@ -333,10 +360,12 @@ module Corpshort
|
|
333
360
|
name = name[0..-2]
|
334
361
|
end
|
335
362
|
|
336
|
-
@
|
363
|
+
@link_name = link_name(name)
|
364
|
+
@link = backend.get_link(@link_name)
|
337
365
|
|
338
366
|
unless @link
|
339
|
-
|
367
|
+
status 404
|
368
|
+
return erb(:'404')
|
340
369
|
end
|
341
370
|
|
342
371
|
if show
|
@@ -83,7 +83,7 @@ module Corpshort
|
|
83
83
|
exclusive_start_key: last_key ? last_key : nil,
|
84
84
|
key_condition_expression: 'updated_at_partition = :partition',
|
85
85
|
expression_attribute_values: {":partition" => partition.strftime('%Y-%m')},
|
86
|
-
limit:
|
86
|
+
limit: limit,
|
87
87
|
)
|
88
88
|
|
89
89
|
unless result.items.empty?
|
@@ -94,6 +94,7 @@ module Corpshort
|
|
94
94
|
last_key = nil
|
95
95
|
sleep 0.05
|
96
96
|
end
|
97
|
+
return [[], nil]
|
97
98
|
end
|
98
99
|
|
99
100
|
private
|
data/lib/corpshort/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: corpshort
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sorah Fukumori
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -194,6 +194,7 @@ files:
|
|
194
194
|
- README.md
|
195
195
|
- Rakefile
|
196
196
|
- app/public/style.css
|
197
|
+
- app/views/404.erb
|
197
198
|
- app/views/edit.erb
|
198
199
|
- app/views/index.erb
|
199
200
|
- app/views/layout.erb
|