unsakini 0.0.4.pre.1 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (223) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -27
  3. data/angular/angular-cli.json +3 -5
  4. data/{public/unsakini/app → angular/dist}/favicon.ico +0 -0
  5. data/angular/dist/index.html +14 -0
  6. data/angular/dist/inline.bundle.js +139 -0
  7. data/angular/dist/inline.map +1 -0
  8. data/angular/dist/main.bundle.js +64689 -0
  9. data/angular/dist/main.map +1 -0
  10. data/angular/dist/styles.bundle.js +364 -0
  11. data/angular/dist/styles.map +1 -0
  12. data/angular/package.json +1 -4
  13. data/angular/src/app/app.component.html +4 -1
  14. data/angular/src/app/app.module.ts +7 -8
  15. data/angular/src/app/app.routes.module.ts +2 -12
  16. data/angular/src/app/index.ts +0 -2
  17. data/angular/src/app/registration/registration.component.html +12 -70
  18. data/angular/src/app/registration/registration.component.spec.ts +11 -8
  19. data/angular/src/app/registration/registration.component.ts +8 -10
  20. data/angular/src/environments/environment.prod.ts +1 -2
  21. data/angular/src/environments/environment.ts +1 -2
  22. data/angular/src/index.html +1 -1
  23. data/angular/src/styles.css +1 -0
  24. data/app/controllers/api/boards_controller.rb +73 -0
  25. data/app/controllers/api/comments_controller.rb +51 -0
  26. data/app/controllers/api/posts_controller.rb +58 -0
  27. data/app/controllers/api/share_board_controller.rb +118 -0
  28. data/app/controllers/api/users_controller.rb +40 -0
  29. data/app/controllers/application_controller.rb +2 -2
  30. data/app/controllers/concerns/board_owner_controller_concern.rb +38 -0
  31. data/app/controllers/concerns/comment_owner_controller_concern.rb +33 -0
  32. data/app/controllers/concerns/logged_in_controller_concern.rb +21 -0
  33. data/app/controllers/concerns/post_owner_controller_concern.rb +36 -0
  34. data/app/controllers/concerns/serializer_controller_concern.rb +11 -0
  35. data/app/controllers/user_token_controller.rb +2 -0
  36. data/app/controllers/web_base_controller.rb +23 -0
  37. data/app/models/application_record.rb +5 -0
  38. data/app/models/board.rb +14 -0
  39. data/app/models/comment.rb +9 -0
  40. data/app/models/concerns/encryptable_model_concern.rb +96 -0
  41. data/app/models/post.rb +12 -0
  42. data/app/models/user.rb +15 -0
  43. data/app/models/user_board.rb +82 -0
  44. data/app/serializers/board_serializer.rb +5 -0
  45. data/app/serializers/{unsakini/comment_serializer.rb → comment_serializer.rb} +3 -6
  46. data/app/serializers/post_serializer.rb +23 -0
  47. data/app/serializers/user_board_serializer.rb +11 -0
  48. data/app/serializers/{unsakini/user_serializer.rb → user_serializer.rb} +2 -5
  49. data/app/views/{unsakini/web → web_base}/index.html.erb +169 -65
  50. data/config/routes.rb +10 -10
  51. data/db/migrate/20161116114222_create_boards.rb +9 -0
  52. data/db/migrate/{20161116200034_create_unsakini_user_boards.rb → 20161116200034_create_user_boards.rb} +2 -3
  53. data/db/migrate/{20161118031023_create_unsakini_posts.rb → 20161118031023_create_posts.rb} +2 -2
  54. data/db/migrate/{20161118100454_create_unsakini_comments.rb → 20161118100454_create_comments.rb} +2 -2
  55. data/db/migrate/20161118221508_add_encrypted_password_to_user_board.rb +5 -0
  56. data/db/migrate/20161122211105_create_users.rb +12 -0
  57. data/db/migrate/20161124102633_add_is_shared_to_boards.rb +5 -0
  58. data/lib/generators/unsakini/angular/USAGE +8 -0
  59. data/lib/generators/unsakini/angular/angular_generator.rb +7 -0
  60. data/lib/generators/unsakini/config/config_generator.rb +1 -3
  61. data/lib/tasks/unsakini_tasks.rake +37 -6
  62. data/lib/unsakini/engine.rb +0 -2
  63. data/lib/unsakini/version.rb +1 -1
  64. data/public/css/custom.css +1 -5
  65. data/public/images/logo.svg +619 -0
  66. data/spec/concerns/models/encryptable_concern.rb +2 -3
  67. data/spec/controllers/{web_controller_spec.rb → web_base_controller_spec.rb} +3 -4
  68. data/spec/dummy/config/application.rb +1 -3
  69. data/spec/dummy/config/environments/development.rb +0 -2
  70. data/spec/dummy/config/initializers/assets.rb +11 -0
  71. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  72. data/spec/dummy/config/initializers/session_store.rb +3 -0
  73. data/spec/dummy/db/development.sqlite3 +0 -0
  74. data/spec/dummy/db/migrate/20161124210219_create_boards.unsakini_engine.rb +10 -0
  75. data/spec/dummy/db/migrate/20161124210220_create_user_boards.unsakini_engine.rb +12 -0
  76. data/spec/dummy/db/migrate/20161124210221_create_posts.unsakini_engine.rb +13 -0
  77. data/spec/dummy/db/migrate/20161124210222_create_comments.unsakini_engine.rb +12 -0
  78. data/spec/dummy/db/migrate/20161124210223_add_encrypted_password_to_user_board.unsakini_engine.rb +6 -0
  79. data/spec/dummy/db/migrate/20161124210224_create_users.unsakini_engine.rb +13 -0
  80. data/spec/dummy/db/migrate/20161124210225_add_is_shared_to_boards.unsakini_engine.rb +6 -0
  81. data/spec/dummy/db/schema.rb +14 -16
  82. data/spec/dummy/db/test.sqlite3 +0 -0
  83. data/spec/dummy/public/app/favicon.ico +0 -0
  84. data/spec/dummy/public/app/index.html +14 -0
  85. data/spec/dummy/public/app/inline.bundle.js +139 -0
  86. data/spec/dummy/public/app/inline.map +1 -0
  87. data/spec/dummy/public/app/main.bundle.js +64689 -0
  88. data/spec/dummy/public/app/main.map +1 -0
  89. data/spec/dummy/public/app/styles.bundle.js +364 -0
  90. data/spec/dummy/public/app/styles.map +1 -0
  91. data/spec/dummy/tmp/unsakini-ng2/LICENSE +21 -0
  92. data/spec/dummy/tmp/unsakini-ng2/README.md +1 -0
  93. data/spec/dummy/tmp/unsakini-ng2/angular-cli.json +59 -0
  94. data/spec/dummy/tmp/unsakini-ng2/e2e/app.e2e-spec.ts +14 -0
  95. data/spec/dummy/tmp/unsakini-ng2/e2e/app.po.ts +11 -0
  96. data/spec/dummy/tmp/unsakini-ng2/e2e/signup.e2e-spec.ts +28 -0
  97. data/spec/dummy/tmp/unsakini-ng2/e2e/signup.po.ts +31 -0
  98. data/spec/dummy/tmp/unsakini-ng2/e2e/tsconfig.json +16 -0
  99. data/spec/dummy/tmp/unsakini-ng2/karma.conf.js +45 -0
  100. data/spec/dummy/tmp/unsakini-ng2/package.json +49 -0
  101. data/spec/dummy/tmp/unsakini-ng2/protractor.conf.js +32 -0
  102. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.css +0 -0
  103. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.html +4 -0
  104. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.spec.ts +47 -0
  105. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.ts +10 -0
  106. data/spec/dummy/tmp/unsakini-ng2/src/app/app.module.ts +29 -0
  107. data/spec/dummy/tmp/unsakini-ng2/src/app/app.routes.module.ts +29 -0
  108. data/spec/dummy/tmp/unsakini-ng2/src/app/index.ts +2 -0
  109. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.css +0 -0
  110. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.html +14 -0
  111. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.spec.ts +157 -0
  112. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.ts +42 -0
  113. data/spec/dummy/tmp/unsakini-ng2/src/environments/environment.prod.ts +3 -0
  114. data/spec/dummy/tmp/unsakini-ng2/src/environments/environment.ts +8 -0
  115. data/spec/dummy/tmp/unsakini-ng2/src/favicon.ico +0 -0
  116. data/spec/dummy/tmp/unsakini-ng2/src/index.html +14 -0
  117. data/spec/dummy/tmp/unsakini-ng2/src/main.ts +12 -0
  118. data/spec/dummy/tmp/unsakini-ng2/src/polyfills.ts +19 -0
  119. data/spec/dummy/tmp/unsakini-ng2/src/styles.css +1 -0
  120. data/spec/dummy/tmp/unsakini-ng2/src/test.ts +31 -0
  121. data/spec/dummy/tmp/unsakini-ng2/src/tsconfig.json +18 -0
  122. data/spec/dummy/tmp/unsakini-ng2/src/typings.d.ts +2 -0
  123. data/spec/dummy/tmp/unsakini-ng2/tslint.json +114 -0
  124. data/spec/dummy/tmp/unsakini-ng2/typings.json +4 -0
  125. data/spec/factories/boards.rb +1 -1
  126. data/spec/factories/comments.rb +1 -1
  127. data/spec/factories/posts.rb +1 -1
  128. data/spec/factories/user_boards.rb +1 -1
  129. data/spec/factories/users.rb +1 -1
  130. data/spec/models/board_spec.rb +2 -2
  131. data/spec/models/comment_spec.rb +2 -2
  132. data/spec/models/post_spec.rb +2 -2
  133. data/spec/models/user_board_spec.rb +19 -19
  134. data/spec/models/user_spec.rb +1 -1
  135. data/spec/requests/{boards/boards_crud_spec.rb → api/boards/api_boards_crud_spec.rb} +26 -26
  136. data/spec/requests/{boards/boards_pagination_spec.rb → api/boards/api_boards_pagination_spec.rb} +7 -7
  137. data/spec/requests/{boards/private_board_spec.rb → api/boards/api_private_board_spec.rb} +26 -26
  138. data/spec/requests/{boards/shared_board_spec.rb → api/boards/api_shared_board_spec.rb} +9 -9
  139. data/spec/requests/{boards/sharing_board_spec.rb → api/boards/api_sharing_board_spec.rb} +13 -13
  140. data/spec/requests/{comments/comments_pagination_spec.rb → api/comments/api_comments_pagination_spec.rb} +3 -3
  141. data/spec/requests/{comments/comments_private_board_spec.rb → api/comments/api_comments_private_board_spec.rb} +20 -20
  142. data/spec/requests/{comments/comments_shared_board_spec.rb → api/comments/api_comments_shared_board_spec.rb} +17 -17
  143. data/spec/requests/{posts/posts_pagination_spec.rb → api/posts/api_posts_pagination_spec.rb} +3 -3
  144. data/spec/requests/{posts/posts_private_board_spec.rb → api/posts/api_posts_private_board_spec.rb} +22 -22
  145. data/spec/requests/{posts/posts_shared_board_spec.rb → api/posts/api_posts_shared_board_spec.rb} +24 -24
  146. data/spec/requests/{user/user_create_spec.rb → api/user/api_user_create_spec.rb} +23 -19
  147. data/spec/requests/{user/user_search_spec.rb → api/user/api_user_search_spec.rb} +9 -9
  148. data/spec/spec_helper.rb +0 -1
  149. data/spec/support/auth_helper.rb +2 -0
  150. metadata +202 -135
  151. data/angular/npm-debug.log +0 -54
  152. data/angular/src/app/confirm-account/confirm-account.component.ts +0 -27
  153. data/angular/src/app/confirm-account/confirm-account.html +0 -41
  154. data/angular/src/app/confirm-account/confirm-account.module.ts +0 -24
  155. data/angular/src/app/confirm-account/confirm-account.scss +0 -3
  156. data/angular/src/app/confirm-account/confirm-account.service.ts +0 -27
  157. data/angular/src/app/confirm-account/index.ts +0 -3
  158. data/angular/src/app/login/index.ts +0 -3
  159. data/angular/src/app/login/login.component.ts +0 -40
  160. data/angular/src/app/login/login.html +0 -43
  161. data/angular/src/app/login/login.module.ts +0 -27
  162. data/angular/src/app/login/login.service.ts +0 -48
  163. data/angular/src/app/registration/index.ts +0 -3
  164. data/angular/src/app/registration/registration.module.ts +0 -23
  165. data/angular/src/app/registration/registration.service.ts +0 -46
  166. data/angular/src/app/registration/registration.services.spec.ts +0 -71
  167. data/angular/src/app/services/auth-http/auth.http.service.ts +0 -35
  168. data/angular/src/app/services/auth-http/index.ts +0 -1
  169. data/angular/src/app/services/http/http.service.spec.ts +0 -205
  170. data/angular/src/app/services/http/http.service.ts +0 -40
  171. data/angular/src/app/services/http/index.ts +0 -1
  172. data/angular/src/app/services/index.ts +0 -3
  173. data/angular/src/app/services/services.module.ts +0 -33
  174. data/angular/src/assets/global.scss +0 -3
  175. data/angular/src/environments/custom.ts +0 -4
  176. data/app/controllers/concerns/unsakini/board_owner_controller_concern.rb +0 -42
  177. data/app/controllers/concerns/unsakini/comment_owner_controller_concern.rb +0 -36
  178. data/app/controllers/concerns/unsakini/logged_in_controller_concern.rb +0 -23
  179. data/app/controllers/concerns/unsakini/post_owner_controller_concern.rb +0 -38
  180. data/app/controllers/concerns/unsakini/serializer_controller_concern.rb +0 -13
  181. data/app/controllers/unsakini/base_controller.rb +0 -6
  182. data/app/controllers/unsakini/boards_controller.rb +0 -76
  183. data/app/controllers/unsakini/comments_controller.rb +0 -54
  184. data/app/controllers/unsakini/posts_controller.rb +0 -61
  185. data/app/controllers/unsakini/share_board_controller.rb +0 -122
  186. data/app/controllers/unsakini/user_token_controller.rb +0 -17
  187. data/app/controllers/unsakini/users_controller.rb +0 -69
  188. data/app/controllers/unsakini/web_controller.rb +0 -27
  189. data/app/mailers/unsakini/user_mailer.rb +0 -13
  190. data/app/models/concerns/unsakini/encryptable_model_concern.rb +0 -97
  191. data/app/models/unsakini/application_record.rb +0 -7
  192. data/app/models/unsakini/board.rb +0 -16
  193. data/app/models/unsakini/comment.rb +0 -12
  194. data/app/models/unsakini/post.rb +0 -15
  195. data/app/models/unsakini/user.rb +0 -43
  196. data/app/models/unsakini/user_board.rb +0 -84
  197. data/app/models/unsakini.rb +0 -5
  198. data/app/serializers/unsakini/board_serializer.rb +0 -7
  199. data/app/serializers/unsakini/post_serializer.rb +0 -26
  200. data/app/serializers/unsakini/user_board_serializer.rb +0 -14
  201. data/app/views/unsakini/user_mailer/confirm_account.html.erb +0 -3
  202. data/db/migrate/20161116114222_create_unsakini_boards.rb +0 -10
  203. data/db/migrate/20161126145352_create_unsakini_users.rb +0 -15
  204. data/lib/generators/unsakini/dependencies/USAGE +0 -5
  205. data/lib/generators/unsakini/dependencies/dependencies_generator.rb +0 -19
  206. data/public/images/unsakini.svg +0 -56
  207. data/public/unsakini/app/448c34a56d699c29117adc64c43affeb.woff2 +0 -0
  208. data/public/unsakini/app/89889688147bd7575d6327160d64e760.svg +0 -288
  209. data/public/unsakini/app/assets/global.scss +0 -3
  210. data/public/unsakini/app/e18bbf611f2a2e43afc071aa2f4e1512.ttf +0 -0
  211. data/public/unsakini/app/f4769f9bdb7466be65088239c12046d1.eot +0 -0
  212. data/public/unsakini/app/fa2772327f55d8198301fdb8bcfc8158.woff +0 -0
  213. data/public/unsakini/app/index.html +0 -14
  214. data/public/unsakini/app/inline.d41d8cd98f00b204e980.bundle.js +0 -2
  215. data/public/unsakini/app/inline.d41d8cd98f00b204e980.bundle.map +0 -1
  216. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.js +0 -2152
  217. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.js.gz +0 -0
  218. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.map +0 -1
  219. data/public/unsakini/app/styles.58e065928ed8ebd0b582.bundle.js +0 -2
  220. data/public/unsakini/app/styles.58e065928ed8ebd0b582.bundle.map +0 -1
  221. data/public/unsakini/app/styles.5dac0e986fce6f8738b300cb558b56a0.bundle.css +0 -8
  222. data/spec/dummy/config/initializers/knock.rb +0 -59
  223. data/spec/schema/jwt.json +0 -9
