unsakini 0.0.4.2 → 0.0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -0
  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/{web_base → unsakini/web}/index.html.erb +9 -7
  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 +2 -0
  81. data/lib/unsakini/version.rb +1 -1
  82. data/public/images/unsakini.svg +56 -0
  83. data/public/unsakini/app/448c34a56d699c29117adc64c43affeb.woff2 +0 -0
  84. data/public/unsakini/app/89889688147bd7575d6327160d64e760.svg +288 -0
  85. data/public/unsakini/app/assets/global.scss +3 -0
  86. data/public/unsakini/app/e18bbf611f2a2e43afc071aa2f4e1512.ttf +0 -0
  87. data/public/unsakini/app/f4769f9bdb7466be65088239c12046d1.eot +0 -0
  88. data/public/unsakini/app/fa2772327f55d8198301fdb8bcfc8158.woff +0 -0
  89. data/{angular/dist → public/unsakini/app}/favicon.ico +0 -0
  90. data/public/unsakini/app/index.html +14 -0
  91. data/public/unsakini/app/inline.d41d8cd98f00b204e980.bundle.js +2 -0
  92. data/public/unsakini/app/inline.d41d8cd98f00b204e980.bundle.map +1 -0
  93. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.js +2152 -0
  94. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.js.gz +0 -0
  95. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.map +1 -0
  96. data/public/unsakini/app/styles.58e065928ed8ebd0b582.bundle.js +2 -0
  97. data/public/unsakini/app/styles.58e065928ed8ebd0b582.bundle.map +1 -0
  98. data/public/unsakini/app/styles.5dac0e986fce6f8738b300cb558b56a0.bundle.css +8 -0
  99. data/spec/concerns/models/encryptable_concern.rb +3 -2
  100. data/spec/controllers/{web_base_controller_spec.rb → web_controller_spec.rb} +4 -3
  101. data/spec/dummy/config/application.rb +3 -1
  102. data/spec/dummy/config/environments/development.rb +2 -0
  103. data/spec/dummy/config/initializers/knock.rb +59 -0
  104. data/spec/dummy/db/schema.rb +16 -14
  105. data/spec/dummy/db/test.sqlite3 +0 -0
  106. data/spec/factories/boards.rb +1 -1
  107. data/spec/factories/comments.rb +1 -1
  108. data/spec/factories/posts.rb +1 -1
  109. data/spec/factories/user_boards.rb +1 -1
  110. data/spec/factories/users.rb +1 -1
  111. data/spec/models/board_spec.rb +2 -2
  112. data/spec/models/comment_spec.rb +2 -2
  113. data/spec/models/post_spec.rb +2 -2
  114. data/spec/models/user_board_spec.rb +19 -19
  115. data/spec/models/user_spec.rb +1 -1
  116. data/spec/requests/{api/boards/api_boards_crud_spec.rb → boards/boards_crud_spec.rb} +26 -26
  117. data/spec/requests/{api/boards/api_boards_pagination_spec.rb → boards/boards_pagination_spec.rb} +7 -7
  118. data/spec/requests/{api/boards/api_private_board_spec.rb → boards/private_board_spec.rb} +26 -26
  119. data/spec/requests/{api/boards/api_shared_board_spec.rb → boards/shared_board_spec.rb} +9 -9
  120. data/spec/requests/{api/boards/api_sharing_board_spec.rb → boards/sharing_board_spec.rb} +13 -13
  121. data/spec/requests/{api/comments/api_comments_pagination_spec.rb → comments/comments_pagination_spec.rb} +3 -3
  122. data/spec/requests/{api/comments/api_comments_private_board_spec.rb → comments/comments_private_board_spec.rb} +20 -20
  123. data/spec/requests/{api/comments/api_comments_shared_board_spec.rb → comments/comments_shared_board_spec.rb} +17 -17
  124. data/spec/requests/{api/posts/api_posts_pagination_spec.rb → posts/posts_pagination_spec.rb} +3 -3
  125. data/spec/requests/{api/posts/api_posts_private_board_spec.rb → posts/posts_private_board_spec.rb} +22 -22
  126. data/spec/requests/{api/posts/api_posts_shared_board_spec.rb → posts/posts_shared_board_spec.rb} +24 -24
  127. data/spec/requests/{api/user/api_user_create_spec.rb → user/user_create_spec.rb} +19 -23
  128. data/spec/requests/{api/user/api_user_search_spec.rb → user/user_search_spec.rb} +9 -9
  129. data/spec/schema/jwt.json +9 -0
  130. data/spec/spec_helper.rb +1 -0
  131. data/spec/support/auth_helper.rb +0 -2
  132. metadata +133 -200
  133. data/angular/dist/index.html +0 -14
  134. data/angular/dist/inline.bundle.js +0 -139
  135. data/angular/dist/inline.map +0 -1
  136. data/angular/dist/main.bundle.js +0 -64689
  137. data/angular/dist/main.map +0 -1
  138. data/angular/dist/styles.bundle.js +0 -364
  139. data/angular/dist/styles.map +0 -1
  140. data/angular/src/styles.css +0 -1
  141. data/app/controllers/api/boards_controller.rb +0 -73
  142. data/app/controllers/api/comments_controller.rb +0 -51
  143. data/app/controllers/api/posts_controller.rb +0 -58
  144. data/app/controllers/api/share_board_controller.rb +0 -118
  145. data/app/controllers/api/users_controller.rb +0 -40
  146. data/app/controllers/concerns/board_owner_controller_concern.rb +0 -38
  147. data/app/controllers/concerns/comment_owner_controller_concern.rb +0 -33
  148. data/app/controllers/concerns/logged_in_controller_concern.rb +0 -21
  149. data/app/controllers/concerns/post_owner_controller_concern.rb +0 -36
  150. data/app/controllers/concerns/serializer_controller_concern.rb +0 -11
  151. data/app/controllers/user_token_controller.rb +0 -2
  152. data/app/controllers/web_base_controller.rb +0 -23
  153. data/app/models/application_record.rb +0 -5
  154. data/app/models/board.rb +0 -14
  155. data/app/models/comment.rb +0 -9
  156. data/app/models/concerns/encryptable_model_concern.rb +0 -96
  157. data/app/models/post.rb +0 -12
  158. data/app/models/user.rb +0 -15
  159. data/app/models/user_board.rb +0 -82
  160. data/app/serializers/board_serializer.rb +0 -5
  161. data/app/serializers/post_serializer.rb +0 -23
  162. data/app/serializers/user_board_serializer.rb +0 -11
  163. data/db/migrate/20161116114222_create_boards.rb +0 -9
  164. data/db/migrate/20161118221508_add_encrypted_password_to_user_board.rb +0 -5
  165. data/db/migrate/20161122211105_create_users.rb +0 -12
  166. data/db/migrate/20161124102633_add_is_shared_to_boards.rb +0 -5
  167. data/lib/generators/unsakini/angular/USAGE +0 -8
  168. data/lib/generators/unsakini/angular/angular_generator.rb +0 -7
  169. data/public/images/logo.svg +0 -619
  170. data/spec/dummy/config/initializers/assets.rb +0 -11
  171. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -5
  172. data/spec/dummy/config/initializers/session_store.rb +0 -3
  173. data/spec/dummy/db/development.sqlite3 +0 -0
  174. data/spec/dummy/db/migrate/20161124210219_create_boards.unsakini_engine.rb +0 -10
  175. data/spec/dummy/db/migrate/20161124210220_create_user_boards.unsakini_engine.rb +0 -12
  176. data/spec/dummy/db/migrate/20161124210221_create_posts.unsakini_engine.rb +0 -13
  177. data/spec/dummy/db/migrate/20161124210222_create_comments.unsakini_engine.rb +0 -12
  178. data/spec/dummy/db/migrate/20161124210223_add_encrypted_password_to_user_board.unsakini_engine.rb +0 -6
  179. data/spec/dummy/db/migrate/20161124210224_create_users.unsakini_engine.rb +0 -13
  180. data/spec/dummy/db/migrate/20161124210225_add_is_shared_to_boards.unsakini_engine.rb +0 -6
  181. data/spec/dummy/public/app/favicon.ico +0 -0
  182. data/spec/dummy/public/app/index.html +0 -14
  183. data/spec/dummy/public/app/inline.bundle.js +0 -139
  184. data/spec/dummy/public/app/inline.map +0 -1
  185. data/spec/dummy/public/app/main.bundle.js +0 -64689
  186. data/spec/dummy/public/app/main.map +0 -1
  187. data/spec/dummy/public/app/styles.bundle.js +0 -364
  188. data/spec/dummy/public/app/styles.map +0 -1
  189. data/spec/dummy/tmp/unsakini-ng2/LICENSE +0 -21
  190. data/spec/dummy/tmp/unsakini-ng2/README.md +0 -1
  191. data/spec/dummy/tmp/unsakini-ng2/angular-cli.json +0 -59
  192. data/spec/dummy/tmp/unsakini-ng2/e2e/app.e2e-spec.ts +0 -14
  193. data/spec/dummy/tmp/unsakini-ng2/e2e/app.po.ts +0 -11
  194. data/spec/dummy/tmp/unsakini-ng2/e2e/signup.e2e-spec.ts +0 -28
  195. data/spec/dummy/tmp/unsakini-ng2/e2e/signup.po.ts +0 -31
  196. data/spec/dummy/tmp/unsakini-ng2/e2e/tsconfig.json +0 -16
  197. data/spec/dummy/tmp/unsakini-ng2/karma.conf.js +0 -45
  198. data/spec/dummy/tmp/unsakini-ng2/package.json +0 -49
  199. data/spec/dummy/tmp/unsakini-ng2/protractor.conf.js +0 -32
  200. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.css +0 -0
  201. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.html +0 -4
  202. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.spec.ts +0 -47
  203. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.ts +0 -10
  204. data/spec/dummy/tmp/unsakini-ng2/src/app/app.module.ts +0 -29
  205. data/spec/dummy/tmp/unsakini-ng2/src/app/app.routes.module.ts +0 -29
  206. data/spec/dummy/tmp/unsakini-ng2/src/app/index.ts +0 -2
  207. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.css +0 -0
  208. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.html +0 -14
  209. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.spec.ts +0 -157
  210. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.ts +0 -42
  211. data/spec/dummy/tmp/unsakini-ng2/src/environments/environment.prod.ts +0 -3
  212. data/spec/dummy/tmp/unsakini-ng2/src/environments/environment.ts +0 -8
  213. data/spec/dummy/tmp/unsakini-ng2/src/favicon.ico +0 -0
  214. data/spec/dummy/tmp/unsakini-ng2/src/index.html +0 -14
  215. data/spec/dummy/tmp/unsakini-ng2/src/main.ts +0 -12
  216. data/spec/dummy/tmp/unsakini-ng2/src/polyfills.ts +0 -19
  217. data/spec/dummy/tmp/unsakini-ng2/src/styles.css +0 -1
  218. data/spec/dummy/tmp/unsakini-ng2/src/test.ts +0 -31
  219. data/spec/dummy/tmp/unsakini-ng2/src/tsconfig.json +0 -18
  220. data/spec/dummy/tmp/unsakini-ng2/src/typings.d.ts +0 -2
  221. data/spec/dummy/tmp/unsakini-ng2/tslint.json +0 -114
  222. data/spec/dummy/tmp/unsakini-ng2/typings.json +0 -4
