slim_fast 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +136 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/javascripts/errors.js +2 -0
  5. data/app/assets/stylesheets/errors.css +4 -0
  6. data/app/controllers/errors_controller.rb +4 -0
  7. data/app/controllers/expansions_controller.rb +84 -0
  8. data/app/controllers/short_domains_controller.rb +85 -0
  9. data/app/controllers/short_urls_controller.rb +115 -0
  10. data/app/helpers/errors_helper.rb +2 -0
  11. data/app/helpers/slim_fast/application_helper.rb +4 -0
  12. data/app/helpers/slim_fast/expansions_helper.rb +4 -0
  13. data/app/helpers/slim_fast/short_domains_helper.rb +4 -0
  14. data/app/helpers/slim_fast/short_urls_helper.rb +4 -0
  15. data/app/models/expansion.rb +6 -0
  16. data/app/models/short_domain.rb +6 -0
  17. data/app/models/short_url.rb +35 -0
  18. data/app/views/errors/invalid_code.html.erb +2 -0
  19. data/app/views/expansions/_form.html.erb +45 -0
  20. data/app/views/expansions/edit.html.erb +5 -0
  21. data/app/views/expansions/index.html.erb +43 -0
  22. data/app/views/expansions/new.html.erb +5 -0
  23. data/app/views/expansions/show.html.erb +42 -0
  24. data/app/views/shared/_slim_fast_navigation.html.erb +11 -0
  25. data/app/views/short_domains/_form.html.erb +26 -0
  26. data/app/views/short_domains/edit.html.erb +5 -0
  27. data/app/views/short_domains/index.html.erb +38 -0
  28. data/app/views/short_domains/new.html.erb +5 -0
  29. data/app/views/short_domains/show.html.erb +27 -0
  30. data/app/views/short_urls/_form.html.erb +61 -0
  31. data/app/views/short_urls/_short_urls_table.html.erb +24 -0
  32. data/app/views/short_urls/edit.html.erb +5 -0
  33. data/app/views/short_urls/index.html.erb +19 -0
  34. data/app/views/short_urls/new.html.erb +5 -0
  35. data/app/views/short_urls/show.html.erb +77 -0
  36. data/config/routes.rb +17 -0
  37. data/db/migrate/20121004232924_create_slim_fast_short_domains.rb +10 -0
  38. data/db/migrate/20121004234409_create_slim_fast_short_urls.rb +22 -0
  39. data/db/migrate/20121004234536_create_slim_fast_expansions.rb +15 -0
  40. data/lib/slim_fast.rb +4 -0
  41. data/lib/slim_fast/engine.rb +5 -0
  42. data/lib/slim_fast/version.rb +3 -0
  43. data/lib/tasks/slim_fast_tasks.rake +4 -0
  44. data/test/dummy/README.rdoc +261 -0
  45. data/test/dummy/Rakefile +7 -0
  46. data/test/dummy/app/assets/javascripts/application.js +15 -0
  47. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  48. data/test/dummy/app/controllers/application_controller.rb +3 -0
  49. data/test/dummy/app/helpers/application_helper.rb +2 -0
  50. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  51. data/test/dummy/config.ru +4 -0
  52. data/test/dummy/config/application.rb +59 -0
  53. data/test/dummy/config/boot.rb +10 -0
  54. data/test/dummy/config/database.yml +25 -0
  55. data/test/dummy/config/environment.rb +5 -0
  56. data/test/dummy/config/environments/development.rb +37 -0
  57. data/test/dummy/config/environments/production.rb +67 -0
  58. data/test/dummy/config/environments/test.rb +37 -0
  59. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  60. data/test/dummy/config/initializers/inflections.rb +15 -0
  61. data/test/dummy/config/initializers/mime_types.rb +5 -0
  62. data/test/dummy/config/initializers/secret_token.rb +7 -0
  63. data/test/dummy/config/initializers/session_store.rb +8 -0
  64. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  65. data/test/dummy/config/locales/en.yml +5 -0
  66. data/test/dummy/config/routes.rb +4 -0
  67. data/test/dummy/db/development.sqlite3 +0 -0
  68. data/test/dummy/db/schema.rb +54 -0
  69. data/test/dummy/log/development.log +8542 -0
  70. data/test/dummy/public/404.html +26 -0
  71. data/test/dummy/public/422.html +26 -0
  72. data/test/dummy/public/500.html +25 -0
  73. data/test/dummy/public/favicon.ico +0 -0
  74. data/test/dummy/script/rails +6 -0
  75. data/test/dummy/tmp/cache/assets/C27/920/sprockets%2F1fe65007aa375565a9348253347444f9 +0 -0
  76. data/test/dummy/tmp/cache/assets/C2A/3C0/sprockets%2Fbf216b96e4625134934f18748756b125 +0 -0
  77. data/test/dummy/tmp/cache/assets/C50/380/sprockets%2F26016472b58ca461a65fa6951744c367 +0 -0
  78. data/test/dummy/tmp/cache/assets/C7F/E20/sprockets%2F33d534294133822566119b8d7d5ba6ec +0 -0
  79. data/test/dummy/tmp/cache/assets/CA7/F40/sprockets%2Fb9488f9fbe87445bc38136287d954775 +0 -0
  80. data/test/dummy/tmp/cache/assets/CC2/330/sprockets%2F07797d1858badd3219d57b87954b3d08 +0 -0
  81. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  82. data/test/dummy/tmp/cache/assets/CDF/D90/sprockets%2F0d3e4f0a8075d386a6f5591146a078cd +0 -0
  83. data/test/dummy/tmp/cache/assets/D04/360/sprockets%2Ff72c7ca5bb201c3d8178112b5985cf03 +0 -0
  84. data/test/dummy/tmp/cache/assets/D10/EC0/sprockets%2F265d8e58821c5c1e766ddbf814800ba2 +0 -0
  85. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  86. data/test/dummy/tmp/cache/assets/D38/6D0/sprockets%2F73f8e43a3540a5da61c62fa8b51882ad +0 -0
  87. data/test/dummy/tmp/cache/assets/D4C/060/sprockets%2F696b70f02f9165e9b6b0a874fff13dd5 +0 -0
  88. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  89. data/test/dummy/tmp/cache/assets/D55/CD0/sprockets%2Fceb2e6285ffd7d7545b04757e8e6c357 +0 -0
  90. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  91. data/test/dummy/tmp/cache/assets/D62/500/sprockets%2Ff50e441403287cf5904aad30ffcbe05f +0 -0
  92. data/test/dummy/tmp/cache/assets/D7A/700/sprockets%2F8ec8c9e963236de2b707709ee3bb3f0c +0 -0
  93. data/test/dummy/tmp/cache/assets/DA7/2A0/sprockets%2Fa37ff5e4c7d9d5a93690eeec0c6072a5 +0 -0
  94. data/test/dummy/tmp/cache/assets/DBC/CC0/sprockets%2Fa16ccbfcd61258cc4a59171a1a8d6b1c +0 -0
  95. data/test/dummy/tmp/cache/assets/DC9/490/sprockets%2Ff0b23b7ce1fe240e2916fde55eb9cd51 +0 -0
  96. data/test/dummy/tmp/cache/assets/DCD/0B0/sprockets%2F8e74ddd350631963f4bdeee6cb017cac +0 -0
  97. data/test/dummy/tmp/cache/assets/DCD/3D0/sprockets%2F57b7ab77dabfd46f191fde6d2a45013f +0 -0
  98. data/test/dummy/tmp/cache/assets/DDA/BA0/sprockets%2F956c26dfdede717f68bac19770ee24aa +0 -0
  99. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  100. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  101. data/test/dummy/tmp/cache/assets/E08/650/sprockets%2F5bee8a4b599a4fec8f50da484da0f7b6 +0 -0
  102. data/test/dummy/tmp/cache/assets/E29/DE0/sprockets%2Fef93d515dc6a6f05fee3a79e4bda1ab0 +0 -0
  103. data/test/fixtures/slim_fast/expansions.yml +19 -0
  104. data/test/fixtures/slim_fast/short_domains.yml +9 -0
  105. data/test/fixtures/slim_fast/short_urls.yml +33 -0
  106. data/test/functional/errors_controller_test.rb +9 -0
  107. data/test/functional/slim_fast/expansions_controller_test.rb +51 -0
  108. data/test/functional/slim_fast/short_domains_controller_test.rb +51 -0
  109. data/test/functional/slim_fast/short_urls_controller_test.rb +51 -0
  110. data/test/integration/navigation_test.rb +10 -0
  111. data/test/slim_fast_test.rb +7 -0
  112. data/test/test_helper.rb +15 -0
  113. data/test/unit/helpers/errors_helper_test.rb +4 -0
  114. data/test/unit/helpers/slim_fast/expansions_helper_test.rb +6 -0
  115. data/test/unit/helpers/slim_fast/short_domains_helper_test.rb +6 -0
  116. data/test/unit/helpers/slim_fast/short_urls_helper_test.rb +6 -0
  117. data/test/unit/slim_fast/expansion_test.rb +9 -0
  118. data/test/unit/slim_fast/short_domain_test.rb +9 -0
  119. data/test/unit/slim_fast/short_url_test.rb +9 -0
  120. metadata +278 -0