@@ -0,0 +1,15 @@
1
+ class User < ApplicationRecord
2
+
3
+ has_secure_password
4
+
5
+ validates :name, :email, presence: true
6
+ validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }
7
+ validates :password, :presence => true,
8
+ :confirmation => true,
9
+ :length => {:within => 6..40},
10
+ :on => :create
11
+
12
+ has_many :user_boards
13
+ has_many :boards, through: :user_boards
14
+
15
+ end
@@ -0,0 +1,82 @@
1
+ # UserBoard model, links the user and it's boards
2
+
3
+ class UserBoard < ApplicationRecord
4
+ include EncryptableModelConcern
5
+ encryptable_attributes :encrypted_password
6
+
7
+ validates :encrypted_password, :presence => true, if: :is_admin
8
+
9
+ before_validation :validate_before_create, on: :create
10
+ before_validation :validate_before_update, on: :update
11
+
12
+ belongs_to :user
13
+ belongs_to :board
14
+
15
+ scope :admin, -> { where(is_admin: true) }
16
+
17
+ def name=(str)
18
+ @name = str
19
+ end
20
+
21
+ def name
22
+ if !@name.nil?
23
+ @name
24
+ else
25
+ self.board.name
26
+ end
27
+ end
28
+
29
+ # Returns user_boards where {Board} is `is_shared`
30
+ #
31
+ # @param is_shared [Boolean] wether to return shared or not shared boards
32
+ def self.shared(is_shared)
33
+ joins("LEFT JOIN boards ON user_boards.board_id = boards.id")
34
+ .where("boards.is_shared = ?", is_shared)
35
+ end
36
+
37
+ def share(user_ids, new_key)
38
+ ActiveRecord::Base.transaction do
39
+ user_ids.each do |usr_id|
40
+ UserBoard.new({
41
+ user_id: usr_id,
42
+ board_id: self.board_id,
43
+ encrypted_password: nil,
44
+ is_admin: false
45
+ })
46
+ .save!
47
+ end
48
+ self.board.is_shared = true
49
+ self.encrypted_password = new_key
50
+ self.save!
51
+ end
52
+ true
53
+
54
+ rescue
55
+ self.errors[:base] << "Unable to share the this board"
56
+ false
57
+ end
58
+
59
+ private
60
+
61
+ def reset_user_boards_encrypted_password
62
+ UserBoard.where("board_id = ? AND user_id != ?", self.board_id, self.user_id).update_all(encrypted_password: nil)
63
+ end
64
+
65
+ def validate_before_create
66
+ if self.board.nil?
67
+ b = Board.new(name: @name)
68
+ if b.save
69
+ self.board_id = b.id
70
+ else
71
+ self.errors[:base] << "Board name is invalid"
72
+ end
73
+ end
74
+ end
75
+
76
+ def validate_before_update
77
+ self.board.name = @name if !@name.blank?
78
+ reset_user_boards_encrypted_password if self.encrypted_password_changed?
79
+ self.errors[:base] << "Board name is invalid" if !self.board.save
80
+ end
81
+
82
+ end
@@ -0,0 +1,5 @@
1
+ class BoardSerializer < ActiveModel::Serializer
2
+
3
+ attributes :id, :name, :created_at, :updated_at
4
+
5
+ end
@@ -1,13 +1,10 @@
1
1
  # Serializes the {Comment} model instance to json.
