unsakini 0.0.3.1 → 0.0.4.pre.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (290) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +37 -6
  3. data/angular/angular-cli.json +5 -3
  4. data/angular/npm-debug.log +54 -0
  5. data/angular/package.json +4 -1
  6. data/angular/src/app/app.component.html +1 -4
  7. data/angular/src/app/app.module.ts +8 -7
  8. data/angular/src/app/app.routes.module.ts +12 -2
  9. data/angular/src/app/confirm-account/confirm-account.component.ts +27 -0
  10. data/angular/src/app/confirm-account/confirm-account.html +41 -0
  11. data/angular/src/app/confirm-account/confirm-account.module.ts +24 -0
  12. data/angular/src/app/confirm-account/confirm-account.scss +3 -0
  13. data/angular/src/app/confirm-account/confirm-account.service.ts +27 -0
  14. data/angular/src/app/confirm-account/index.ts +3 -0
  15. data/angular/src/app/index.ts +2 -0
  16. data/angular/src/app/login/index.ts +3 -0
  17. data/angular/src/app/login/login.component.ts +40 -0
  18. data/angular/src/app/login/login.html +43 -0
  19. data/angular/src/app/login/login.module.ts +27 -0
  20. data/angular/src/app/login/login.service.ts +48 -0
  21. data/angular/src/app/registration/index.ts +3 -0
  22. data/angular/src/app/registration/registration.component.html +70 -12
  23. data/angular/src/app/registration/registration.component.spec.ts +8 -11
  24. data/angular/src/app/registration/registration.component.ts +10 -8
  25. data/angular/src/app/registration/registration.module.ts +23 -0
  26. data/angular/src/app/registration/registration.service.ts +46 -0
  27. data/angular/src/app/registration/registration.services.spec.ts +71 -0
  28. data/angular/src/app/services/auth-http/auth.http.service.ts +35 -0
  29. data/angular/src/app/services/auth-http/index.ts +1 -0
  30. data/angular/src/app/services/http/http.service.spec.ts +205 -0
  31. data/angular/src/app/services/http/http.service.ts +40 -0
  32. data/angular/src/app/services/http/index.ts +1 -0
  33. data/angular/src/app/services/index.ts +3 -0
  34. data/angular/src/app/services/services.module.ts +33 -0
  35. data/angular/src/assets/global.scss +3 -0
  36. data/angular/src/environments/custom.ts +4 -0
  37. data/angular/src/environments/environment.prod.ts +2 -1
  38. data/angular/src/environments/environment.ts +2 -1
  39. data/angular/src/index.html +1 -1
  40. data/app/controllers/application_controller.rb +2 -2
  41. data/app/controllers/concerns/unsakini/board_owner_controller_concern.rb +42 -0
  42. data/app/controllers/concerns/unsakini/comment_owner_controller_concern.rb +36 -0
  43. data/app/controllers/concerns/unsakini/logged_in_controller_concern.rb +23 -0
  44. data/app/controllers/concerns/unsakini/post_owner_controller_concern.rb +38 -0
  45. data/app/controllers/concerns/unsakini/serializer_controller_concern.rb +13 -0
  46. data/app/controllers/unsakini/base_controller.rb +6 -0
  47. data/app/controllers/unsakini/boards_controller.rb +76 -0
  48. data/app/controllers/unsakini/comments_controller.rb +54 -0
  49. data/app/controllers/unsakini/posts_controller.rb +61 -0
  50. data/app/controllers/unsakini/share_board_controller.rb +122 -0
  51. data/app/controllers/unsakini/user_token_controller.rb +17 -0
  52. data/app/controllers/unsakini/users_controller.rb +69 -0
  53. data/app/controllers/unsakini/web_controller.rb +27 -0
  54. data/app/mailers/unsakini/user_mailer.rb +13 -0
  55. data/app/models/concerns/unsakini/encryptable_model_concern.rb +97 -0
  56. data/app/models/unsakini/application_record.rb +7 -0
  57. data/app/models/unsakini/board.rb +16 -0
  58. data/app/models/unsakini/comment.rb +12 -0
  59. data/app/models/unsakini/post.rb +15 -0
  60. data/app/models/unsakini/user.rb +43 -0
  61. data/app/models/unsakini/user_board.rb +84 -0
  62. data/app/models/unsakini.rb +5 -0
  63. data/app/serializers/unsakini/board_serializer.rb +7 -0
  64. data/app/serializers/{comment_serializer.rb → unsakini/comment_serializer.rb} +6 -3
  65. data/app/serializers/unsakini/post_serializer.rb +26 -0
  66. data/app/serializers/unsakini/user_board_serializer.rb +14 -0
  67. data/app/serializers/{user_serializer.rb → unsakini/user_serializer.rb} +5 -2
  68. data/app/views/unsakini/user_mailer/confirm_account.html.erb +3 -0
  69. data/app/views/unsakini/web/index.html.erb +343 -0
  70. data/config/routes.rb +10 -10
  71. data/db/migrate/20161116114222_create_unsakini_boards.rb +10 -0
  72. data/db/migrate/{20161116200034_create_user_boards.rb → 20161116200034_create_unsakini_user_boards.rb} +3 -2
  73. data/db/migrate/{20161118031023_create_posts.rb → 20161118031023_create_unsakini_posts.rb} +2 -2
  74. data/db/migrate/{20161118100454_create_comments.rb → 20161118100454_create_unsakini_comments.rb} +2 -2
  75. data/db/migrate/20161126145352_create_unsakini_users.rb +15 -0
  76. data/lib/generators/unsakini/config/config_generator.rb +3 -1
  77. data/lib/generators/unsakini/dependencies/USAGE +5 -0
  78. data/lib/generators/unsakini/dependencies/dependencies_generator.rb +19 -0
  79. data/lib/tasks/unsakini_tasks.rake +6 -37
  80. data/lib/unsakini/engine.rb +6 -0
  81. data/lib/unsakini/version.rb +1 -1
  82. data/public/css/all.css +1204 -0
  83. data/public/css/all.css.map +7 -0
  84. data/public/css/bootstrap.css +5622 -0
  85. data/public/css/bootstrap.css.map +7 -0
  86. data/public/css/custom.css +15 -0
  87. data/public/favicons/android-chrome-144x144.png +0 -0
  88. data/public/favicons/android-chrome-192x192.png +0 -0
  89. data/public/favicons/android-chrome-36x36.png +0 -0
  90. data/public/favicons/android-chrome-48x48.png +0 -0
  91. data/public/favicons/android-chrome-72x72.png +0 -0
  92. data/public/favicons/android-chrome-96x96.png +0 -0
  93. data/public/favicons/apple-touch-icon-114x114.png +0 -0
  94. data/public/favicons/apple-touch-icon-120x120.png +0 -0
  95. data/public/favicons/apple-touch-icon-144x144.png +0 -0
  96. data/public/favicons/apple-touch-icon-152x152.png +0 -0
  97. data/public/favicons/apple-touch-icon-180x180.png +0 -0
  98. data/public/favicons/apple-touch-icon-57x57.png +0 -0
  99. data/public/favicons/apple-touch-icon-60x60.png +0 -0
  100. data/public/favicons/apple-touch-icon-72x72.png +0 -0
  101. data/public/favicons/apple-touch-icon-76x76.png +0 -0
  102. data/public/favicons/apple-touch-icon-precomposed.png +0 -0
  103. data/public/favicons/apple-touch-icon.png +0 -0
  104. data/public/favicons/favicon-16x16.png +0 -0
  105. data/public/favicons/favicon-194x194.png +0 -0
  106. data/public/favicons/favicon-32x32.png +0 -0
  107. data/public/favicons/favicon-96x96.png +0 -0
  108. data/public/favicons/favicon.ico +0 -0
  109. data/public/favicons/mstile-144x144.png +0 -0
  110. data/public/favicons/mstile-150x150.png +0 -0
  111. data/public/favicons/mstile-310x150.png +0 -0
  112. data/public/favicons/mstile-310x310.png +0 -0
  113. data/public/favicons/mstile-70x70.png +0 -0
  114. data/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  115. data/public/fonts/bootstrap/glyphicons-halflings-regular.svg +288 -0
  116. data/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  117. data/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  118. data/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  119. data/public/fonts/font-awesome-4.3.0/css/font-awesome.css +1801 -0
  120. data/public/fonts/font-awesome-4.3.0/css/font-awesome.min.css +4 -0
  121. data/public/fonts/font-awesome-4.3.0/fonts/FontAwesome.otf +0 -0
  122. data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.eot +0 -0
  123. data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.svg +565 -0
  124. data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.ttf +0 -0
  125. data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.woff +0 -0
  126. data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.woff2 +0 -0
  127. data/public/images/graph-01.svg +425 -0
  128. data/public/images/graph-02.svg +435 -0
  129. data/public/images/graph-03.svg +576 -0
  130. data/public/images/graph-04.svg +70 -0
  131. data/public/images/img-01.png +0 -0
  132. data/public/images/img-decor-01.jpg +0 -0
  133. data/public/images/img-decor-02.jpg +0 -0
  134. data/public/images/img-decor-03.jpg +0 -0
  135. data/public/images/img-social-placeholder-01.png +0 -0
  136. data/public/images/logo-cb.png +0 -0
  137. data/public/images/logo-codrops.png +0 -0
  138. data/public/images/logo-pixel.png +0 -0
  139. data/public/images/logo-smashing.png +0 -0
  140. data/public/images/logo-tnw.png +0 -0
  141. data/public/images/logo-w.png +0 -0
  142. data/public/images/unsakini.svg +56 -0
  143. data/public/images/user-01.jpg +0 -0
  144. data/public/images/user-02.jpg +0 -0
  145. data/public/images/user-03.jpg +0 -0
  146. data/public/js/bootstrap.js +2306 -0
  147. data/public/js/jquery-1.11.2.min.js +4 -0
  148. data/public/js/jquery.main.js +603 -0
  149. data/public/manifest.json +41 -0
  150. data/public/unsakini/app/448c34a56d699c29117adc64c43affeb.woff2 +0 -0
  151. data/public/unsakini/app/89889688147bd7575d6327160d64e760.svg +288 -0
  152. data/public/unsakini/app/assets/global.scss +3 -0
  153. data/public/unsakini/app/e18bbf611f2a2e43afc071aa2f4e1512.ttf +0 -0
  154. data/public/unsakini/app/f4769f9bdb7466be65088239c12046d1.eot +0 -0
  155. data/public/unsakini/app/fa2772327f55d8198301fdb8bcfc8158.woff +0 -0
  156. data/{angular/dist → public/unsakini/app}/favicon.ico +0 -0
  157. data/public/unsakini/app/index.html +14 -0
  158. data/public/unsakini/app/inline.d41d8cd98f00b204e980.bundle.js +2 -0
  159. data/public/unsakini/app/inline.d41d8cd98f00b204e980.bundle.map +1 -0
  160. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.js +2152 -0
  161. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.js.gz +0 -0
  162. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.map +1 -0
  163. data/public/unsakini/app/styles.58e065928ed8ebd0b582.bundle.js +2 -0
  164. data/public/unsakini/app/styles.58e065928ed8ebd0b582.bundle.map +1 -0
  165. data/public/unsakini/app/styles.5dac0e986fce6f8738b300cb558b56a0.bundle.css +8 -0
  166. data/spec/concerns/models/encryptable_concern.rb +3 -2
  167. data/spec/controllers/{web_base_controller_spec.rb → web_controller_spec.rb} +5 -4
  168. data/spec/dummy/config/application.rb +3 -1
  169. data/spec/dummy/config/environments/development.rb +2 -0
  170. data/spec/dummy/config/initializers/knock.rb +59 -0
  171. data/spec/dummy/db/schema.rb +16 -14
  172. data/spec/dummy/db/test.sqlite3 +0 -0
  173. data/spec/factories/boards.rb +1 -1
  174. data/spec/factories/comments.rb +1 -1
  175. data/spec/factories/posts.rb +1 -1
  176. data/spec/factories/user_boards.rb +1 -1
  177. data/spec/factories/users.rb +1 -1
  178. data/spec/models/board_spec.rb +2 -2
  179. data/spec/models/comment_spec.rb +2 -2
  180. data/spec/models/post_spec.rb +2 -2
  181. data/spec/models/user_board_spec.rb +19 -19
  182. data/spec/models/user_spec.rb +1 -1
  183. data/spec/requests/{api/boards/api_boards_crud_spec.rb → boards/boards_crud_spec.rb} +26 -26
  184. data/spec/requests/{api/boards/api_boards_pagination_spec.rb → boards/boards_pagination_spec.rb} +7 -7
  185. data/spec/requests/{api/boards/api_private_board_spec.rb → boards/private_board_spec.rb} +26 -26
  186. data/spec/requests/{api/boards/api_shared_board_spec.rb → boards/shared_board_spec.rb} +9 -9
  187. data/spec/requests/{api/boards/api_sharing_board_spec.rb → boards/sharing_board_spec.rb} +13 -13
  188. data/spec/requests/{api/comments/api_comments_pagination_spec.rb → comments/comments_pagination_spec.rb} +3 -3
  189. data/spec/requests/{api/comments/api_comments_private_board_spec.rb → comments/comments_private_board_spec.rb} +20 -20
  190. data/spec/requests/{api/comments/api_comments_shared_board_spec.rb → comments/comments_shared_board_spec.rb} +17 -17
  191. data/spec/requests/{api/posts/api_posts_pagination_spec.rb → posts/posts_pagination_spec.rb} +3 -3
  192. data/spec/requests/{api/posts/api_posts_private_board_spec.rb → posts/posts_private_board_spec.rb} +22 -22
  193. data/spec/requests/{api/posts/api_posts_shared_board_spec.rb → posts/posts_shared_board_spec.rb} +24 -24
  194. data/spec/requests/user/user_create_spec.rb +104 -0
  195. data/spec/requests/{api/api_users_spec.rb → user/user_search_spec.rb} +9 -9
  196. data/spec/schema/jwt.json +9 -0
  197. data/spec/schema/validation_message.json +4 -0
  198. data/spec/spec_helper.rb +2 -0
  199. data/spec/support/auth_helper.rb +0 -2
  200. metadata +204 -199
  201. data/angular/dist/index.html +0 -14
  202. data/angular/dist/inline.bundle.js +0 -139
  203. data/angular/dist/inline.map +0 -1
  204. data/angular/dist/main.bundle.js +0 -64689
  205. data/angular/dist/main.map +0 -1
  206. data/angular/dist/styles.bundle.js +0 -364
  207. data/angular/dist/styles.map +0 -1
  208. data/angular/src/styles.css +0 -1
  209. data/app/controllers/api/boards_controller.rb +0 -73
  210. data/app/controllers/api/comments_controller.rb +0 -51
  211. data/app/controllers/api/posts_controller.rb +0 -58
  212. data/app/controllers/api/share_board_controller.rb +0 -118
  213. data/app/controllers/api/users_controller.rb +0 -27
  214. data/app/controllers/concerns/board_owner_controller_concern.rb +0 -38
  215. data/app/controllers/concerns/comment_owner_controller_concern.rb +0 -33
  216. data/app/controllers/concerns/logged_in_controller_concern.rb +0 -21
  217. data/app/controllers/concerns/post_owner_controller_concern.rb +0 -36
  218. data/app/controllers/concerns/serializer_controller_concern.rb +0 -11
  219. data/app/controllers/user_token_controller.rb +0 -2
  220. data/app/controllers/web_base_controller.rb +0 -15
  221. data/app/models/application_record.rb +0 -5
  222. data/app/models/board.rb +0 -14
  223. data/app/models/comment.rb +0 -9
  224. data/app/models/concerns/encryptable_model_concern.rb +0 -96
  225. data/app/models/post.rb +0 -12
  226. data/app/models/user.rb +0 -6
  227. data/app/models/user_board.rb +0 -82
  228. data/app/serializers/board_serializer.rb +0 -5
  229. data/app/serializers/post_serializer.rb +0 -23
  230. data/app/serializers/user_board_serializer.rb +0 -11
  231. data/app/views/web_base/index.html +0 -16
  232. data/db/migrate/20161116114222_create_boards.rb +0 -9
  233. data/db/migrate/20161118221508_add_encrypted_password_to_user_board.rb +0 -5
  234. data/db/migrate/20161122211105_create_users.rb +0 -12
  235. data/db/migrate/20161124102633_add_is_shared_to_boards.rb +0 -5
  236. data/lib/generators/unsakini/angular/USAGE +0 -8
  237. data/lib/generators/unsakini/angular/angular_generator.rb +0 -7
  238. data/spec/dummy/config/initializers/assets.rb +0 -11
  239. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -5
  240. data/spec/dummy/config/initializers/session_store.rb +0 -3
  241. data/spec/dummy/db/development.sqlite3 +0 -0
  242. data/spec/dummy/db/migrate/20161124210219_create_boards.unsakini_engine.rb +0 -10
  243. data/spec/dummy/db/migrate/20161124210220_create_user_boards.unsakini_engine.rb +0 -12
  244. data/spec/dummy/db/migrate/20161124210221_create_posts.unsakini_engine.rb +0 -13
  245. data/spec/dummy/db/migrate/20161124210222_create_comments.unsakini_engine.rb +0 -12
  246. data/spec/dummy/db/migrate/20161124210223_add_encrypted_password_to_user_board.unsakini_engine.rb +0 -6
  247. data/spec/dummy/db/migrate/20161124210224_create_users.unsakini_engine.rb +0 -13
  248. data/spec/dummy/db/migrate/20161124210225_add_is_shared_to_boards.unsakini_engine.rb +0 -6
  249. data/spec/dummy/public/app/favicon.ico +0 -0
  250. data/spec/dummy/public/app/index.html +0 -14
  251. data/spec/dummy/public/app/inline.bundle.js +0 -139
  252. data/spec/dummy/public/app/inline.map +0 -1
  253. data/spec/dummy/public/app/main.bundle.js +0 -64689
  254. data/spec/dummy/public/app/main.map +0 -1
  255. data/spec/dummy/public/app/styles.bundle.js +0 -364
  256. data/spec/dummy/public/app/styles.map +0 -1
  257. data/spec/dummy/tmp/unsakini-ng2/LICENSE +0 -21
  258. data/spec/dummy/tmp/unsakini-ng2/README.md +0 -1
  259. data/spec/dummy/tmp/unsakini-ng2/angular-cli.json +0 -59
  260. data/spec/dummy/tmp/unsakini-ng2/e2e/app.e2e-spec.ts +0 -14
  261. data/spec/dummy/tmp/unsakini-ng2/e2e/app.po.ts +0 -11
  262. data/spec/dummy/tmp/unsakini-ng2/e2e/signup.e2e-spec.ts +0 -28
  263. data/spec/dummy/tmp/unsakini-ng2/e2e/signup.po.ts +0 -31
  264. data/spec/dummy/tmp/unsakini-ng2/e2e/tsconfig.json +0 -16
  265. data/spec/dummy/tmp/unsakini-ng2/karma.conf.js +0 -45
  266. data/spec/dummy/tmp/unsakini-ng2/package.json +0 -49
  267. data/spec/dummy/tmp/unsakini-ng2/protractor.conf.js +0 -32
  268. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.css +0 -0
  269. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.html +0 -4
  270. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.spec.ts +0 -47
  271. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.ts +0 -10
  272. data/spec/dummy/tmp/unsakini-ng2/src/app/app.module.ts +0 -29
  273. data/spec/dummy/tmp/unsakini-ng2/src/app/app.routes.module.ts +0 -29
  274. data/spec/dummy/tmp/unsakini-ng2/src/app/index.ts +0 -2
  275. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.css +0 -0
  276. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.html +0 -14
  277. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.spec.ts +0 -157
  278. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.ts +0 -42
  279. data/spec/dummy/tmp/unsakini-ng2/src/environments/environment.prod.ts +0 -3
  280. data/spec/dummy/tmp/unsakini-ng2/src/environments/environment.ts +0 -8
  281. data/spec/dummy/tmp/unsakini-ng2/src/favicon.ico +0 -0
  282. data/spec/dummy/tmp/unsakini-ng2/src/index.html +0 -14
  283. data/spec/dummy/tmp/unsakini-ng2/src/main.ts +0 -12
  284. data/spec/dummy/tmp/unsakini-ng2/src/polyfills.ts +0 -19
  285. data/spec/dummy/tmp/unsakini-ng2/src/styles.css +0 -1
  286. data/spec/dummy/tmp/unsakini-ng2/src/test.ts +0 -31
  287. data/spec/dummy/tmp/unsakini-ng2/src/tsconfig.json +0 -18
  288. data/spec/dummy/tmp/unsakini-ng2/src/typings.d.ts +0 -2
  289. data/spec/dummy/tmp/unsakini-ng2/tslint.json +0 -114
  290. data/spec/dummy/tmp/unsakini-ng2/typings.json +0 -4