@@ -6,9 +6,9 @@ import 'rxjs/add/observable/of';
6
6
  import 'rxjs/add/observable/throw';
7
7
  import { By } from '@angular/platform-browser';
8
8
  import { DebugElement } from '@angular/core';
9
- import { Angular2TokenService } from 'angular2-token';
10
9
 
11
10
  import { RegistrationComponent } from './registration.component';
11
+ import { RegistrationService } from './'
12
12
 
13
13
  let user = {
14
14
  name: 'first last',
@@ -20,7 +20,11 @@ let user = {
20
20
  let status = 0
21
21
  let errors = []
22
22
 
23
- class Angular2TokenServiceMock {
23
+ class RegistrationServiceMock {
24
+ success = false
25
+ expect (success: boolean) {
26
+ this.success = success;
27
+ }
24
28
  registerAccount(user) {
25
29
 
26
30
  if (status === 200) {
@@ -56,10 +60,7 @@ describe('RegistrationComponent', () => {
56
60
  ],
57
61
  declarations: [RegistrationComponent],
58
62
  providers: [
59
- {
60
- provide: Angular2TokenService,
61
- useClass: Angular2TokenServiceMock
62
- },
63
+ {provide: RegistrationService, useClass: RegistrationServiceMock}
63
64
  ]
64
65
  })
65
66
  .compileComponents();
@@ -74,14 +75,10 @@ describe('RegistrationComponent', () => {
74
75
 
75
76
  describe('Component', () => {
76
77
 
77
- it('should create', () => {
78
+ it('should be defined', () => {
78
79
  expect(component).toBeTruthy();
79
80
  });
80
81
 
81
- it('should have token service', () => {
82
- expect(component.service).toBeDefined();
83
- });
84
-
85
82
  it('should have user', () => {
86
83
  expect(component.user).toEqual({
87
84
  name: '',
@@ -1,5 +1,5 @@
1
1
  import { Component, OnInit } from '@angular/core';
2
- import { Angular2TokenService } from 'angular2-token';
2
+ import { RegistrationService } from './registration.service';
3
3
 
4
4
  @Component({
5
5
  selector: 'app-registration',
@@ -9,10 +9,15 @@ import { Angular2TokenService } from 'angular2-token';
9
9
  export class RegistrationComponent implements OnInit {
10
10
 
11
11
  user: any;
12
- errors: any;
12
+ errors = {
13
+ name: [],
14
+ email: [],
15
+ password: [],
16
+ password_confirmation: []
17
+ };
13
18
  success = false;
14
19
 
15
- constructor(public service: Angular2TokenService) {
20
+ constructor(public service: RegistrationService) {
16
21
  this.user = {
17
22
  name: '',
18
23
  email: '',
@@ -27,11 +32,8 @@ export class RegistrationComponent implements OnInit {
27
32
  this.success = true;
28
33
  },
29
34
  (res) => {
30
- if (res.status == 422) {
31
- this.errors = res.json().errors
32
- } else {
33
- this.errors = ['Something went wrong.']
34
- }
35
+ this.success = false;
36
+ this.errors = res;
35
37
  }
36
38
  );
37
39
  }
@@ -0,0 +1,23 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { RouterModule } from '@angular/router';
5
+ import { ServicesModule } from '../services'
6
+ import { RegistrationComponent } from './registration.component';
7
+ import { RegistrationService } from './registration.service';
8
+
9
+ @NgModule({
10
+ imports: [
11
+ ServicesModule,
12
+ RouterModule,
13
+ FormsModule,
14
+ CommonModule
15
+ ],
16
+ declarations: [
17
+ RegistrationComponent
18
+ ],
19
+ providers: [
20
+ RegistrationService
21
+ ]
22
+ })
23
+ export class RegistrationModule { }
@@ -0,0 +1,46 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Observable } from 'rxjs/Observable';
3
+ import { Response } from '@angular/http';
4
+ import 'rxjs/add/observable/of';
5
+ import 'rxjs/add/observable/throw';
6
+ import 'rxjs/add/operator/map';
7
+ import 'rxjs/add/operator/catch';
8
+ import { HttpService } from '../services/http/http.service';
9
+
10
+ export interface IAccount {
11
+ name: string
12
+ email: string
13
+ password: string
14
+ password_confirmation: string
15
+ }
16
+
17
+ @Injectable()
18
+ export class RegistrationService {
19
+
20
+ constructor(private http: HttpService) {}
21
+
22
+ registerAccount(acct: IAccount) {
23
+ return this.http.post('/user', acct)
24
+ .map(this.extractData)
25
+ .catch(this.handleError)
26
+ }
27
+
28
+ private extractData (res) {
29
+ return res.json()
30
+ }
31
+
32
+ private handleError(err: Response) {
33
+ console.log(err)
34
+ let errors: any;
35
+ try {
36
+ errors = err.json();
37
+ errors['name'] = errors['name'] || []
38
+ errors['email'] = errors['email'] || []
39
+ errors['password'] = errors['password'] || []
40
+ errors['password_confirmation'] = errors['password_confirmation'] || []
41
+ } catch (e) {
42
+ errors = [err.text]
43
+ }
44
+ return Observable.throw(errors)
45
+ }
46
+ }
@@ -0,0 +1,71 @@
1
+
2
+ import { inject, async, ComponentFixture, TestBed } from '@angular/core/testing';
3
+ import { MockBackend, MockConnection } from '@angular/http/testing';
4
+ import { Http, BaseRequestOptions, Response, ResponseOptions } from '@angular/http';
5
+
6
+ import { HttpService } from '..';
7
+ import { RegistrationService, IAccount } from '.'
8
+
9
+ describe('RegistrationService', () => {
10
+
11
+ beforeEach(() => {
12
+ TestBed.configureTestingModule({
13
+ providers: [
14
+ HttpService,
15
+ RegistrationService,
16
+ BaseRequestOptions,
17
+ MockBackend,
18
+ {
19
+ provide: Http,
20
+ useFactory: (backend, defaultOptions) => { return new Http(backend, defaultOptions) },
21
+ deps: [MockBackend, BaseRequestOptions]
22
+ },
23
+ ]
24
+ });
25
+ });
26
+
27
+ it(`handles error`, inject([MockBackend, RegistrationService], (backend: MockBackend, service: RegistrationService) => {
28
+ let errors = ['name is required']
29
+ let mockResponse = new Response(new ResponseOptions({
30
+ status: 422,
31
+ body: errors
32
+ }))
33
+
34
+ backend.connections.subscribe(c => c.mockError(mockResponse));
35
+
36
+ let acct: IAccount = {
37
+ name: '',
38
+ email: '',
39
+ password: '',
40
+ password_confirmation: ''
41
+ }
42
+
43
+ service.registerAccount(acct).subscribe((res: Response) => {}, (err: Response) => {
44
+ expect(err).toEqual(errors)
45
+ });
46
+
47
+ }))
48
+
49
+ it(`handles success`, inject([MockBackend, RegistrationService], (backend: MockBackend, service: RegistrationService) => {
50
+
51
+ let acct: IAccount = {
52
+ name: '',
53
+ email: '',
54
+ password: '',
55
+ password_confirmation: ''
56
+ }
57
+
58
+ let mockResponse = new Response(new ResponseOptions({
59
+ status: 200,
60
+ body: acct
61
+ }))
62
+
63
+ backend.connections.subscribe(c => c.mockRespond(mockResponse));
64
+
65
+ service.registerAccount(acct).subscribe((res: Response) => {
66
+ expect(res).toEqual(acct)
67
+ });
68
+
69
+ }))
70
+
71
+ });
@@ -0,0 +1,35 @@
1
+
2
+ import { environment } from '../../../environments/environment';
3
+ import {HttpService} from '../http';
4
+ import {Injectable} from '@angular/core';
5
+ import {Http, XHRBackend, RequestOptions, Request, RequestOptionsArgs, Response, Headers} from '@angular/http';
6
+ import {Observable} from 'rxjs/Observable';
7
+ import 'rxjs/add/operator/catch';
8
+ import 'rxjs/add/operator/map';
9
+
10
+ @Injectable()
11
+ export class AuthHttpService extends HttpService {
12
+
13
+ base_url = environment.api_base_url;
14
+
15
+ constructor (backend: XHRBackend, options: RequestOptions) {
16
+ super(backend, options);
17
+ }
18
+
19
+ request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> {
20
+ if (typeof url === 'string') {
21
+ if (!options) {
22
+ options = {headers: new Headers()};
23
+ }
24
+ options.headers.set('Authorization', `Bearer ${this.getAuthToken()}`);
25
+ } else {
26
+ url.headers.set('Authorization', `Bearer ${this.getAuthToken()}`);
27
+ }
28
+ return super.request(url, options);
29
+ }
30
+
31
+ getAuthToken () {
32
+ return localStorage.getItem('auth_token');
33
+ }
34
+
35
+ }
@@ -0,0 +1 @@
1
+ export * from './auth.http.service';
@@ -0,0 +1,205 @@
1
+ /* tslint:disable:no-unused-variable */
2
+
3
+ import { TestBed, async, inject } from '@angular/core/testing';
4
+ import { Http, BaseRequestOptions, Response, ResponseOptions, Headers, RequestMethod } from '@angular/http';
5
+ import { MockBackend } from '@angular/http/testing';
6
+ import { HttpService} from '.';
7
+ import { environment } from '../../../environments/environment';
8
+
9
+ describe('HttpService', () => {
10
+ beforeEach(() => {
11
+ TestBed.configureTestingModule({
12
+ providers: [
13
+ HttpService,
14
+ BaseRequestOptions,
15
+ MockBackend,
16
+ {
17
+ provide: Http,
18
+ useFactory: (backend, defaultOptions) => { return new Http(backend, defaultOptions) },
19
+ deps: [MockBackend, BaseRequestOptions]
20
+ },
21
+ ]
22
+ });
23
+ });
24
+
25
+ it('should be defined', inject([HttpService], (service: HttpService) => {
26
+ expect(service).toBeTruthy();
27
+ }));
28
+
29
+ describe('Append base api url /', () => {
30
+
31
+ let expectMethod = (method: string) => {
32
+
33
+ it(`appends base api url to the ${method} request`, inject([HttpService, MockBackend], (service: HttpService, backend: MockBackend) => {
34
+
35
+ service.base_url = '/'
36
+ let request_url = '/hello/world'
37
+
38
+ backend.connections.subscribe((c) => {
39
+ expect(c.request.url).toEqual((request_url))
40
+ c.mockRespond(new Response(new ResponseOptions({ body: 'fake response' })))
41
+ })
42
+
43
+ if (method === 'post' || method === 'put' || method === 'patch')
44
+ service[method](request_url, {}).subscribe()
45
+ else
46
+ service[method](request_url).subscribe()
47
+ }));
48
+
49
+ }
50
+
51
+ let methods = ['post', 'get', 'put', 'patch', 'delete']
52
+
53
+ for (let i = methods.length - 1; i >= 0; i--) {
54
+ expectMethod(methods[i])
55
+ }
56
+
57
+ })
58
+
59
+ describe('Base url is http://domain.com', () => {
60
+
61
+ let expectMethod = (method: string) => {
62
+
63
+ it(`appends base api url to the ${method} request`, inject([HttpService, MockBackend], (service: HttpService, backend: MockBackend) => {
64
+ let domain = 'http://domain.com'
65
+ service.base_url = domain
66
+ let request_url = '/hello/world'
67
+
68
+ backend.connections.subscribe((c) => {
69
+ expect(c.request.url).toEqual(`${domain}${request_url}`)
70
+ c.mockRespond(new Response(new ResponseOptions({ body: 'fake response' })))
71
+ })
72
+
73
+ if (method === 'post' || method === 'put' || method === 'patch')
74
+ service[method](request_url, {}).subscribe()
75
+ else
76
+ service[method](request_url).subscribe()
77
+
78
+ }));
79
+
80
+ }
81
+
82
+ let methods = ['post', 'get', 'put', 'patch', 'delete']
83
+
84
+ for (let i = methods.length - 1; i >= 0; i--) {
85
+ expectMethod(methods[i])
86
+ }
87
+
88
+ })
89
+
90
+ describe('Base url is http://domain.com/, with /', () => {
91
+
92
+ let expectMethod = (method: string) => {
93
+
94
+ it(`appends base api url to the ${method} request`, inject([HttpService, MockBackend], (service: HttpService, backend: MockBackend) => {
95
+ let domain = 'http://domain.com'
96
+ service.base_url = domain + '/'
97
+ let request_url = '/hello/world'
98
+
99
+ backend.connections.subscribe((c) => {
100
+ expect(c.request.url).toEqual(`${domain}${request_url}`)
101
+ c.mockRespond(new Response(new ResponseOptions({ body: 'fake response' })))
102
+ })
103
+
104
+ if (method === 'post' || method === 'put' || method === 'patch')
105
+ service[method](request_url, {}).subscribe()
106
+ else
107
+ service[method](request_url).subscribe()
108
+
109
+ }));
110
+
111
+ }
112
+
113
+ let methods = ['post', 'get', 'put', 'patch', 'delete']
114
+
115
+ for (let i = methods.length - 1; i >= 0; i--) {
116
+ expectMethod(methods[i])
117
+ }
118
+
119
+ })
120
+
121
+ describe('Base url dont begin with forward slash (/)', () => {
122
+
123
+ let expectMethod = (method: string) => {
124
+
125
+ it(`appends base api url to the ${method} request`, inject([HttpService, MockBackend], (service: HttpService, backend: MockBackend) => {
126
+ let domain = 'http://domain.com'
127
+ service.base_url = domain + '/'
128
+ let request_url = 'hello/world'
129
+
130
+ backend.connections.subscribe((c) => {
131
+ expect(c.request.url).toEqual(`${domain}/${request_url}`)
132
+ c.mockRespond(new Response(new ResponseOptions({ body: 'fake response' })))
133
+ })
134
+
135
+ if (method === 'post' || method === 'put' || method === 'patch')
136
+ service[method](request_url, {}).subscribe()
137
+ else
138
+ service[method](request_url).subscribe()
139
+
140
+ }));
141
+
142
+ }
143
+
144
+ let methods = ['post', 'get', 'put', 'patch', 'delete']
145
+
146
+ for (let i = methods.length - 1; i >= 0; i--) {
147
+ expectMethod(methods[i])
148
+ }
149
+
150
+ })
151
+
152
+ // describe('Registration', () => {
153
+
154
+ // it('jsonizes error', inject([HttpService, MockBackend], (service: HttpService, backend: MockBackend) => {
155
+
156
+ // let errors = ['name cant be blank']
157
+
158
+ // let mockResponse = new Response(new ResponseOptions({
159
+ // status: 422,
160
+ // body: errors
161
+ // }))
162
+
163
+ // backend.connections.subscribe(c => c.mockError(mockResponse));
164
+
165
+ // let acct: IAccount = {
166
+ // name: '',
167
+ // email: '',
168
+ // password: '',
169
+ // password_confirmation: ''
170
+ // }
171
+
172
+ // service.registerAccount(acct).subscribe(
173
+ // (res) => {},
174
+ // (res) => {
175
+ // expect(res).toEqual(errors)
176
+ // })
177
+
178
+ // }));
179
+
180
+ // it('handles success response', inject([HttpService, MockBackend], (service: HttpService, backend: MockBackend) => {
181
+
182
+ // let acct: IAccount = {
183
+ // name: '',
184
+ // email: '',
185
+ // password: '',
186
+ // password_confirmation: ''
187
+ // }
188
+
189
+
190
+ // let mockResponse = new Response(new ResponseOptions({
191
+ // status: 422,
192
+ // body: acct
193
+ // }))
194
+
195
+ // backend.connections.subscribe(c => c.mockRespond(mockResponse));
196
+ // service.registerAccount(acct).subscribe(
197
+ // (res) => {
198
+ // expect(res).toBe(acct)
199
+ // })
200
+
201
+ // }));
202
+
203
+ // });
204
+
205
+ });
@@ -0,0 +1,40 @@
1
+
2
+ import { environment } from '../../../environments/environment';
3
+ import {Injectable} from '@angular/core';
4
+ import {Http, XHRBackend, RequestOptions, Request, RequestOptionsArgs, Response, Headers} from '@angular/http';
5
+ import {Observable} from 'rxjs/Observable';
6
+ import 'rxjs/add/operator/catch';
7
+ import 'rxjs/add/operator/map';
8
+
9
+ @Injectable()
10
+
11
+ export class HttpService extends Http {
12
+
13
+ base_url = environment.api_base_url;
14
+ engine_url = '/unsakini'
15
+
16
+ constructor (backend: XHRBackend, options: RequestOptions) {
17
+ super(backend, options);
18
+ }
19
+
20
+ getAuthToken (){
21
+ localStorage.getItem('auth_token');
22
+ }
23
+
24
+ request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> {
25
+ if (typeof url === 'string') {
26
+ url = this.buildUrl(url);
27
+ } else {
28
+ url.url = this.buildUrl(url.url);
29
+ }
30
+ return super.request(url, options);
31
+ }
32
+
33
+ buildUrl(url: string) {
34
+ let new_url = `${this.base_url}/${this.engine_url}/${url}`;
35
+ // remove multiple forward slash from the url like:
36
+ // http://domain.com//hello/world -> http://domain.com/hello/world
37
+ return new_url.replace(/([^:]\/)\/+/g, "$1").replace(/(^\/)\/+/g, "$1");
38
+ }
39
+
40
+ }
@@ -0,0 +1 @@
1
+ export * from './http.service';
@@ -0,0 +1,3 @@
1
+ export * from './auth-http/'
2
+ export * from './http'
3
+ export * from './services.module'
@@ -0,0 +1,33 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { HttpModule, XHRBackend, RequestOptions } from '@angular/http';
3
+
4
+ import { HttpService } from './http/http.service';
5
+ import { AuthHttpService } from './auth-http/auth.http.service';
6
+
7
+ @NgModule({
8
+ imports: [
9
+ HttpModule
10
+ ],
11
+ declarations: [
12
+ ],
13
+ providers: [
14
+ {
15
+ provide: HttpService,
16
+ useFactory: (backend: XHRBackend, options: RequestOptions) => {
17
+ return new HttpService(backend, options)
18
+ },
19
+ deps: [ XHRBackend, RequestOptions]
20
+ },
21
+ {
22
+ provide: AuthHttpService,
23
+ useFactory: (backend: XHRBackend, options: RequestOptions) => {
24
+ return new HttpService(backend, options)
25
+ },
26
+ deps: [ XHRBackend, RequestOptions]
27
+ }
28
+ ],
29
+ exports: [
30
+ HttpModule
31
+ ]
32
+ })
33
+ export class ServicesModule { }
@@ -0,0 +1,3 @@
1
+ [hidden] {
2
+ display: none;
3
+ }
@@ -0,0 +1,4 @@
1
+ export const environment = {
2
+ production: true,
3
+ api_base_url: ''
4
+ };
@@ -1,3 +1,4 @@
1
1
  export const environment = {
2
- production: true
2
+ production: true,
3
+ api_base_url: 'https://www.unsakini.com'
3
4
  };
@@ -4,5 +4,6 @@
4
4
  // The list of which env maps to which file can be found in `angular-cli.json`.
5
5
 
6
6
  export const environment = {
7
- production: false
7
+ production: false,
8
+ api_base_url: '/'
8
9
  };
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="utf-8">
5
5
  <title>Angular</title>
6
- <base href="/app/">
6
+ <base href="/unsakini/app/">
7
7
 
8
8
  <meta name="viewport" content="width=device-width, initial-scale=1">
9
9
  <link rel="icon" type="image/x-icon" href="favicon.ico">
@@ -1,5 +1,5 @@
1
1
  # Base controller for API controllers
2
2
 
3
- class ApplicationController < ActionController::API
3
+ # class ApplicationController < ActionController::Base
4
4
 
5
- end
5
+ # end
@@ -0,0 +1,42 @@
1
+ module Unsakini
2
+ #Ensure user has access to the board and sets the `@board` variable in the controller
3
+
4
+ module BoardOwnerControllerConcern
5
+ extend ActiveSupport::Concern
6
+
7
+ #Ensure user has access to the board and sets the `@board` variable in the controller
8
+ def ensure_board
9
+ board_id = params[:board_id] || params[:id]
10
+ result = has_board_access(board_id)
11
+ @board = result[:board]
12
+ @user_board = result[:user_board]
13
+ head result[:status] if result[:status] != :ok
14
+ end
15
+
16
+ # Validate if user has access to board
17
+ #
18
+ # @param board_id [Integer] board id
19
+ def has_board_access(board_id)
20
+ board = nil
21
+ if !board_id.nil?
22
+ board = Unsakini::Board.find_by_id(board_id)
23
+ else
24
+ return {status: :bad_request}
25
+ end
26
+ if (board)
27
+ user_board = Unsakini::UserBoard.where(user_id: @user.id, board_id: board_id).first
28
+ return {status: :forbidden } if user_board.nil?
29
+ return {status: :ok, board: board, user_board: user_board}
30
+ else
31
+ return {status: :not_found}
32
+ end
33
+ end
34
+
35
+ #Ensures user is owner of the board. Must be run after {#ensure_board} method.
36
+ def ensure_board_owner
37
+ render json: {}, status: :forbidden if !@user_board.is_admin
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,36 @@
1
+ module Unsakini
2
+ # Ensures user is owner of the comment and sets the `@comment` variable in the controllers
3
+ module CommentOwnerControllerConcern
4
+ extend ActiveSupport::Concern
5
+
6
+ # Ensures user is owner of the comment and sets the `@comment` variable in the controllers
7
+ def ensure_comment
8
+ post_id = params[:post_id]
9
+ comment_id = params[:comment_id] || params[:id]
10
+ result = has_comment_access post_id, comment_id
11
+ @comment = result[:comment]
12
+ status = result[:status]
13
+ head status if status != :ok
14
+ end
15
+
16
+ # Validate if user has access to comment in the post
17
+ #
18
+ # @param post_id [Integer] post id
19
+ # @param comment_id [Integer] comment id
20
+ def has_comment_access(post_id, comment_id)
21
+ comment = Unsakini::Comment.where(id: comment_id, post_id: post_id, user_id: @user.id).first
22
+ if comment.nil?
23
+ return {status: :forbidden, comment: comment}
24
+ else
25
+ return {status: :ok, comment: comment}
26
+ end
27
+ end
28
+
29
+ # Ensures user is the owner of the comment. Must be run after {#ensure_comment} method.
30
+ def ensure_comment_owner
31
+ render json: {}, status: :forbidden if @comment.user_id != @user.id
32
+ end
33
+
34
+ end
35
+
36
+ end