2
2
  # Read more about active model serializers - https://github.com/rails-api/active_model_serializers
3
3
 
4
- module Unsakini
5
- class CommentSerializer < ActiveModel::Serializer
4
+ class CommentSerializer < ActiveModel::Serializer
6
5
 
7
- attributes :id, :content, :created_at, :updated_at
6
+ attributes :id, :content, :created_at, :updated_at
8
7
 
9
- belongs_to :user
10
-
11
- end
8
+ belongs_to :user
12
9
 
13
10
  end
@@ -0,0 +1,23 @@
1
+ # Serializes the `Post` model instance to json.
2
+ # Read more about active model serializers - https://github.com/rails-api/active_model_serializers
3
+
4
+ class PostSerializer < ActiveModel::Serializer
5
+
6
+ attributes :id, :title, :content, :created_at, :updated_at
7
+
8
+ belongs_to :user
9
+
10
+ belongs_to :board do |serializer|
11
+ user_board = object.board.user_boards.where(user_id: object.user_id).first
12
+
13
+ {
14
+ "id" => object.board.id,
15
+ "name" => object.board.name,
16
+ "is_admin" => user_board.is_admin,
17
+ "encrypted_password" => user_board.encrypted_password,
18
+ "created_at" => object.board.created_at,
19
+ "updated_at" => object.board.updated_at
20
+ }
21
+ end
22
+
23
+ end
@@ -0,0 +1,11 @@
1
+ # Serializes the `UserBoard` model instance to json.
2
+ # Read more about active model serializers - https://github.com/rails-api/active_model_serializers
3
+ #
4
+
5
+ class UserBoardSerializer < ActiveModel::Serializer
6
+
7
+ attributes :id, :is_admin, :encrypted_password, :created_at, :updated_at
8
+
9
+ belongs_to :board
10
+
11
+ end
@@ -1,9 +1,6 @@
1
1
  # Serializes the `User` model instance to json.