@@ -0,0 +1,43 @@
1
+ # module Unsakini
2
+ module Unsakini
3
+ class User < ApplicationRecord
4
+
5
+ has_secure_password
6
+
7
+ validates_uniqueness_of :email, case_sensitive: false, on: [:create]
8
+ validates_format_of :email, with: /@/
9
+ validates :name, :email, presence: true
10
+ validates :password, :presence => true,
11
+ :confirmation => true,
12
+ :length => { :minimum => 6 },
13
+ :if => :password # only validate if password changed!
14
+
15
+ has_many :user_boards
16
+ has_many :boards, through: :user_boards
17
+
18
+ before_save :downcase_email
19
+ before_create :generate_confirmation_instructions
20
+
21
+ def downcase_email
22
+ self.email = self.email.delete(' ').downcase
23
+ end
24
+
25
+ def generate_confirmation_instructions
26
+ self.confirmation_token = SecureRandom.hex(10)
27
+ self.confirmation_sent_at = Time.now.utc
28
+ end
29
+
30
+ def confirmation_token_valid?
31
+ (self.confirmation_sent_at + 30.days) > Time.now.utc
32
+ end
33
+
34
+ def mark_as_confirmed!
35
+ self.confirmation_token = nil
36
+ self.confirmed_at = Time.now.utc
37
+ save
38
+ end
39
+
40
+ end
41
+ end
42
+
43
+ # end
@@ -0,0 +1,84 @@
1
+ # UserBoard model, links the user and it's boards
2
+ module Unsakini
3
+ class UserBoard < ApplicationRecord
4
+ include EncryptableModelConcern
5
+
6
+ encryptable_attributes :encrypted_password
7
+
8
+ validates :encrypted_password, :presence => true, if: :is_admin
9
+
10
+ before_validation :validate_before_create, on: :create
11
+ before_validation :validate_before_update, on: :update
12
+
13
+ belongs_to :user
14
+ belongs_to :board
15
+
16
+ scope :admin, -> { where(is_admin: true) }
17
+
18
+ def name=(str)
19
+ @name = str
20
+ end
21
+
22
+ def name
23
+ if !@name.nil?
24
+ @name
25
+ else
26
+ self.board.name
27
+ end
28
+ end
29
+
30
+ # Returns user_boards where {Board} is `is_shared`
31
+ #
32
+ # @param is_shared [Boolean] wether to return shared or not shared boards
33
+ def self.shared(is_shared)
34
+ joins("LEFT JOIN #{Board.table_name} ON #{self.table_name}.board_id = #{Board.table_name}.id")
35
+ .where("#{Board.table_name}.is_shared = ?", is_shared)
36
+ end
37
+
38
+ def share(user_ids, new_key)
39
+ ActiveRecord::Base.transaction do
40
+ user_ids.each do |usr_id|
41
+ UserBoard.new({
42
+ user_id: usr_id,
43
+ board_id: self.board_id,
44
+ encrypted_password: nil,
45
+ is_admin: false
46
+ })
47
+ .save!
48
+ end
49
+ self.board.is_shared = true
50
+ self.encrypted_password = new_key
51
+ self.save!
52
+ end
53
+ true
54
+
55
+ rescue
56
+ self.errors[:base] << "Unable to share the this board"
57
+ false
58
+ end
59
+
60
+ private
61
+
62
+ def reset_user_boards_encrypted_password
63
+ UserBoard.where("board_id = ? AND user_id != ?", self.board_id, self.user_id).update_all(encrypted_password: nil)
64
+ end
65
+
66
+ def validate_before_create
67
+ if self.board.nil?
68
+ b = Board.new(name: @name)
69
+ if b.save
70
+ self.board_id = b.id
71
+ else
72
+ self.errors[:base] << "Board name is invalid"
73
+ end
74
+ end
75
+ end
76
+
77
+ def validate_before_update
78
+ self.board.name = @name if !@name.blank?
79
+ reset_user_boards_encrypted_password if self.encrypted_password_changed?
80
+ self.errors[:base] << "Board name is invalid" if !self.board.save
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,5 @@
1
+ module Unsakini
2
+ def self.table_name_prefix
3
+ 'unsakini_'
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module Unsakini
2
+ class BoardSerializer < ActiveModel::Serializer
3
+
4
+ attributes :id, :name, :created_at, :updated_at
5
+
6
+ end
7
+ end
@@ -1,10 +1,13 @@
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
- class CommentSerializer < ActiveModel::Serializer
4
+ module Unsakini
5
+ class CommentSerializer < ActiveModel::Serializer
5
6
 
