Commit e6bb091b74ef2dee9130a87555e8029bed4ed09e
1 parent
b471f0f7
Exists in
master
and in
4 other branches
use profile service instead of people service to upload image
Showing
7 changed files
with
62 additions
and
37 deletions
Show diff stats
src/app/profile/image/image.component.spec.ts
@@ -7,7 +7,7 @@ | @@ -7,7 +7,7 @@ | ||
7 | import { ComponentTestHelper, createClass } from '../../../spec/component-test-helper'; | 7 | import { ComponentTestHelper, createClass } from '../../../spec/component-test-helper'; |
8 | import { TestComponentBuilder, ComponentFixture } from 'ng-forward/cjs/testing/test-component-builder'; | 8 | import { TestComponentBuilder, ComponentFixture } from 'ng-forward/cjs/testing/test-component-builder'; |
9 | import { Pipe, Input, provide, Component } from 'ng-forward'; | 9 | import { Pipe, Input, provide, Component } from 'ng-forward'; |
10 | -import { PersonService } from "../../../lib/ng-noosfero-api/http/person.service"; | 10 | +import { ProfileService } from "../../../lib/ng-noosfero-api/http/profile.service"; |
11 | 11 | ||
12 | import * as helpers from "../../../spec/helpers"; | 12 | import * as helpers from "../../../spec/helpers"; |
13 | 13 | ||
@@ -25,14 +25,14 @@ describe("Components", () => { | @@ -25,14 +25,14 @@ describe("Components", () => { | ||
25 | 25 | ||
26 | beforeEach((done) => { | 26 | beforeEach((done) => { |
27 | let scope = helpers.mocks.scopeWithEvents; | 27 | let scope = helpers.mocks.scopeWithEvents; |
28 | - let personService = jasmine.createSpyObj("personService", ["upload"]); | 28 | + let profileService = jasmine.createSpyObj("profileService", ["upload"]); |
29 | let properties = { profile: { custom_footer: "footer" } }; | 29 | let properties = { profile: { custom_footer: "footer" } }; |
30 | let cls = createClass({ | 30 | let cls = createClass({ |
31 | template: htmlTemplate, | 31 | template: htmlTemplate, |
32 | directives: [ProfileImageComponent], | 32 | directives: [ProfileImageComponent], |
33 | properties: properties, | 33 | properties: properties, |
34 | providers: [ | 34 | providers: [ |
35 | - helpers.createProviderToValue("PersonService", personService), | 35 | + helpers.createProviderToValue("ProfileService", profileService), |
36 | helpers.createProviderToValue("$uibModal", helpers.mocks.$modal), | 36 | helpers.createProviderToValue("$uibModal", helpers.mocks.$modal), |
37 | helpers.createProviderToValue("$scope", scope) | 37 | helpers.createProviderToValue("$scope", scope) |
38 | ] | 38 | ] |
src/app/profile/image/image.component.ts
1 | import { Inject, Input, Component, provide } from "ng-forward"; | 1 | import { Inject, Input, Component, provide } from "ng-forward"; |
2 | -import { PersonService } from "../../../lib/ng-noosfero-api/http/person.service"; | 2 | +import { ProfileService } from "../../../lib/ng-noosfero-api/http/profile.service"; |
3 | import { PermissionService } from "../../shared/services/permission.service"; | 3 | import { PermissionService } from "../../shared/services/permission.service"; |
4 | import { ProfileImageEditorComponent } from "./profile-image-editor.component"; | 4 | import { ProfileImageEditorComponent } from "./profile-image-editor.component"; |
5 | 5 | ||
@@ -12,11 +12,10 @@ import { ProfileImageEditorComponent } from "./profile-image-editor.component"; | @@ -12,11 +12,10 @@ import { ProfileImageEditorComponent } from "./profile-image-editor.component"; | ||
12 | @Component({ | 12 | @Component({ |
13 | selector: "noosfero-profile-image", | 13 | selector: "noosfero-profile-image", |
14 | templateUrl: 'app/profile/image/image.html', | 14 | templateUrl: 'app/profile/image/image.html', |
15 | - providers: [provide('personService', { useClass: PersonService })] | 15 | + providers: [provide('profileService', { useClass: ProfileService })] |
16 | }) | 16 | }) |
17 | -@Inject(PersonService, PermissionService, "$uibModal", "$scope") | 17 | +@Inject(ProfileService, PermissionService, "$uibModal", "$scope") |
18 | export class ProfileImageComponent { | 18 | export class ProfileImageComponent { |
19 | - | ||
20 | /** | 19 | /** |
21 | * @ngdoc property | 20 | * @ngdoc property |
22 | * @name profile | 21 | * @name profile |
@@ -42,8 +41,7 @@ export class ProfileImageComponent { | @@ -42,8 +41,7 @@ export class ProfileImageComponent { | ||
42 | croppedDataUrl: any; | 41 | croppedDataUrl: any; |
43 | modalInstance: any; | 42 | modalInstance: any; |
44 | 43 | ||
45 | - constructor(private personService: PersonService, private permissionService: PermissionService, private $uibModal: ng.ui.bootstrap.IModalService, private $scope: ng.IScope) { | ||
46 | - console.log('wwwwwwwwwwwwwwwwwwwwwwww', this.editable); | 44 | + constructor(private profileService: ProfileService, private permissionService: PermissionService, private $uibModal: ng.ui.bootstrap.IModalService, private $scope: ng.IScope) { |
47 | } | 45 | } |
48 | 46 | ||
49 | fileSelected(file: any, errFiles: any) { | 47 | fileSelected(file: any, errFiles: any) { |
@@ -59,7 +57,7 @@ export class ProfileImageComponent { | @@ -59,7 +57,7 @@ export class ProfileImageComponent { | ||
59 | resolve: { | 57 | resolve: { |
60 | picFile: this.picFile, | 58 | picFile: this.picFile, |
61 | profile: this.profile, | 59 | profile: this.profile, |
62 | - personService: this.personService | 60 | + profileService: this.profileService |
63 | } | 61 | } |
64 | }); | 62 | }); |
65 | } | 63 | } |
@@ -79,7 +77,6 @@ export class ProfileImageComponent { | @@ -79,7 +77,6 @@ export class ProfileImageComponent { | ||
79 | return this.editable && this.permissionService.isAllowed(this.profile, 'allow_edit'); | 77 | return this.editable && this.permissionService.isAllowed(this.profile, 'allow_edit'); |
80 | } | 78 | } |
81 | 79 | ||
82 | - | ||
83 | /** | 80 | /** |
84 | * @ngdoc method | 81 | * @ngdoc method |
85 | * @name ngOnInit | 82 | * @name ngOnInit |
src/app/profile/image/profile-image-editor.component.spec.ts
@@ -18,7 +18,7 @@ describe("Components", () => { | @@ -18,7 +18,7 @@ describe("Components", () => { | ||
18 | let modalInstance = jasmine.createSpyObj("$uibModalInstance", ["close"]); | 18 | let modalInstance = jasmine.createSpyObj("$uibModalInstance", ["close"]); |
19 | let picFile = { type: "png" }; | 19 | let picFile = { type: "png" }; |
20 | let $q: ng.IQService; | 20 | let $q: ng.IQService; |
21 | - let personServiceMock: any; | 21 | + let profileServiceMock: any; |
22 | let $rootScope: ng.IRootScopeService; | 22 | let $rootScope: ng.IRootScopeService; |
23 | 23 | ||
24 | beforeEach(inject((_$q_: ng.IQService, _$rootScope_: ng.IRootScopeService) => { | 24 | beforeEach(inject((_$q_: ng.IQService, _$rootScope_: ng.IRootScopeService) => { |
@@ -26,7 +26,7 @@ describe("Components", () => { | @@ -26,7 +26,7 @@ describe("Components", () => { | ||
26 | $rootScope = _$rootScope_; | 26 | $rootScope = _$rootScope_; |
27 | })); | 27 | })); |
28 | 28 | ||
29 | - let comp = new ProfileImageEditorComponent(picFile, this.profile, personServiceMock, modalInstance); | 29 | + let comp = new ProfileImageEditorComponent(picFile, this.profile, profileServiceMock, modalInstance); |
30 | 30 | ||
31 | it("get data", done => { | 31 | it("get data", done => { |
32 | 32 | ||
@@ -46,10 +46,10 @@ describe("Components", () => { | @@ -46,10 +46,10 @@ describe("Components", () => { | ||
46 | 46 | ||
47 | it("upload image", done => { | 47 | it("upload image", done => { |
48 | let imageName = "image1"; | 48 | let imageName = "image1"; |
49 | - personServiceMock = jasmine.createSpyObj("personServiceMock", ["uploadImage"]); | 49 | + profileServiceMock = jasmine.createSpyObj("profileServiceMock", ["uploadImage"]); |
50 | let deferredUploadImage = $q.defer(); | 50 | let deferredUploadImage = $q.defer(); |
51 | - personServiceMock.uploadImage = jasmine.createSpy('uploadImage').and.returnValue(deferredUploadImage.promise); | ||
52 | - comp.personService = personServiceMock; | 51 | + profileServiceMock.uploadImage = jasmine.createSpy('uploadImage').and.returnValue(deferredUploadImage.promise); |
52 | + comp.profileService = profileServiceMock; | ||
53 | comp.uploadImage(testDataUrl, imageName); | 53 | comp.uploadImage(testDataUrl, imageName); |
54 | deferredUploadImage.resolve(); | 54 | deferredUploadImage.resolve(); |
55 | $rootScope.$apply(); | 55 | $rootScope.$apply(); |
src/app/profile/image/profile-image-editor.component.ts
1 | import { StateConfig, Component, Input, Output, Inject, provide } from 'ng-forward'; | 1 | import { StateConfig, Component, Input, Output, Inject, provide } from 'ng-forward'; |
2 | import { TranslateProfile } from "../../shared/pipes/translate-profile.filter"; | 2 | import { TranslateProfile } from "../../shared/pipes/translate-profile.filter"; |
3 | -import { PersonService } from "../../../lib/ng-noosfero-api/http/person.service"; | 3 | +import { ProfileService } from "../../../lib/ng-noosfero-api/http/profile.service"; |
4 | 4 | ||
5 | export class ProfileImageEditorComponent { | 5 | export class ProfileImageEditorComponent { |
6 | 6 | ||
7 | croppedDataUrl: string; | 7 | croppedDataUrl: string; |
8 | - static $inject = ["picFile", "profile", "personService", "$uibModalInstance"]; | 8 | + static $inject = ["picFile", "profile", "profileService", "$uibModalInstance"]; |
9 | 9 | ||
10 | - constructor(public picFile: any, public profile: noosfero.Profile, public personService: PersonService, | 10 | + constructor(public picFile: any, public profile: noosfero.Profile, public profileService: ProfileService, |
11 | public modalInstance: ng.ui.bootstrap.IModalServiceInstance) { | 11 | public modalInstance: ng.ui.bootstrap.IModalServiceInstance) { |
12 | } | 12 | } |
13 | - | 13 | + |
14 | uploadImage(dataUrl: any, name: any) { | 14 | uploadImage(dataUrl: any, name: any) { |
15 | let base64ImageJson = this.getBase64ImageJson(dataUrl, name); | 15 | let base64ImageJson = this.getBase64ImageJson(dataUrl, name); |
16 | - this.personService.uploadImage(this.profile, base64ImageJson).then((result: any) => { | 16 | + this.profileService.uploadImage(this.profile, base64ImageJson).then((result: any) => { |
17 | this.modalInstance.close(name); | 17 | this.modalInstance.close(name); |
18 | }); | 18 | }); |
19 | } | 19 | } |
src/app/shared/services/permission.service.ts
@@ -5,7 +5,7 @@ type WithPermissions = noosfero.Profile | noosfero.Comment | noosfero.Article; | @@ -5,7 +5,7 @@ type WithPermissions = noosfero.Profile | noosfero.Comment | noosfero.Article; | ||
5 | @Injectable() | 5 | @Injectable() |
6 | export class PermissionService { | 6 | export class PermissionService { |
7 | isAllowed(target: WithPermissions, permission: string) { | 7 | isAllowed(target: WithPermissions, permission: string) { |
8 | - return target.permissions.indexOf(permission) >= 0; | 8 | + return (target.permissions || []).indexOf(permission) >= 0; |
9 | } | 9 | } |
10 | 10 | ||
11 | } | 11 | } |
src/lib/ng-noosfero-api/http/article.service.ts
@@ -58,7 +58,7 @@ export class ArticleService extends RestangularService<noosfero.Article> { | @@ -58,7 +58,7 @@ export class ArticleService extends RestangularService<noosfero.Article> { | ||
58 | } | 58 | } |
59 | 59 | ||
60 | createInProfile(profile: noosfero.Profile, article: noosfero.Article): ng.IPromise<noosfero.RestResult<noosfero.Article>> { | 60 | createInProfile(profile: noosfero.Profile, article: noosfero.Article): ng.IPromise<noosfero.RestResult<noosfero.Article>> { |
61 | - let profileElement = this.profileService.get(<number>profile.id); | 61 | + let profileElement = this.profileService.getProfileElement(<number>profile.id); |
62 | (<any>profileElement).id = profile.id; | 62 | (<any>profileElement).id = profile.id; |
63 | let headers = { | 63 | let headers = { |
64 | 'Content-Type': 'application/json' | 64 | 'Content-Type': 'application/json' |
@@ -84,13 +84,13 @@ export class ArticleService extends RestangularService<noosfero.Article> { | @@ -84,13 +84,13 @@ export class ArticleService extends RestangularService<noosfero.Article> { | ||
84 | } | 84 | } |
85 | 85 | ||
86 | getByProfile<T>(profile: noosfero.Profile, params?: any): ng.IPromise<noosfero.RestResult<noosfero.Article[]>> { | 86 | getByProfile<T>(profile: noosfero.Profile, params?: any): ng.IPromise<noosfero.RestResult<noosfero.Article[]>> { |
87 | - let profileElement = this.profileService.get(<number>profile.id); | 87 | + let profileElement = this.profileService.getProfileElement(<number>profile.id); |
88 | return this.list(profileElement, params); | 88 | return this.list(profileElement, params); |
89 | } | 89 | } |
90 | 90 | ||
91 | getArticleByProfileAndPath(profile: noosfero.Profile, path: string): ng.IPromise<noosfero.RestResult<noosfero.Article>> { | 91 | getArticleByProfileAndPath(profile: noosfero.Profile, path: string): ng.IPromise<noosfero.RestResult<noosfero.Article>> { |
92 | let deferred = this.$q.defer<noosfero.RestResult<noosfero.Article>>(); | 92 | let deferred = this.$q.defer<noosfero.RestResult<noosfero.Article>>(); |
93 | - let profileElement = this.profileService.get(<number>profile.id); | 93 | + let profileElement = this.profileService.getProfileElement(<number>profile.id); |
94 | 94 | ||
95 | let restRequest: ng.IPromise<any>; | 95 | let restRequest: ng.IPromise<any>; |
96 | 96 | ||
@@ -108,7 +108,7 @@ export class ArticleService extends RestangularService<noosfero.Article> { | @@ -108,7 +108,7 @@ export class ArticleService extends RestangularService<noosfero.Article> { | ||
108 | } | 108 | } |
109 | 109 | ||
110 | getOneByProfile<T>(profile: noosfero.Profile, params?: any): ng.IPromise<noosfero.RestResult<noosfero.Article>> { | 110 | getOneByProfile<T>(profile: noosfero.Profile, params?: any): ng.IPromise<noosfero.RestResult<noosfero.Article>> { |
111 | - let profileElement = this.profileService.get(<number>profile.id); | 111 | + let profileElement = this.profileService.getProfileElement(<number>profile.id); |
112 | return this.getSub(profileElement, params); | 112 | return this.getSub(profileElement, params); |
113 | } | 113 | } |
114 | 114 |
src/lib/ng-noosfero-api/http/profile.service.ts
1 | import { Injectable, Inject } from "ng-forward"; | 1 | import { Injectable, Inject } from "ng-forward"; |
2 | +import { RestangularService } from "./restangular_service"; | ||
3 | + | ||
2 | 4 | ||
3 | @Injectable() | 5 | @Injectable() |
4 | @Inject("Restangular", "$q") | 6 | @Inject("Restangular", "$q") |
5 | -export class ProfileService { | 7 | +export class ProfileService extends RestangularService<noosfero.Profile> { |
6 | 8 | ||
7 | private _currentProfilePromise: ng.IDeferred<noosfero.Profile>; | 9 | private _currentProfilePromise: ng.IDeferred<noosfero.Profile>; |
8 | 10 | ||
9 | - constructor(private restangular: restangular.IService, private $q: ng.IQService) { | 11 | + constructor(private restangular: restangular.IService, $q: ng.IQService, $log: ng.ILogService) { |
12 | + super(restangular, $q, $log); | ||
10 | this.resetCurrentProfile(); | 13 | this.resetCurrentProfile(); |
11 | } | 14 | } |
12 | 15 | ||
16 | + getResourcePath() { | ||
17 | + return "profiles"; | ||
18 | + } | ||
19 | + | ||
20 | + getDataKeys() { | ||
21 | + return { | ||
22 | + singular: 'profile', | ||
23 | + plural: 'profiles' | ||
24 | + }; | ||
25 | + } | ||
26 | + | ||
13 | resetCurrentProfile() { | 27 | resetCurrentProfile() { |
14 | this._currentProfilePromise = this.$q.defer(); | 28 | this._currentProfilePromise = this.$q.defer(); |
15 | } | 29 | } |
@@ -31,7 +45,7 @@ export class ProfileService { | @@ -31,7 +45,7 @@ export class ProfileService { | ||
31 | } | 45 | } |
32 | 46 | ||
33 | getHomePage(profileId: number, params?: any) { | 47 | getHomePage(profileId: number, params?: any) { |
34 | - return this.get(profileId).customGET("home_page", params); | 48 | + return this.getProfileElement(profileId).customGET("home_page", params); |
35 | } | 49 | } |
36 | 50 | ||
37 | getByIdentifier(identifier: string): ng.IPromise<noosfero.Profile> { | 51 | getByIdentifier(identifier: string): ng.IPromise<noosfero.Profile> { |
@@ -45,28 +59,28 @@ export class ProfileService { | @@ -45,28 +59,28 @@ export class ProfileService { | ||
45 | } | 59 | } |
46 | 60 | ||
47 | getProfileMembers(profileId: number, params?: any): restangular.IPromise<any> { | 61 | getProfileMembers(profileId: number, params?: any): restangular.IPromise<any> { |
48 | - return this.get(profileId).customGET("members", params); | 62 | + return this.getProfileElement(profileId).customGET("members", params); |
49 | } | 63 | } |
50 | 64 | ||
51 | getBoxes(profileId: number): restangular.IPromise<any> { | 65 | getBoxes(profileId: number): restangular.IPromise<any> { |
52 | - return this.get(profileId).customGET('boxes'); | 66 | + return this.getProfileElement(profileId).customGET('boxes'); |
53 | } | 67 | } |
54 | 68 | ||
55 | getActivities(profileId: number, params?: any): restangular.IPromise<any> { | 69 | getActivities(profileId: number, params?: any): restangular.IPromise<any> { |
56 | - return this.get(profileId).customGET("activities", params); | 70 | + return this.getProfileElement(profileId).customGET("activities", params); |
57 | } | 71 | } |
58 | 72 | ||
59 | - get(profileId: number): restangular.IElement { | 73 | + getProfileElement(profileId: number): restangular.IElement { |
60 | return this.restangular.one('profiles', profileId); | 74 | return this.restangular.one('profiles', profileId); |
61 | } | 75 | } |
62 | 76 | ||
63 | update(profile: noosfero.Profile) { | 77 | update(profile: noosfero.Profile) { |
64 | let headers = { 'Content-Type': 'application/json' }; | 78 | let headers = { 'Content-Type': 'application/json' }; |
65 | - return this.get(profile.id).customPOST({ profile: profile }, null, null, headers); | 79 | + return this.getProfileElement(profile.id).customPOST({ profile: profile }, null, null, headers); |
66 | } | 80 | } |
67 | 81 | ||
68 | getMembers(profile: noosfero.Profile, params?: any) { | 82 | getMembers(profile: noosfero.Profile, params?: any) { |
69 | - let p = this.get(profile.id); | 83 | + let p = this.getProfileElement(profile.id); |
70 | return p.customGET('members', params); | 84 | return p.customGET('members', params); |
71 | } | 85 | } |
72 | 86 | ||
@@ -83,10 +97,24 @@ export class ProfileService { | @@ -83,10 +97,24 @@ export class ProfileService { | ||
83 | } | 97 | } |
84 | 98 | ||
85 | addMember(person: noosfero.Person, profile: noosfero.Profile) { | 99 | addMember(person: noosfero.Person, profile: noosfero.Profile) { |
86 | - return this.get(profile.id).customPOST({}, "members", null, null); | 100 | + return this.getProfileElement(profile.id).customPOST({}, "members", null, null); |
87 | } | 101 | } |
88 | 102 | ||
89 | removeMember(person: noosfero.Person, profile: noosfero.Profile) { | 103 | removeMember(person: noosfero.Person, profile: noosfero.Profile) { |
90 | - return this.get(profile.id).customDELETE("members", null, null); | 104 | + return this.getProfileElement(profile.id).customDELETE("members", null, null); |
105 | + } | ||
106 | + | ||
107 | + uploadImage(profile: noosfero.Profile, base64ImageJson: any) { | ||
108 | + let headers = { 'Content-Type': 'application/json' }; | ||
109 | + let deferred = this.$q.defer<noosfero.RestResult<noosfero.Profile>>(); | ||
110 | + // TODO dynamically copy the selected attributes to update | ||
111 | + let attributesToUpdate: any = { | ||
112 | + profile: { image_builder: base64ImageJson } | ||
113 | + }; | ||
114 | + let restRequest: ng.IPromise<noosfero.RestResult<any>> = | ||
115 | + this.getProfileElement(profile.id).customPOST(attributesToUpdate, null, null, headers); | ||
116 | + restRequest.then(this.getHandleSuccessFunction(deferred)) | ||
117 | + .catch(this.getHandleErrorFunction(deferred)); | ||
118 | + return deferred.promise; | ||
91 | } | 119 | } |
92 | } | 120 | } |