2
2
  # Read more about active model serializers - https://github.com/rails-api/active_model_serializers
3
3
  #
4
- module Unsakini
5
- class UserSerializer < ActiveModel::Serializer
6
- attributes :id, :name, :email, :created_at, :updated_at
7
- end
8
-
4
+ class UserSerializer < ActiveModel::Serializer
5
+ attributes :id, :name, :email, :created_at, :updated_at
9
6
  end
@@ -37,15 +37,12 @@
37
37
  <div id="wrapper">
38
38
  <header id="header">
39
39
  <div class="container">
40
- <div class="logo"><a href="#">
41
- <img src="images/unsakini.svg" width="150px" height="40px" alt="Unsakini">
42
- <!-- UNSAKINI -->
43
- </a></div>
40
+ <div class="logo"><a href="#"><img src="images/logo.svg" alt="FORKIO"></a></div>
44
41
  <nav id="nav">
45
42
  <div class="opener-holder">
46
43
  <a href="#" class="nav-opener"><span></span></a>
47
44
  </div>
48
- <a href="/unsakini/app/signup" class="btn btn-primary rounded visible-md visible-lg">
45
+ <a href="/app/signup" class="btn btn-primary rounded visible-md visible-lg">
49
46
  Create Account
50
47
  </a>
51
48
  <div class="nav-drop">