6
- attributes :id, :content, :created_at, :updated_at
7
+ attributes :id, :content, :created_at, :updated_at
7
8
 
8
- belongs_to :user
9
+ belongs_to :user
10
+
11
+ end
9
12
 
10
13
  end
@@ -0,0 +1,26 @@
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
+ module Unsakini
5
+ class PostSerializer < ActiveModel::Serializer
6
+
7
+ attributes :id, :title, :content, :created_at, :updated_at
8
+
9
+ belongs_to :user
10
+
11
+ belongs_to :board do |serializer|
12
+ user_board = object.board.user_boards.where(user_id: object.user_id).first
13
+
14
+ {
15
+ "id" => object.board.id,
16
+ "name" => object.board.name,
17
+ "is_admin" => user_board.is_admin,
18
+ "encrypted_password" => user_board.encrypted_password,
19
+ "created_at" => object.board.created_at,
20
+ "updated_at" => object.board.updated_at
21
+ }
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,14 @@
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
+ module Unsakini
6
+ class UserBoardSerializer < ActiveModel::Serializer
7
+
8
+ attributes :id, :is_admin, :encrypted_password, :created_at, :updated_at
9
+
10
+ belongs_to :board
11
+
12
+ end
13
+
14
+ end
@@ -1,6 +1,9 @@
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
- class UserSerializer < ActiveModel::Serializer
5
- attributes :id, :name, :email, :created_at, :updated_at
4
+ module Unsakini
5
+ class UserSerializer < ActiveModel::Serializer
6
+ attributes :id, :name, :email, :created_at, :updated_at
7
+ end
8
+
6
9
  end
