life-story 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +56 -0
  3. data/Gemfile +21 -0
  4. data/Gemfile.lock +136 -0
  5. data/LICENSE +21 -0
  6. data/README.md +40 -0
  7. data/Rakefile +8 -0
  8. data/app/controllers/application_controller.rb +31 -0
  9. data/app/controllers/story_controller.rb +101 -0
  10. data/app/controllers/user_controller.rb +59 -0
  11. data/app/models/.gitkeep +0 -0
  12. data/app/models/category.rb +4 -0
  13. data/app/models/concerns/slugifiable.rb +13 -0
  14. data/app/models/story.rb +8 -0
  15. data/app/models/user.rb +12 -0
  16. data/app/models/user_story.rb +4 -0
  17. data/app/views/layout.erb +42 -0
  18. data/app/views/stories/edit.erb +51 -0
  19. data/app/views/stories/new.erb +47 -0
  20. data/app/views/stories/show.erb +46 -0
  21. data/app/views/stories/show_by_category.erb +27 -0
  22. data/app/views/stories/show_by_date.erb +27 -0
  23. data/app/views/stories/show_by_users.erb +29 -0
  24. data/app/views/users/signup.erb +36 -0
  25. data/app/views/welcome.erb +51 -0
  26. data/config.ru +10 -0
  27. data/config/environment.rb +12 -0
  28. data/db/development.sqlite +0 -0
  29. data/db/migrate/20200118192302_create_users.rb +9 -0
  30. data/db/migrate/20200118192313_create_categories.rb +7 -0
  31. data/db/migrate/20200118192321_create_stories.rb +10 -0
  32. data/db/migrate/20200118201120_create_user_stories.rb +8 -0
  33. data/db/schema.rb +38 -0
  34. data/db/seeds.rb +39 -0
  35. data/development.sqlite +0 -0
  36. data/lib/.gitkeep +0 -0
  37. data/life-story.gemspec +46 -0
  38. data/public/favicon.ico +0 -0
  39. data/public/images/.gitkeep +0 -0
  40. data/public/images/life-story.png +0 -0
  41. data/public/javascripts/.gitkeep +0 -0
  42. data/public/stylesheets/main.css +246 -0
  43. metadata +204 -0