@@ -54,8 +51,8 @@
54
51
  <li><a href="#">Documentation</a></li>
55
52
  <li><a href="#">Blog</a></li>
56
53
  <li class="hidden-xs hidden-sm">|</li>
57
- <li><a href="/unsakini/app/login">Login</a></li>
58
- <li><a href="/unsakini/app/signup" class="hidden-md hidden-lg">Create Account</a></li>
54
+ <li><a href="/app/login">Login</a></li>
55
+ <li><a href="/app/signup" class="hidden-md hidden-lg">Create Account</a></li>
59
56
  </ul>
60
57
  <!-- <div class="drop-holder visible-sm visible-xs">
61
58
  <span>Follow Us</span>
@@ -73,7 +70,7 @@
73
70
  <div class="container">
74
71
  <div class="text-block">
75
72
  <div class="heading-holder">
76
- <h1>Welcome home, mavericks</h1>
73
+ <h1><%= @project %></h1>
77
74
  </div>
78
75
  <p class="tagline"><%= @description %></p>
79
76
  <span class="info">Version <%= @version %></span>
@@ -85,19 +82,18 @@
85
82
  <div class="container">
86
83
  <div id="cta">
87
84
  <a href="<%= @repository %>" class="btn btn-primary rounded">
88
- Deploy to Your Server
85
+ Fork it on Github
89
86
  </a>
90
87
  <p>Released under MIT License</p>
91
88
  </div>
92
89
  <div class="row">
93
90
  <div class="text-box col-md-offset-1 col-md-10">
94
- <h2>Conquer the world with confidence</h2>
91
+ <h2>Revolutionary Bulletin Board</h2>
95
92
  <p>
96
93
  <strong><a href="https://www.unsakini.com">Unsakini</a></strong> is an open source encrypted bulletin board created with the aim of evading global information surveillance and spying, preventing data leaks and promoting information confidentiality and integrity.
94
+
97
95
  </p>
98
- <p>
99
- The internet is monitored. They hear what we say, but they won't know what we mean.
100
- </p>
96
+ <div class="social-placeholder"><img src="images/img-social-placeholder-01.png" height="26" width="365" alt=""></div>
101
97
  </div>
102
98
  </div>
103
99
  </div>
@@ -162,72 +158,179 @@
162
158
  </div>
163
159
  <div class="col-md-7">
164
160
  <div class="slide-holder">
165
- <h2 class="hidden-xs hidden-sm text-primary">Features</h2>
161
+ <h2 class="hidden-xs hidden-sm text-primary">Unsakini Features</h2>
166
162
  <div class="img-slide scroll-trigger"><img src="images/img-01.png" height="624" width="1184" alt=""></div>
167
163
  </div>
168
164
  </div>
169
165
  </div>
170
166
  </div>
171
167
  </section>
172
- <section class="main content-area">
168
+ <section class="main">
173
169
  <div class="container">