@@ -0,0 +1,3 @@
1
+ <h1>Confirm Your Account</h1>
2
+ Click the link below: <br>
3
+ <a href="<%= @url %>"><%= @url %></a>
@@ -0,0 +1,343 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title><%= @title %></title>
7
+ <meta name="description" content="<%= @description %>">
8
+ <meta name="keywords" content="<%= @keywords %>">
9
+ <meta name="author" content="<%= @author %>">
10
+ <link rel="apple-touch-icon" sizes="57x57" href="favicons/apple-touch-icon-57x57.png">
11
+ <link rel="apple-touch-icon" sizes="60x60" href="favicons/apple-touch-icon-60x60.png">
12
+ <link rel="apple-touch-icon" sizes="72x72" href="favicons/apple-touch-icon-72x72.png">
13
+ <link rel="apple-touch-icon" sizes="76x76" href="favicons/apple-touch-icon-76x76.png">
14
+ <link rel="apple-touch-icon" sizes="114x114" href="favicons/apple-touch-icon-114x114.png">
15
+ <link rel="apple-touch-icon" sizes="120x120" href="favicons/apple-touch-icon-120x120.png">
16
+ <link rel="apple-touch-icon" sizes="144x144" href="favicons/apple-touch-icon-144x144.png">
17
+ <link rel="apple-touch-icon" sizes="152x152" href="favicons/apple-touch-icon-152x152.png">
18
+ <link rel="apple-touch-icon" sizes="180x180" href="favicons/apple-touch-icon-180x180.png">
19
+ <link rel="icon" type="image/png" href="favicons/favicon-32x32.png" sizes="32x32">
20
+ <link rel="icon" type="image/png" href="favicons/favicon-194x194.png" sizes="194x194">
21
+ <link rel="icon" type="image/png" href="favicons/favicon-96x96.png" sizes="96x96">
22
+ <link rel="icon" type="image/png" href="favicons/android-chrome-192x192.png" sizes="192x192">
23
+ <link rel="icon" type="image/png" href="favicons/favicon-16x16.png" sizes="16x16">
24
+ <link rel="manifest" href="favicons/manifest.json">
25
+ <link rel="shortcut icon" href="favicons/favicon.ico">
26
+ <meta name="msapplication-TileColor" content="#603cba">
27
+ <meta name="msapplication-TileImage" content="favicons/mstile-144x144.png">
28
+ <meta name="msapplication-config" content="favicons/browserconfig.xml">
29
+ <meta name="theme-color" content="#ffffff">
30
+ <link rel="stylesheet" href="css/bootstrap.css">
31
+ <link rel="stylesheet" href="fonts/font-awesome-4.3.0/css/font-awesome.min.css">
32
+ <link rel="stylesheet" href="css/all.css">
33
+ <link rel="stylesheet" href="css/custom.css">
34
+ <link href='http://fonts.googleapis.com/css?family=Montserrat:400,700|Source+Sans+Pro:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
35
+ </head>
36
+ <body>
37
+ <div id="wrapper">
38
+ <header id="header">
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>
44
+ <nav id="nav">
45
+ <div class="opener-holder">
46
+ <a href="#" class="nav-opener"><span></span></a>
47
+ </div>
48
+ <a href="/unsakini/app/signup" class="btn btn-primary rounded visible-md visible-lg">
49
+ Create Account
50
+ </a>
51
+ <div class="nav-drop">
52
+ <ul>
53
+ <li class="active visible-sm visible-xs"><a href="/">Home</a></li>
54
+ <li><a href="#">Documentation</a></li>
55
+ <li><a href="#">Blog</a></li>
56
+ <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>
59
+ </ul>
60
+ <!-- <div class="drop-holder visible-sm visible-xs">
61
+ <span>Follow Us</span>
62
+ <ul class="social-networks">
63
+ <li><a class="fa fa-github" href="#"></a></li>
64
+ <li><a class="fa fa-twitter" href="#"></a></li>
65
+ <li><a class="fa fa-facebook" href="#"></a></li>
66
+ </ul>
67
+ </div> -->
68
+ </div>
69
+ </nav>
70
+ </div>
71
+ </header>
72
+ <section class="visual">
73
+ <div class="container">
74
+ <div class="text-block">
75
+ <div class="heading-holder">
76
+ <h1>Welcome home, mavericks</h1>
77
+ </div>
78
+ <p class="tagline"><%= @description %></p>
79
+ <span class="info">Version <%= @version %></span>
80
+ </div>
81
+ </div>
82
+ <img src="images/img-decor-01.jpg" alt="" class="bg-stretch">
83
+ </section>
84
+ <section class="main">
85
+ <div class="container">
86
+ <div id="cta">
87
+ <a href="<%= @repository %>" class="btn btn-primary rounded">
88
+ Deploy to Your Server
89
+ </a>
90
+ <p>Released under MIT License</p>
91
+ </div>
92
+ <div class="row">
93
+ <div class="text-box col-md-offset-1 col-md-10">
94
+ <h2>Conquer the world with confidence</h2>
95
+ <p>
96
+ <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.
97
+ </p>
98
+ <p>
99
+ The internet is monitored. They hear what we say, but they won't know what we mean.
100
+ </p>
101
+ </div>
102
+ </div>
103
+ </div>
104
+ </section>
105
+ <section class="area">
106
+ <div class="container">
107
+ <div class="row">
108
+ <div class="col-md-5">
109
+ <h2 class="visible-xs visible-sm text-primary">Features</h2>
110
+ <ul class="visual-list">
111
+ <li>
112
+ <div class="img-holder">
113
+ <img src="images/graph-04.svg" width="110" alt="">
114
+ </div>
115
+ <div class="text-holder">
116
+ <h3>Protected Discussion Boards</h3>
117
+ <p>
118
+ Create a board. Protect it with an secret key then share it. Others won't be able to open the board without the secret key used to protect the
119
+ board. Only you and the people you share the secret key will be able to
120
+ participate in the board.
121
+ </p>
122
+ </div>
123
+ </li>
124
+ <li>
125
+ <div class="img-holder">
126
+ <img class="pull-left" src="images/graph-03.svg" width="90" alt="">
127
+ </div>
128
+ <div class="text-holder">
129
+ <h3>Encrypted File Uploads</h3>
130
+ <p>
131
+ All Files Uploaded are encrypted the same way your other data are encrypted.
132
+ Only you can access your files and the ones you share it with.
133
+ </p>
134
+ </div>
135
+ </li>
136
+ <li>
137
+ <div class="img-holder">
138
+ <img src="images/graph-02.svg" height="84" alt="">
139
+ </div>
140
+ <div class="text-holder">
141
+ <h3>Encrypted Chat Convo</h3>
142
+ <p>
143
+ All conversations are encrypted. Only you and the one you converse with
144
+ can be able to open the chat history. Once you forgot your password for a
145
+ certain thread, you can always start a new one with a new secret key.
146
+ </p>
147
+ </div>
148
+ </li>
149
+ <li>
150
+ <div class="img-holder">
151
+ <img src="images/graph-04.svg" height="84" alt="">
152
+ </div>
153
+ <div class="text-holder">
154
+ <h3>Modern UI</h3>
155
+ <p>
156
+ Pleasing, easy to use software. Using modern web design trends and tools in developing the UI for
157
+ better user experience.
158
+ </p>
159
+ </div>
160
+ </li>
161
+ </ul>
162
+ </div>
163
+ <div class="col-md-7">
164
+ <div class="slide-holder">
165
+ <h2 class="hidden-xs hidden-sm text-primary">Features</h2>
166
+ <div class="img-slide scroll-trigger"><img src="images/img-01.png" height="624" width="1184" alt=""></div>
167
+ </div>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ </section>
172
+ <section class="main content-area">
173
+ <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>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </section>
190
+
191
+
192
+ <section class="area">
193
+ <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>
210
+ </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>
223
+ </div>
224
+ </div>
225
+ </div>
226
+ </section>
227
+
228
+
229
+
230
+ <!-- <section class="area">
231
+ <div class="container">
232
+ <div class="subscribe">
233
+ <h3>Subscribe to Our Newsletter</h3>
234
+ <form class="form-inline">
235
+ <button type="submit" class="btn btn-primary rounded">Subscribe</button>
236
+ <div class="form-group">
237
+ <input type="email" class="form-control rounded" id="exampleInputEmail2" placeholder="Email...">
238
+ </div>
239
+ </form>
240
+ </div>
241
+ </div>
242
+ </section>
243
+ <section class="main">
244
+ <div class="container">
245
+ <div class="content">
246
+ <div class="row">
247
+ <div class="col-md-4">
248
+ <h3>New in Release 2.8</h3>
249
+ <h4>Fully Available: Live Preview Support for Multiple Browsers</h4>
250
+ <p>Morbi faucibus ante ipsum, a tincidunt libero posuere et. Etiam tempor tortor at odio condimentum, sit amet fringilla ligula maximus. Mauris venenatis nisl nisi, et dictum dui aliquet nec. Sed erat, nec aliquam vel, aliquam ac felis. </p>
251
+ <h4>Improved Support for Typing </h4>
252
+ <p>Nulla purus quam, pulvinar sed ante et, feugiat maximus velit. Donec eu elit mauris. </p>
253
+ <h4>Improved Stability</h4>
254
+ <p>Proin id ligula eget massa tincidunt molestie. Morbi urna lectus, molestie vel quam vel, iaculis fermentum nunc. Morbi imperdiet, leo in interdum pretium.</p>
255
+ <div class="btn-holder">
256
+ <a href="#" class="btn btn-link">Go to Release Log</a>
257
+ </div>
258
+ </div>
259
+ <div class="col-md-4">
260
+ <h3>Popular Extensions</h3>
261
+ <h4><a href="#">Custom Themes 1.1</a></h4>
262
+ <p>Etiam viverra vulputate diam, pulvinar cursus augue egestas ullamcorper. </p>
263
+ <h4><a href="#">Filter Forge</a></h4>
264
+ <p>Nulla purus quam, pulvinar sed et, feugiat maximus velit.</p>
265
+ <h4><a href="#">WebZap</a></h4>
266
+ <p>Morbi imperdiet, leo in interdum pretium, elit eros dapibus velit, eu posuere quam diam vitae orci. Suspendisse interdum accumsan magna vitae commodo.</p>
267
+ <h4><a href="#">Renamy</a></h4>
268
+ <p>Vivamus consectetur suscipit elit, ut lacinia diam elementum et.</p>
269
+ <div class="btn-holder">
270
+ <a href="#" class="btn btn-link">Go to Marketplace</a>
271
+ </div>
272
+ </div>
273
+ <div class="col-md-4">
274
+ <h3>New From the Blog</h3>
275
+ <h4><a href="#">Morbi imperdiet, leo in interdum pretium.</a></h4>
276
+ <time class="date" datetime="2015-02-18">February 18, 2015</time>
277
+ <h4><a href="#">Donec orci ante, porta vel nulla quis, aliquet hendrerit leo.</a></h4>
278
+ <time class="date" datetime="2015-02-12">February 12, 2015</time>
279
+ <h4><a href="#">Suspendisse egestas vulputate luctus.</a></h4>
280
+ <time class="date" datetime="2015-02-06">February 6, 2015</time>
281
+ <h4><a href="#">Quisque varius ante lorem, eget pretium purus hendrerit a egestas. </a></h4>
282
+ <time class="date" datetime="2015-02-02">February 2, 2015</time>
283
+ <h4><a href="#">Phasellus in augue risus. </a></h4>
284
+ <time class="date" datetime="2015-01-23">January 23, 2015</time>
285
+ <div class="btn-holder">
286
+ <a href="#" class="btn btn-link">Go to Blog</a>
287
+ </div>
288
+ </div>
289
+ </div>
290
+ </div>
291
+ </div>
292
+ </section> -->
293
+ <footer id="footer">
294
+ <div class="container">
295
+ <div class="footer-holder">
296
+ <div class="row">
297
+ <div class="col-md-4">
298
+ <div class="logo"><a href="#"><img src="images/unsakini.svg" alt="FORKIO"></a></div>
299
+ <p>
300
+ <%= @tagline %>
301
+ </p>
302
+ </div>
303
+ <div class="col-md-2">
304
+ <h4>Links</h4>
305
+ <ul>
306
+ <li><a href="http://www.unsakini.com">Project Website</a></li>
307
+ <li><a href="/">Documentation</a></li>
308
+ </ul>
309
+ </div>
310
+ <div class="col-md-3">
311
+ <h4>About the Author</h4>
312
+ <ul>
313
+ <li><a href="http://adonespitogo.com">adonespitogo.com</a></li>
314
+ <li><a href="https://github.com/adonespitogo">github.com/adonespitogo</a></li>
315
+ <li><a href="mailto:pitogo.adones@gmail.com">pitogo.adones@gmail.com</a></li>
316
+ </ul>
317
+ </div>
318
+ <!-- <div class="col-md-3">
319
+ <div class="text-holder">
320
+ <strong class="phone"><a href="tel:3475677890">347 567 78 90</a></strong>
321
+ <span class="available">Available from 12PM - 18PM</span>
322
+ <h4>New York, NY</h4>
323
+ <address>560 Judah St &amp; 15th Ave, Apt 5 San Francisco, CA, 230903</address>
324
+ </div>
325
+ </div> -->
326
+ <div class="col-md-3">
327
+ <div class="text-frame">
328
+ <h4>Credits</h4>
329
+ <p>
330
+ This awesome <a href="http://tympanus.net/codrops/2015/03/12/freebie-forkio-one-page-website-template/">template</a> is made by the folks from <a href="https://pixelbuddha.net/"><strong>Pixel Buddha</strong></a> and <a href="https://www.psd2html.com/"><strong>PSD2HTML</strong></a>. The elegant one-page design is perfect for web dev, apps or software related projects.
331
+ </p>
332
+ </div>
333
+ </div>
334
+ </div>
335
+ </div>
336
+ </div>
337
+ </footer>
338
+ </div>
339
+ <script src="js/jquery-1.11.2.min.js"></script>
340
+ <script src="js/bootstrap.js"></script>
341
+ <script src="js/jquery.main.js"></script>
342
+ </body>
343
+ </html>
data/config/routes.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  Rails.application.routes.draw do
2
-
3
- root to: 'web_base#index'
4
2
 