File without changes
@@ -0,0 +1,4 @@
1
+ class Category < ActiveRecord::Base
2
+ has_many :stories
3
+ has_many :users, through: :stories
4
+ end
@@ -0,0 +1,13 @@
1
+ module Slugifiable
2
+ module InstanceMethods
3
+ def slug
4
+ self.username.gsub(" ", '-').downcase
5
+ end
6
+ end
7
+
8
+ module ClassMethods
9
+ def find_by_slug(slug)
10
+ self.all.find {|instance| instance.slug == slug}
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ require_relative './concerns/slugifiable.rb'
2
+
3
+ class Story < ActiveRecord::Base
4
+
5
+ belongs_to :category
6
+ has_many :user_stories
7
+ has_many :users, through: :user_stories
8
+ end
@@ -0,0 +1,12 @@
1
+ require_relative './concerns/slugifiable.rb'
2
+
3
+ class User < ActiveRecord::Base
4
+ extend Slugifiable::ClassMethods
5
+ include Slugifiable::InstanceMethods
6
+
7
+ has_many :user_stories
8
+ has_many :stories, through: :user_stories
9
+ has_many :categories, through: :stories
10
+
11
+ has_secure_password
12
+ end
@@ -0,0 +1,4 @@
1
+ class UserStory < ActiveRecord::Base
2
+ belongs_to :user
3
+ belongs_to :story
4
+ end
@@ -0,0 +1,42 @@
1
+ <!DOCTYPE html>
2
+ <!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
3
+ <!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
4
+ <!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
5
+ <!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
6
+ <head>
7
+ <meta charset="utf-8" />
8
+ <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
9
+
10
+ <title>LifeStory</title>
11
+
12
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
13
+
14
+ <link rel="stylesheet" href="/stylesheets/main.css" />
15
+ </head>
16
+ <body>
17
+ <div class="wrapper">
18
+
19
+ <% flash.keys.each do |type| %>
20
+ <div data-alert class="flash <%= type %> alert-box radius">
21
+ <%= flash[type] %>
22
+ <a href="#" class="close">&times;</a>
23
+ </div>
24
+ <% end %>
25
+
26
+ <%= yield %>
27
+
28
+ <footer class="branding">
29
+ <small>&copy; 2020 <strong>LifeStory</strong></small>
30
+ <% if logged_in? %>
31
+ <a href="/logout">Log out</a>
32
+ <% end %>
33
+ </footer>
34
+ </div>
35
+
36
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
37
+ <!--[if lt IE 7]>
38
+ <script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js"></script>
39
+ <script>window.attachEvent("onload",function(){CFInstall.check({mode:"overlay"})})</script>
40
+ <![endif]-->
41
+ </body>
42
+ </html>
@@ -0,0 +1,51 @@
1
+ <div class="container">
2
+ <header><img src="/images/life-story.png" class="img-responsive main-image"></header>
3
+ <div class="col-md-8 col-md-offset-2">
4
+ <h2>Edit your story</h2>
5
+
6
+ <div class="content">
7
+ <form action="/stories/<%= @story.id %>" method="post" id="new">
8
+ <input type="hidden" id="hidden" name="_method" value="patch">
9
+ This is a story about <select id="category" name="category" required>
10
+ <option value="<%= @story.category_id %>" selected><%= @story.category.name %></option>
11
+ <% Category.all.reject {|c| c.id == @story.category_id }.each do |category| %>
12
+ <option value="<%= category.id %>"><%= category.name %></option>
13
+ <% end %>
14
+ </select>.<br>
15
+
16
+ I <input type="text" name="summary" id="summary" value="<%= @story.summary %>" style="width:60%" required>.<br>
17
+
18
+ It happened on <input type="date" id="date" name="date" value="<%= @story.date %>" style="width:30%" required>. <br>
19
+
20
+ <textarea name="description" style="width:90%; height:400px;" required><%= @story.description %></textarea><br>
21
+
22
+ I want <select id="user" name="users[]" style="width:25%">
23
+ <option hidden disabled selected value>None</option>
24
+ <% User.all.reject {|u| u.id == current_user.id }.each do |user| %>
25
+ <option value = "<%= user.id %>"><%= user.username %></option>
26
+ <% end %>
27
+ </select> and
28
+
29
+ <select id="user" name="users[]" style="width:25%">
30
+ <option hidden disabled selected value>None</option>
31
+ <% User.all.reject {|u| u.id == current_user.id }.each do |user| %>
32
+ <option value = "<%= user.id %>"><%= user.username %></option>
33
+ <% end %>
34
+ </select> to be a part of this story.<br>
35
+
36
+ <button type="submit" value="submit" style="padding:18px 64px; margin:18px 0">Update story</button>
37
+ </form>
38
+ </div>
39
+
40
+ <div class="sidebar">
41
+ <ul>
42
+ <li><a href="/stories/<%= @story.id %>">Back to story</a></li>
43
+ <li><a href="/new">New story</a></li>
44
+ <li><a href="/users/<%= current_user.slug %>">View my stories</a></li>
45
+ <li><a href="/">Back to homepage</a></li>
46
+ <li><a href="/logout">Log out</a></li>
47
+ </ul>
48
+ </div>
49
+
50
+ </div>
51
+ </div>
@@ -0,0 +1,47 @@
1
+ <div class="container">
2
+ <header><img src="/images/life-story.png" class="img-responsive main-image"></header>
3
+ <div class="col-md-8 col-md-offset-2">
4
+ <h2>Write your story</h2>
5
+
6
+ <div class="content">
7
+ <form action="/" method="post" id="new">
8
+ This is a story about <select id="category" name="category" required>
9
+ <% Category.all.each do |category| %>
10
+ <option value = "<%= category.id %>"><%= category.name %></option>
11
+ <% end %>
12
+ </select>.<br>
13
+
14
+ I <input type="text" id="summary" name="summary" placeholder="did something" style="width:60%" required>.<br>
15
+
16
+ It happened on <input type="date" id="date" name="date" style="width:30%" required>.<br>
17
+
18
+ <textarea name="description" placeholder="I feel.." style="width:90%; height:400px;" required></textarea>.<br>
19
+
20
+ I want <select id="user" name="users[]" style="width:25%">
21
+ <option hidden disabled selected value>None</option>
22
+ <% User.all.reject {|u| u.id == current_user.id }.each do |user| %>
23
+ <option value = "<%= user.id %>"><%= user.username %></option>
24
+ <% end %>
25
+ </select> and
26
+
27
+ <select id="user" name="users[]" style="width:25%">
28
+ <option hidden disabled selected value>None</option>
29
+ <% User.all.reject {|u| u.id == current_user.id }.each do |user| %>
30
+ <option value = "<%= user.id %>"><%= user.username %></option>
31
+ <% end %>
32
+ </select> to be a part of this story.<br>
33
+
34
+ <button type="submit" value="submit" style="padding:18px 64px; margin:18px 0">Publish</button>
35
+ </form>
36
+ </div>
37
+
38
+ <div class="sidebar">
39
+ <ul>
40
+ <li><a href="/new">New story</a></li>
41
+ <li><a href="/users/<%= current_user.slug %>">View my stories</a></li>
42
+ <li><a href="/">Back to homepage</a></li>
43
+ <li><a href="/logout">Log out</a></li>
44
+ </ul>
45
+ </div>
46
+ </div>
47
+ </div>
@@ -0,0 +1,46 @@
1
+ <div class="container">
2
+ <header><img src="/images/life-story.png" class="img-responsive main-image"></header>
3
+ <div class="col-md-8 col-md-offset-2">
4
+ <h2>Here's the story:</h2>
5
+
6
+ <div class="content">
7
+ <p style="background-color:#eee; line-height:50px;">
8
+ I <mark><%= @story.summary %></mark> on <mark><a href="/dates/<%= @story.date %>" style="font-family:sans-serif; font-size:16px; font-weight:bold; color:black"><%= @story.date %></a></mark>,
9
+ </p>
10
+
11
+ <p style="font-family:courier; font-size:14px; margin-left:50px; text-indent:50px">
12
+ "<%= @story.description %>"
13
+ </p>
14
+
15
+ <p style="text-align:center">
16
+ -- by <% @story.users.each do |user| %>
17
+ <a href="/users/<%= user.slug %>" style="font-family:sans-serif; font-size:16px; font-weight:bold; color:black"><mark><%= user.username %></a> </mark>
18
+ <% end %>
19
+ </p>
20
+
21
+ <p style="text-align: right"><a href="/categories/<%= @story.category.name %>" style="font-family:sans-serif; font-size:16px; font-weight:bold; color:black">Tag: <mark><%= @story.category.name %></mark></a>
22
+ </p>
23
+
24
+ <% if @story.user_ids.include?(current_user.id) %>
25
+ <form action="/stories/<%= @story.id %>" method="post" style="margin:18px 0; float:right">
26
+ <input type="hidden" id="hidden" name="_method" value="delete">
27
+ <button type="submit" value="submit" style="padding:18px 64px;">Delete Story</button>
28
+ </form>
29
+ <% end %>
30
+
31
+ </div>
32
+
33
+ <div class="sidebar">
34
+ <ul>
35
+ <% if @story.user_ids.include?(current_user.id) %>
36
+ <li><a href="/stories/<%= @story.id %>/edit">Edit story</a></li>
37
+ <% end %>
38
+ <li><a href="/new">New story</a></li>
39
+ <li><a href="/users/<%= current_user.slug %>">View my stories</a></li>
40
+ <li><a href="/">Back to homepage</a></li>
41
+ <li><a href="/logout">Log out</a></li>
42
+ </ul>
43
+ </div>
44
+
45
+ </div>
46
+ </div>
@@ -0,0 +1,27 @@
1
+ <div class="container">
2
+ <header><img src="/images/life-story.png" class="img-responsive main-image"></header>
3
+ <div class="col-md-8 col-md-offset-2">
4
+ <h2>Stories about <mark><%= @category.name %></mark></h2>
5
+
6
+ <div class="content">
7
+ <% @category.stories.all.order("date desc").each do |story| %>
8
+ <p id="stories" onclick="location.href='/stories/<%= story.id %>'">
9
+ <% story.users.each do |user| %>
10
+ <mark><%= user.username %>,</mark>
11
+ <% end %>
12
+ recorded something about their <mark><%= story.category.name %></mark> happened on <mark><%= story.date %></mark>.
13
+ </p>
14
+ <% end %>
15
+ </div>
16
+
17
+ <div class="sidebar">
18
+ <ul>
19
+ <li><a href="/new">New story</a></li>
20
+ <li><a href="/users/<%= current_user.slug %>">View my stories</a></li>
21
+ <li><a href="/">Back to homepage</a></li>
22
+ <li><a href="/logout">Log out</a></li>
23
+ </ul>
24
+ </div>
25
+
26
+ </div>
27
+ </div>
@@ -0,0 +1,27 @@
1
+ <div class="container">
2
+ <header><img src="/images/life-story.png" class="img-responsive main-image"></header>
3
+ <div class="col-md-8 col-md-offset-2">
4
+ <h2>Stories happened on <mark><%= @date %></mark></h2>
5
+
6
+ <div class="content">
7
+ <% Story.all.select {|s| s.date == @date}.each do |story| %>
8
+ <p id="stories" onclick="location.href='/stories/<%= story.id %>'">
9
+ <% story.users.each do |user| %>
10
+ <mark><%= user.username %>,</mark>
11
+ <% end %>
12
+ recorded something about their <mark><%= story.category.name %></mark> happened on <mark><%= story.date %></mark>.
13
+ </p>
14
+ <% end %>
15
+ </div>
16
+
17
+ <div class="sidebar">
18
+ <ul>
19
+ <li><a href="/new">New story</a></li>
20
+ <li><a href="/users/<%= current_user.slug %>">View my stories</a></li>
21
+ <li><a href="/">Back to homepage</a></li>
22
+ <li><a href="/logout">Log out</a></li>
23
+ </ul>
24
+ </div>
25
+
26
+ </div>
27
+ </div>
@@ -0,0 +1,29 @@
1
+ <div class="container">
2
+ <header><img src="/images/life-story.png" class="img-responsive main-image"></header>
3
+ <div class="col-md-8 col-md-offset-2">
4
+ <h2><mark><%= @user.username %></mark>'s stories:</h2>
5
+
6
+ <div class="content">
7
+ <% @user.stories.all.order("date desc").each do |story| %>
8
+ <p id="stories" onclick="location.href='/stories/<%= story.id %>'">
9
+ <% story.users.each do |user| %>
10
+ <mark><%= user.username %>,</mark>
11
+ <% end %>
12
+ recorded something about their <mark><%= story.category.name %></mark> happened on <mark><%= story.date %></mark>.
13
+ </p>
14
+ <% end %>
15
+ </div>
16
+
17
+ <div class="sidebar">
18
+ <ul>
19
+ <li><a href="/new">New story</a></li>
20
+ <li><a href="/users/<%= current_user.slug %>">View my stories</a></li>
21
+ <li><a href="/">Back to homepage</a></li>
22
+ <li><a href="/logout">Log out</a></li>
23
+ </ul>
24
+
25
+
26
+ </div>
27
+
28
+ </div>
29
+ </div>
@@ -0,0 +1,36 @@
1
+ <div class="container">
2
+ <header><img src="/images/life-story.png" class="img-responsive main-image"></header>
3
+ <div class="col-md-8 col-md-offset-2">
4
+ <h2>Create your own account:</h2>
5
+ <div class="content">
6
+
7
+
8
+ <form action="/signup" method="post">
9
+ <label for="username">Usermame:</label>
10
+ <input type="text" id="username" name="username" required>
11
+
12
+ <label for="email">Email:</label>
13
+ <input type="text" id="email" name="email" required>
14
+
15
+ <label for="password">Password:</label>
16
+ <input type="text" id="password" name="password" required>
17
+
18
+ <button type="submit" value="submit">Sign up</button>
19
+ </form>
20
+ </div>
21
+
22
+ <div class="sidebar">
23
+ <h3>Already have an account?</h3><br>
24
+ <form action="/login" method="post">
25
+ <label for="username">Usermame:</label>
26
+ <input type="text" id="username" name="username" required>
27
+
28
+ <label for="password">Password:</label>
29
+ <input type="text" id="password" name="password" required>
30
+
31
+ <button type="submit" value="submit">Log in</button>
32
+ </form>
33
+ </div>
34
+
35
+ </div>
36
+ </div>
@@ -0,0 +1,51 @@
1
+ <div class="container">
2
+ <header><img src="/images/life-story.png" class="img-responsive main-image"></header>
3
+ <div class="col-md-8 col-md-offset-2">
4
+ <h2>[əˈloːˌha] !</h2>
5
+
6
+ <div class="content">
7
+ <p>Welcome to Life Story™, a place where important memories are kept.</p>
8
+ <p>We can all so easily lose focus. We grow anxious about work, about time, about some inconsequential people and their comments, yet in the end, they do not matter.</p>
9
+ <p>Let's keep us reminded of what really define us - those moments that we shared, we loved, we fought and made the right decision. </p>
10
+
11
+ <% if logged_in? %>
12
+ <h3>Here's what's been happening:</h3>
13
+ <% Story.all.order("date desc").each do |story| %>
14
+ <p id="stories" onclick="location.href='/stories/<%= story.id %>'">
15
+ <% story.users.each do |user| %>
16
+ <mark><%= user.username %>,</mark>
17
+ <% end %>
18
+ recorded something about their <mark><%= story.category.name %></mark> happened on <mark><%= story.date %></mark>.
19
+ </p>
20
+ <% end %>
21
+ <% end %>
22
+ </div>
23
+
24
+ <div class="sidebar">
25
+ <% if !logged_in? %>
26
+ <h3>Sign in</h3><br>
27
+ <form action="/login" method="post">
28
+ <label for="username">Usermame:</label>
29
+ <input type="text" id="username" name="username" required>
30
+
31
+ <label for="password">Password:</label>
32
+ <input type="text" id="password" name="password" required>
33
+
34
+ <button type="submit" value="submit">Log in</button>
35
+ </form>
36
+
37
+ <p><a href="/signup">Don't have an account?</a></p>
38
+
39
+ <% else %>
40
+
41
+ <h3>Welcome back, <%= current_user.username %>!</h3>
42
+ <ul>
43
+ <li><a href="/new">New story</a></li>
44
+ <li><a href="/users/<%= current_user.slug %>">View my stories</a></li>
45
+ <li><a href="/logout">Log out</a></li>
46
+ </ul>
47
+ <% end %>
48
+
49
+ </div>
50
+ </div>
51
+ </div>
@@ -0,0 +1,10 @@
1
+ require './config/environment'
2
+
3
+ if ActiveRecord::Migrator.needs_migration?
4
+ raise 'Migrations are pending. Run `rake db:migrate` to resolve the issue.'
5
+ end
6
+
7
+ use Rack::MethodOverride
8
+ use UserController
9
+ use StoryController
10
+ run ApplicationController
@@ -0,0 +1,12 @@
1
+ ENV['SINATRA_ENV'] ||= "development"
2
+
3
+ require 'bundler/setup'
4
+ Bundler.require(:default, ENV['SINATRA_ENV'])
5
+
6
+ ActiveRecord::Base.establish_connection(
7
+ :adapter => "sqlite3",
8
+ :database => "db/#{ENV['SINATRA_ENV']}.sqlite"
9
+ )
10
+
11
+ require './app/controllers/application_controller'
12
+ require_all 'app'