174
- <div class="row">
175
- <div class="text-box col-md-10 col-md-offset-1">
176
- <h2>How it Works</h2>
177
- <p>Upon using the system, you'll be asked to provide your private key. This key is used to encrypt your data before they are sent to the server. The key is stored in your computer and is never sent to the server.</p>
178
-
179
- <p>Hackers, surveillance and spy softwares and even the server host cannot read your data, unless they are able to obtain your private key. Your private key is deleted from your computer everytime you logout to ensure no one can obtain it while you're away.</p>
180
-
181
- <p>To increase the security, your data is re-encrypted in the backend before being saved to the database, which adds a second layer of protection.</p>
182
-
183
- <p>So to access your data, the hacker (or spyware) needs to know two things - (1) your private key and (2) the server encryption key. That is, if they are able to bypass the server security and gets access to the database. Even so, they won't be able to read the data without these two elements.</p>
184
-
185
- <p>The data is ecnrypted using <a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard">Advanced Encryption System (AES)</a>, the most widely used and trusted encryption algorithm.</p>
170
+ <!-- <div class="block-holder">
171
+ <div class="block-frame">
172
+ <div class="cycle-gallery">
173
+ <div class="mask">
174
+ <div class="slideset">
175
+ <div class="slide">
176
+ <div class="img-box">
177
+ <div class="img-holder"><img src="images/user-01.jpg" height="85" width="85" alt=""></div>
178
+ <div class="text-holder">
179
+ <h3>Steven Walters</h3>
180
+ <a href="#">@DoctorS</a>
181
+ </div>
182
+ </div>
183
+ <p><a href="#">@Pixelbuddha</a> Suspendisse sodales sem est, in scelerisque felis scelerisque in. Aenean faucibus mollis risus. Praesent sit amet erat eget eros.</p>
184
+ <em class="date">2 hours ago</em>
185
+ </div>
186
+ <div class="slide">
187
+ <div class="img-box">
188
+ <div class="img-holder"><img src="images/user-02.jpg" height="85" width="85" alt=""></div>
189
+ <div class="text-holder">
190
+ <h3>Shane Jennings</h3>
191
+ <a href="#">@shanejen</a>
192
+ </div>
193
+ </div>
194
+ <p><a href="#">@PSD2HTML</a> Ut id porta quam. Morbi sit amet magna lobortis, hendrerit lorem et, tincidunt lorem. Sed vulputate condimentum lorem vel dapibus</p>
195
+ <em class="date">5 hours ago</em>
196
+ </div>
197
+ <div class="slide">
198
+ <div class="img-box">
199
+ <div class="img-holder"><img src="images/user-03.jpg" height="85" width="85" alt=""></div>
200
+ <div class="text-holder">
201
+ <h3>Rafael Belverde</h3>
202
+ <a href="#">@bellraffi</a>
203
+ </div>
204
+ </div>
205
+ <p><a href="#">@codrops</a> Curabitur nec dapibus ligula. In eget ante in nisi laoreet accumsan pretium vitae est. Nulla lacinia efficitur dui eget accumsan?</p>
206
+ <em class="date">1 day ago</em>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ <a class="btn-prev" href="#"><i class="glyphicon glyphicon-menu-left"></i></a>
211
+ <a class="btn-next" href="#"><i class="glyphicon glyphicon-menu-right"></i></a>
212
+ </div>
186
213
  </div>
187
- </div>
214
+ <div class="block-frame">
215
+ <ul class="cta-list">
216
+ <li>
217
+ <a href="<%= @repository %>" class="btn btn-default"><i class="fa fa-github"></i> GitHub</a>
218
+ <p>7 352 Followers</p>
219
+ </li>
220
+ <li>
221
+ <a href="#" class="btn btn-info"><i class="fa fa-twitter"></i> Twitter</a>
222
+ <p>136 312 Followers</p>
223
+ </li>
224
+ <li>
225
+ <a href="#" class="btn btn-blue"><i class="fa fa-facebook"></i> Facebook</a>
226
+ <p>218 092 Subscribers</p>
227
+ </li>
228
+ </ul>
229
+ </div>
230
+ </div> -->
188
231
  </div>
189
232
  </section>
190
233
 
191
-
192
- <section class="area">
234
+ <!-- <section class="main">
193
235
  <div class="container">
194
- <h2 class="text-center">
195
- Deployment Options
196
- </h2>
197
- <div class="row">
198
- <div class="col-md-6 text-box">
199
- <h3 class="text-left">Full Stack</h3>
200
- <p class="text-left">
201
- Unsakini can be deployed as a full stack rails application. It can be integrated into your
202
- existing rails 5 application, or you can create a new one. This application you are using is
203
- an example of a full-stack Unsakini installation. But there are things you need to configure
204
- before you can fully deploy this on your server like the mailer configuration and database
205
- connection.
206
- </p>
207
- <p class="text-left">
208
- <a href="#"><b>Read more</b></a>
209
- </p>
236
+ <div class="block-holder">
237
+ <div class="block-frame">
238
+ <div class="cycle-gallery">
239
+ <div class="mask">
240
+ <div class="slideset">
241
+ <div class="slide">
242
+ <div class="img-box">
243
+ <div class="img-holder"><img src="images/user-01.jpg" height="85" width="85" alt=""></div>
244
+ <div class="text-holder">
245
+ <h3>Steven Walters</h3>
246
+ <a href="#">@DoctorS</a>
247
+ </div>
248
+ </div>
249
+ <p><a href="#">@Pixelbuddha</a> Suspendisse sodales sem est, in scelerisque felis scelerisque in. Aenean faucibus mollis risus. Praesent sit amet erat eget eros.</p>
250
+ <em class="date">2 hours ago</em>
251
+ </div>
252
+ <div class="slide">
253
+ <div class="img-box">
254
+ <div class="img-holder"><img src="images/user-02.jpg" height="85" width="85" alt=""></div>
255
+ <div class="text-holder">
256
+ <h3>Shane Jennings</h3>
257
+ <a href="#">@shanejen</a>
258
+ </div>
259
+ </div>
260
+ <p><a href="#">@PSD2HTML</a> Ut id porta quam. Morbi sit amet magna lobortis, hendrerit lorem et, tincidunt lorem. Sed vulputate condimentum lorem vel dapibus</p>
261
+ <em class="date">5 hours ago</em>
262
+ </div>
263
+ <div class="slide">
264
+ <div class="img-box">
265
+ <div class="img-holder"><img src="images/user-03.jpg" height="85" width="85" alt=""></div>
266
+ <div class="text-holder">
267
+ <h3>Rafael Belverde</h3>
268
+ <a href="#">@bellraffi</a>
269
+ </div>
270
+ </div>
271
+ <p><a href="#">@codrops</a> Curabitur nec dapibus ligula. In eget ante in nisi laoreet accumsan pretium vitae est. Nulla lacinia efficitur dui eget accumsan?</p>
272
+ <em class="date">1 day ago</em>
273
+ </div>
274
+ </div>
275
+ </div>
276
+ <a class="btn-prev" href="#"><i class="glyphicon glyphicon-menu-left"></i></a>
277
+ <a class="btn-next" href="#"><i class="glyphicon glyphicon-menu-right"></i></a>
278
+ </div>
210
279
  </div>