5
- post 'user_token' => 'user_token#create'
3
+ root to: 'unsakini/web#index'
6
4
 
7
- # ng2 html5 pushState routes
8
- get 'app', to: 'web_base#app'
9
- get 'app/*ngroute', to: 'web_base#app'
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'
10
11
 
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 '/api/share/board/', to: 'share_board#index', as: 'share_board'
20
- get '/api/users/search', to: 'users#search', as: 'user_search'
21
-
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'
22
22
 
23
23
  end
24
24
 
@@ -0,0 +1,10 @@
1
+ class CreateUnsakiniBoards < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :unsakini_boards do |t|
4
+ t.text :name
5
+ t.boolean :is_shared, default: false
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -1,8 +1,9 @@
1
- class CreateUserBoards < ActiveRecord::Migration[5.0]
1
+ class CreateUnsakiniUserBoards < ActiveRecord::Migration[5.0]
2
2
  def change
3
- create_table :user_boards do |t|
3
+ create_table :unsakini_user_boards do |t|
4
4
  t.integer :user_id
5
5
  t.integer :board_id
6
+ t.string :encrypted_password
6
7
  t.boolean :is_admin, :default => false
7
8
 
8
9
  t.timestamps
@@ -1,6 +1,6 @@
1
- class CreatePosts < ActiveRecord::Migration[5.0]
1
+ class CreateUnsakiniPosts < ActiveRecord::Migration[5.0]
2
2
  def change
3
- create_table :posts do |t|
3
+ create_table :unsakini_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 CreateComments < ActiveRecord::Migration[5.0]
1
+ class CreateUnsakiniComments < ActiveRecord::Migration[5.0]
2
2
  def change
3
- create_table :comments do |t|
3
+ create_table :unsakini_comments do |t|
4
4
  t.text :content
5
5
  t.integer :user_id
6
6
  t.integer :post_id
@@ -0,0 +1,15 @@
1
+ class CreateUnsakiniUsers < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :unsakini_users do |t|
4
+ t.string :name, null: false
5
+ t.string :email, null: false
6
+ t.string :password_digest, null: false
7
+ t.string :confirmation_token
8
+ t.datetime :confirmed_at
9
+ t.datetime :confirmation_sent_at
10
+
11
+ t.timestamps
12
+ end
13
+
14
+ end
15
+ end