@@ -0,0 +1,20 @@
1
+ Copyright 2012 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,136 @@
1
+ slim_fast
2
+ =========
3
+
4
+ The lightening speed diet plan that makes your URLs slimmer, faster.
5
+
6
+ slim_fast is a Ruby gem that makes it easy to create your own custom URL shortening service that can be embedded into your new or existing Rails app. Since it is a library and contains a Rails Engine, slim_fast will not interfere with your existing application.
7
+
8
+ Project Status
9
+ --------------
10
+
11
+ ### Basic functionality implemented, but not yet stable.
12
+
13
+ slim_fast is not yet complete. It is under heavy development and this status will change when the first usable release is available.
14
+
15
+ Features
16
+ --------
17
+
18
+ Current:
19
+
20
+ * Gem & Rails Engine
21
+ * Custom Domain(s)
22
+ * Simple Admin Interface
23
+ * Basic Short Link Expansion Statistics
24
+
25
+ Pending:
26
+
27
+ * Shorten internal (Rails) and external URLs
28
+ * Detailed Short Link Statistics
29
+ * Google Analytics Campaign Tracking (utm_source, etc)
30
+
31
+ Future:
32
+
33
+ * Rack App
34
+ * Command-line Tools
35
+ * Integration with external URL shortening services (goo.gl, tinyurl, etc)?
36
+ * Downloadable Reports (csv, xls, json API)
37
+
38
+ Maybes:
39
+
40
+ * Captive Pausing (display another page for x seconds before redirecting to destination)
41
+
42
+ Installation
43
+ ------------
44
+
45
+ ```shell
46
+ $ gem install slim_fast
47
+ $ rails g slim_fast_engine:install:migrations
48
+ $ rake db:migrate
49
+ ```
50
+
51
+ Design Considerations
52
+ ---------------------
53
+
54
+ * Must be easy to install/upgrade
55
+ * gem install slim_fast
56
+ * rails g slim_fast_engine:install:migrations
57
+ * edit initializer
58
+ * Must be testable
59
+ * rspec
60
+ * cucumber?
61
+ * Can be customized
62
+ * developer can configure via admin interface
63
+ * admin interface can be nested into existing admin UI
64
+
65
+ Model Structure
66
+ ---------------
67
+
68
+ ShortDomain
69
+ <pre>
70
+ domain:string (required)
71
+ is_default:boolean (default: false)
72
+ </pre>
73
+
74
+ ShortUrl
75
+ <pre>
76
+ short_domain_id:integer (optional)
77
+ code:string (required)
78
+ destination_url:string (required)
79
+ name:string (required)
80
+ description:text (optional)
81
+ expansion_count:integer (default: 0)
82
+ owner_type:string (optional)
83
+ owner_id:integer (optional)
84
+ utm_enabled:boolean (default: false)
85
+ utm_source:string (optional)
86
+ utm_medium:string (optional)
87
+ utm_campaign:string (optional)
88
+ utm_term:string (optional)
89
+ utm_content:string (optional)
90
+ </pre>
91
+
92
+ Expansion
93
+ <pre>
94
+ short_url_id:integer (required)
95
+ domain_id:integer (optional)
96
+ request_url:string (optional)
97
+ referrer_url:string (optional)
98
+ remote_ip:string (optional)
99
+ remote_addr:string (optional)
100
+ user_agent:string (optional)
101
+ </pre>
102
+
103
+ Maintainer
104
+ ----------
105
+
106
+ * Kevin Elliott - http://kevinelliott.net - http://github.com/kevinelliott
107
+ * WeLike - http://www.welikeinc.com - http://github.com/welike
108
+
109
+ Contributors
110
+ ------------
111
+
112
+ A warm thank you to all contributors to the project, who have put effort and time into making this gem more useful.
113
+
114
+ License
115
+ -------
116
+
117
+ (The MIT License)
118
+
119
+ Permission is hereby granted, free of charge, to any person obtaining
120
+ a copy of this software and associated documentation files (the
121
+ 'Software'), to deal in the Software without restriction, including
122
+ without limitation the rights to use, copy, modify, merge, publish,
123
+ distribute, sublicense, and/or sell copies of the Software, and to
124
+ permit persons to whom the Software is furnished to do so, subject to
125
+ the following conditions:
126
+
127
+ The above copyright notice and this permission notice shall be
128
+ included in all copies or substantial portions of the Software.
129
+
130
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
131
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
132
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
133
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
134
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
135
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
136
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'SlimFast'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+
27
+
28
+ Bundler::GemHelper.install_tasks
29
+
30
+ require 'rake/testtask'
31
+
32
+ Rake::TestTask.new(:test) do |t|
33
+ t.libs << 'lib'
34
+ t.libs << 'test'
35
+ t.pattern = 'test/**/*_test.rb'
36
+ t.verbose = false
37
+ end
38
+
39
+
40
+ task :default => :test
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ class ErrorsController < ApplicationController
2
+ def invalid_code
3
+ end
4
+ end
@@ -0,0 +1,84 @@
1
+ class ExpansionsController < ApplicationController
2
+
3
+ # GET /expansions
4
+ # GET /expansions.json
5
+ def index
6
+ @expansions = Expansion.all
7
+
8
+ respond_to do |format|
9
+ format.html # index.html.erb
10
+ format.json { render json: @expansions }
11
+ end
12
+ end
13
+
14
+ # GET /expansions/1
15
+ # GET /expansions/1.json
16
+ def show
17
+ @expansion = Expansion.find(params[:id])
18
+
19
+ respond_to do |format|
20
+ format.html # show.html.erb
21
+ format.json { render json: @expansion }
22
+ end
23
+ end
24
+
25
+ # GET /expansions/new
26
+ # GET /expansions/new.json
27
+ def new
28
+ @expansion = Expansion.new
29
+
30
+ respond_to do |format|
31
+ format.html # new.html.erb
32
+ format.json { render json: @expansion }
33
+ end
34
+ end
35
+
36
+ # GET /expansions/1/edit
37
+ def edit
38
+ @expansion = Expansion.find(params[:id])
39
+ end
40
+
41
+ # POST /expansions
42
+ # POST /expansions.json
43
+ def create
44
+ @expansion = Expansion.new(params[:expansion])
45
+
46
+ respond_to do |format|
47
+ if @expansion.save
48
+ format.html { redirect_to @expansion, notice: 'Expansion was successfully created.' }
49
+ format.json { render json: @expansion, status: :created, location: @expansion }
50
+ else
51
+ format.html { render action: "new" }
52
+ format.json { render json: @expansion.errors, status: :unprocessable_entity }
53
+ end
54
+ end
55
+ end
56
+
57
+ # PUT /expansions/1
58
+ # PUT /expansions/1.json
59
+ def update
60
+ @expansion = Expansion.find(params[:id])
61
+
62
+ respond_to do |format|
63
+ if @expansion.update_attributes(params[:expansion])
64
+ format.html { redirect_to @expansion, notice: 'Expansion was successfully updated.' }
65
+ format.json { head :no_content }
66
+ else
67
+ format.html { render action: "edit" }
68
+ format.json { render json: @expansion.errors, status: :unprocessable_entity }
69
+ end
70
+ end
71
+ end
72
+
73
+ # DELETE /expansions/1
74
+ # DELETE /expansions/1.json
75
+ def destroy
76
+ @expansion = Expansion.find(params[:id])
77
+ @expansion.destroy
78
+
79
+ respond_to do |format|
80
+ format.html { redirect_to expansions_url }
81
+ format.json { head :no_content }
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,85 @@
1
+ class ShortDomainsController < ApplicationController
2
+
3
+ # GET /short_domains
4
+ # GET /short_domains.json
5
+ def index
6
+ @short_domains = ShortDomain.all
7
+
8
+ respond_to do |format|
9
+ format.html # index.html.erb
10
+ format.json { render json: @short_domains }
11
+ end
12
+ end
13
+
14
+ # GET /short_domains/1
15
+ # GET /short_domains/1.json
16
+ def show
17
+ @short_domain = ShortDomain.find(params[:id], :include => { :short_urls => :short_domain })
18
+
19
+ respond_to do |format|
20
+ format.html # show.html.erb
21
+ format.json { render json: @short_domain }
22
+ end
23
+ end
24
+
25
+ # GET /short_domains/new
26
+ # GET /short_domains/new.json
27
+ def new
28
+ @short_domain = ShortDomain.new
29
+
30
+ respond_to do |format|
31
+ format.html # new.html.erb
32
+ format.json { render json: @short_domain }
33
+ end
34
+ end
35
+
36
+ # GET /short_domains/1/edit
37
+ def edit
38
+ @short_domain = ShortDomain.find(params[:id], :include => [:short_urls])
39
+ end
40
+
41
+ # POST /short_domains
42
+ # POST /short_domains.json
43
+ def create
44
+ @short_domain = ShortDomain.new(params[:short_domain])
45
+ puts @short_domain.inspect
46
+
47
+ respond_to do |format|
48
+ if @short_domain.save
49
+ format.html { redirect_to @short_domain, notice: 'Short domain was successfully created.' }
50
+ format.json { render json: @short_domain, status: :created, location: @short_domain }
51
+ else
52
+ format.html { render action: "new" }
53
+ format.json { render json: @short_domain.errors, status: :unprocessable_entity }
54
+ end
55
+ end
56
+ end
57
+
58
+ # PUT /short_domains/1
59
+ # PUT /short_domains/1.json
60
+ def update
61
+ @short_domain = ShortDomain.find(params[:id])
62
+
63
+ respond_to do |format|
64
+ if @short_domain.update_attributes(params[:short_domain])
65
+ format.html { redirect_to @short_domain, notice: 'Short domain was successfully updated.' }
66
+ format.json { head :no_content }
67
+ else
68
+ format.html { render action: "edit" }
69
+ format.json { render json: @short_domain.errors, status: :unprocessable_entity }
70
+ end
71
+ end
72
+ end
73
+
74
+ # DELETE /short_domains/1
75
+ # DELETE /short_domains/1.json
76
+ def destroy
77
+ @short_domain = ShortDomain.find(params[:id])
78
+ @short_domain.destroy
79
+
80
+ respond_to do |format|
81
+ format.html { redirect_to short_domains_url }
82
+ format.json { head :no_content }
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,115 @@
1
+ class ShortUrlsController < ApplicationController
2
+
3
+ # GET /short_urls
4
+ # GET /short_urls.json
5
+ def index
6
+ @short_domain = ShortDomain.find_by_id(params[:short_domain_id])
7
+ @short_urls = if @short_domain
8
+ @short_domain.short_urls.includes(:short_domain)
9
+ else
10
+ ShortUrl.includes(:short_domain)
11
+ end
12
+
13
+ respond_to do |format|
14
+ format.html # index.html.erb
15
+ format.json { render json: @short_urls }
16
+ end
17
+ end
18
+
19
+ # GET /short_urls/1
20
+ # GET /short_urls/1.json
21
+ def show
22
+ @short_url = ShortUrl.find(params[:id])
23
+
24
+ respond_to do |format|
25
+ format.html # show.html.erb
26
+ format.json { render json: @short_url }
27
+ end
28
+ end
29
+
30
+ # GET /short_urls/new
31
+ # GET /short_urls/new.json
32
+ def new
33
+ @short_domain = ShortDomain.find_by_id(params[:short_domain_id], :include => [:short_urls])
34
+ @short_url = if @short_domain
35
+ @short_domain.short_urls.build
36
+ else
37
+ ShortUrl.new
38
+ end
39
+
40
+ respond_to do |format|
41
+ format.html # new.html.erb
42
+ format.json { render json: @short_url }
43
+ end
44
+ end
45
+
46
+ # GET /short_urls/1/edit
47
+ def edit
48
+ @short_url = ShortUrl.find(params[:id])
49
+ end
50
+
51
+ # POST /short_urls
52
+ # POST /short_urls.json
53
+ def create
54
+ @short_url = ShortUrl.new(params[:short_url])
55
+
56
+ respond_to do |format|
57
+ if @short_url.save
58
+ format.html { redirect_to @short_url, notice: 'Short url was successfully created.' }
59
+ format.json { render json: @short_url, status: :created, location: @short_url }
60
+ else
61
+ format.html { render action: "new" }
62
+ format.json { render json: @short_url.errors, status: :unprocessable_entity }
63
+ end
64
+ end
65
+ end
66
+
67
+ # PUT /short_urls/1
68
+ # PUT /short_urls/1.json
69
+ def update
70
+ @short_url = ShortUrl.find(params[:id])
71
+
72
+ respond_to do |format|
73
+ if @short_url.update_attributes(params[:short_url])
74
+ format.html { redirect_to @short_url, notice: 'Short url was successfully updated.' }
75
+ format.json { head :no_content }
76
+ else
77
+ format.html { render action: "edit" }
78
+ format.json { render json: @short_url.errors, status: :unprocessable_entity }
79
+ end
80
+ end
81
+ end
82
+
83
+ # DELETE /short_urls/1
84
+ # DELETE /short_urls/1.json
85
+ def destroy
86
+ @short_url = ShortUrl.find(params[:id])
87
+ @short_url.destroy
88
+
89
+ respond_to do |format|
90
+ format.html { redirect_to short_urls_url }
91
+ format.json { head :no_content }
92
+ end
93
+ end
94
+
95
+ def expand
96
+ @short_url = ShortUrl.find_by_code(params[:code])
97
+
98
+ respond_to do |format|
99
+ if @short_url
100
+ @exp = @short_url.expansions.build
101
+ @exp.referrer_url = request.env['HTTP_REFERER']
102
+ @exp.request_url = request.original_url
103
+ @exp.user_agent = request.env["HTTP_USER_AGENT"]
104
+ @exp.remote_ip = request.remote_ip
105
+ @exp.remote_addr = request.remote_ip
106
+ @exp.save
107
+ @short_url.increment!(:expansion_count)
108
+
109
+ format.html { redirect_to @short_url.destination_url }
110
+ else
111
+ format.html { redirect_to invalid_code_path }
112
+ end
113
+ end
114
+ end
115
+ end