211
- <div class="col-md-6 text-box">
212
- <h3 class="text-left">Client-Only</h3>
213
- <p class="text-left">
214
- Instead of going through the hassle of configuring a full-stack rails application, get only the vanilla HTML, CSS and JS files and upload it to your prefered server. Static files are easier to deploy since you just need a server capable of hosting static files.
215
- </p>
216
- <!-- <p class="text-left">
217
- You can get the files of Unsakini client application from my Github <a href="https://github.com/adonespitogo/unsakini/angular">repository</a>. By default, it will use the existing API at <a href="https://www.unsakini.com">Unsakini.com</a>.
218
- </p>
219
- <p class="text-left">
220
- If you want to use a different server, you need <a href="https://nodejs.org/en/">Node.js</a> with <a href="https://github.com/angular/angular-cli">Angular CLI</a> to build the source code. Configure the javascript application to use any other existing Unsakini full-stack deployed app. Lastly, upload it to your server.
221
- </p> -->
222
- <p class="text-left"><a href="#"><b>Read more</b></a></p>
280
+ <div class="block-frame">
281
+ <ul class="cta-list">
282
+ <li>
283
+ <a href="<%= @repository %>" class="btn btn-default"><i class="fa fa-github"></i> GitHub</a>
284
+ <p>7 352 Followers</p>
285
+ </li>
286
+ <li>
287
+ <a href="#" class="btn btn-info"><i class="fa fa-twitter"></i> Twitter</a>
288
+ <p>136 312 Followers</p>
289
+ </li>
290
+ <li>
291
+ <a href="#" class="btn btn-blue"><i class="fa fa-facebook"></i> Facebook</a>
292
+ <p>218 092 Subscribers</p>
293
+ </li>
294
+ </ul>
223
295
  </div>
224
296
  </div>
225
297
  </div>
226
- </section>
227
-
228
-
229
-
230
- <!-- <section class="area">
298
+ </section> -->
299
+ <!-- <section class="visual-container">
300
+ <div class="visual-area">
301
+ <div class="container">
302
+ <h2>People Are Talking About Fork</h2>
303
+ <ul class="testimonials">
304
+ <li>
305
+ <div class="img-holder"><a href="#"><img src="images/logo-smashing.png" height="43" width="165" alt="smashing magazine"></a></div>
306
+ <p><em>Sed vestibulum scelerisque urna, eu finibus leo facilisis sit amet. Proin id dignissim magna. Sed varius urna et pulvinar venenatis. </em></p>
307
+ </li>
308
+ <li>
309
+ <div class="img-holder"><a href="#"><img src="images/logo-codrops.png" height="50" width="148" alt="codrops"></a></div>
310
+ <p><em>Donec euismod dolor ut ultricies consequat. Vivamus urna ipsum, rhoncus molestie neque ac, mollis eleifend nibh.</em></p>
311
+ </li>
312
+ <li>
313
+ <div class="img-holder"><a href="#"><img src="images/logo-w.png" height="64" width="64" alt="w"></a></div>
314
+ <p><em>In efficitur in velit et tempus. Duis nec odio dapibus, suscipit erat fringilla, imperdiet nibh. Morbi tempus auctor felis ac vehicula. </em></p>
315
+ </li>
316
+ <li>
317
+ <div class="img-holder"><a href="#"><img src="images/logo-pixel.png" height="24" width="225" alt="Pixel Buddha"></a></div>
318
+ <p><em>Sed vestibulum scelerisque urna, eu finibus leo facilisis sit amet. Proin id dignissim magna. Sed varius urna et pulvinar venenatis. </em></p>
319
+ </li>
320
+ <li>
321
+ <div class="img-holder"><a href=""><img src="images/logo-cb.png" height="34" width="166" alt="creative bloq"></a></div>
322
+ <p><em>Praesent ut eros tristique, malesuada lectus vel, lobortis massa. Nulla faucibus lorem id arcu consequat faucibus. </em></p>
323
+ </li>
324
+ <li>
325
+ <div class="img-holder"><a href="#"><img src="images/logo-tnw.png" height="34" width="108" alt="tnw"></a></div>
326
+ <p><em>Fusce pharetra erat id odio blandit, nec pharetra eros venenatis. Pellentesque porttitor cursus massa et vestibulum.</em></p>
327
+ </li>
328
+ </ul>
329
+ </div>
330
+ <img src="images/img-decor-02.jpg" height="764" width="1380" alt="" class="bg-stretch">
331
+ </div>
332
+ </section> -->
333
+ <section class="area">
231
334
  <div class="container">
232
335
  <div class="subscribe">
233
336
  <h3>Subscribe to Our Newsletter</h3>
@@ -289,13 +392,13 @@
289
392
  </div>
290
393
  </div>
291
394
  </div>
292
- </section> -->
395
+ </section>
293
396
  <footer id="footer">
294
397
  <div class="container">
295
398
  <div class="footer-holder">
296
399
  <div class="row">
297
400
  <div class="col-md-4">
298
- <div class="logo"><a href="#"><img src="images/unsakini.svg" alt="FORKIO"></a></div>
401
+ <div class="logo"><a href="#"><img src="images/logo.svg" alt="FORKIO"></a></div>
299
402
  <p>
300
403
  <%= @tagline %>
301
404
  </p>
@@ -304,6 +407,7 @@
304
407
  <h4>Links</h4>
305
408
  <ul>
306
409
  <li><a href="http://www.unsakini.com">Project Website</a></li>
410
+ <li><a href="<%= @repository %>">Contribution</a></li>
307
411
  <li><a href="/">Documentation</a></li>
308
412
  </ul>
309
413
  </div>
data/config/routes.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  Rails.application.routes.draw do
2
+
3
+ root to: 'web_base#index'
2
4
 
3
- root to: 'unsakini/web#index'
5
+ post 'user_token' => 'user_token#create'
4
6
 
5
- namespace :unsakini do
6
- #knock route
7
- post 'user_token' => 'user_token#create'
8
- # ng2 html5 pushState routes
9
- get 'app', to: 'web#app'
10
- get 'app/*ngroute', to: 'web#app'
7
+ # ng2 html5 pushState routes
8
+ get 'app', to: 'web_base#app'
9
+ get 'app/*ngroute', to: 'web_base#app'
11
10
 
11
+ namespace :api do
12
12
  resource :user
13
13
  resources :boards do
14
14
  resources :posts do
@@ -16,9 +16,9 @@ Rails.application.routes.draw do
16
16
  end
17
17
  end
18
18
 
19
- post 'share/board/', to: 'share_board#index', as: 'share_board'
20
- get 'users/search', to: 'users#search', as: 'user_search'
21
- get 'user/confirm/:token', to: 'users#confirm', as: 'confirm_account'
19
+ post '/api/share/board/', to: 'share_board#index', as: 'share_board'
20
+ get '/api/users/search', to: 'users#search', as: 'user_search'
21
+
22
22
 
23
23
  end
24
24
 
@@ -0,0 +1,9 @@
1
+ class CreateBoards < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :boards do |t|
4
+ t.text :name
5
+
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -1,9 +1,8 @@
1
- class CreateUnsakiniUserBoards < ActiveRecord::Migration[5.0]
1
+ class CreateUserBoards < ActiveRecord::Migration[5.0]
2
2
  def change
3
- create_table :unsakini_user_boards do |t|
3
+ create_table :user_boards do |t|
4
4
  t.integer :user_id
5
5
  t.integer :board_id
6
- t.string :encrypted_password
7
6
  t.boolean :is_admin, :default => false
8
7
 
9
8
  t.timestamps
@@ -1,6 +1,6 @@
1
- class CreateUnsakiniPosts < ActiveRecord::Migration[5.0]
1
+ class CreatePosts < ActiveRecord::Migration[5.0]
2
2
  def change
3
- create_table :unsakini_posts do |t|
3
+ create_table :posts do |t|
4
4
  t.text :title
5
5
  t.text :content
6
6
  t.integer :user_id
@@ -1,6 +1,6 @@
1
- class CreateUnsakiniComments < ActiveRecord::Migration[5.0]
1
+ class CreateComments < ActiveRecord::Migration[5.0]
2
2
  def change
3
- create_table :unsakini_comments do |t|
3
+ create_table :comments do |t|
4
4
  t.text :content
5
5
  t.integer :user_id
6
6
  t.integer :post_id
@@ -0,0 +1,5 @@
1
+ class AddEncryptedPasswordToUserBoard < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :user_boards, :encrypted_password, :string
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ class CreateUsers < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :users do |t|
4
+ t.string :name
5
+ t.string :email
6
+ t.string :password_digest
7
+ t.boolean :confirmed
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class AddIsSharedToBoards < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :boards, :is_shared, :boolean, default: false
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Generates the angular source files
3
+
4
+ Example:
5
+ rails generate unsakini:angular
6
+
7
+ This will create:
8
+ angular/ directory in your project root directory
@@ -0,0 +1,7 @@
1
+ class Unsakini::AngularGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('../../../../../', __FILE__)
3
+
4
+ def copy_initializer_file
5
+ directory 'angular/dist', 'public/app'
6
+ end
7
+ end
@@ -1,9 +1,7 @@
1
1
  class Unsakini::ConfigGenerator < Rails::Generators::Base
2
2
  source_root File.expand_path('../templates', __FILE__)
3
3
 
4
- def initialize_config_options
4
+ def copy_initializer_file
5
5
  copy_file "unsakini.rb", "config/initializers/unsakini.rb"
6
- environment 'config.action_mailer.delivery_method = :letter_opener', env: 'development'
7
- environment 'config.action_mailer.default_url_options = { :host => "localhost:3000" }', env: 'development'
8
6
  end
9
7
  end