moving http-post to repository

This commit is contained in:
Jochen Saalfeld 2018-11-21 10:49:15 +01:00
parent 0a361665c4
commit 76bfa16232
No known key found for this signature in database
GPG Key ID: 8ACD4E8264B67DF4
2 changed files with 88 additions and 23 deletions

View File

@ -1,14 +1,15 @@
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { MatSnackBar } from '@angular/material';
import { Title } from '@angular/platform-browser';
import { FormGroup, FormBuilder } from '@angular/forms';
import { TranslateService } from '@ngx-translate/core';
import { BaseComponent } from '../../../../base.component'; import { BaseViewComponent } from '../../../../site/base/base-view';
import { ViewportService } from '../../../../core/services/viewport.service';
import { MotionCommentSectionRepositoryService } from '../../services/motion-comment-section-repository.service'; import { MotionCommentSectionRepositoryService } from '../../services/motion-comment-section-repository.service';
import { ViewMotionCommentSection } from '../../models/view-motion-comment-section'; import { ViewMotionCommentSection } from '../../models/view-motion-comment-section';
import { OperatorService } from '../../../../core/services/operator.service'; import { OperatorService } from '../../../../core/services/operator.service';
import { FormGroup, FormBuilder } from '@angular/forms';
import { MotionComment } from '../../../../shared/models/motions/motion-comment'; import { MotionComment } from '../../../../shared/models/motions/motion-comment';
import { ViewMotion } from '../../models/view-motion'; import { ViewMotion } from '../../models/view-motion';
import { HttpService } from '../../../../core/services/http.service';
/** /**
* Component for the motion comments view * Component for the motion comments view
@ -18,7 +19,7 @@ import { HttpService } from '../../../../core/services/http.service';
templateUrl: './motion-comments.component.html', templateUrl: './motion-comments.component.html',
styleUrls: ['./motion-comments.component.scss'] styleUrls: ['./motion-comments.component.scss']
}) })
export class MotionCommentsComponent extends BaseComponent { export class MotionCommentsComponent extends BaseViewComponent {
/** /**
* An array of all sections the operator can see. * An array of all sections the operator can see.
*/ */
@ -39,6 +40,11 @@ export class MotionCommentsComponent extends BaseComponent {
*/ */
private _motion: ViewMotion; private _motion: ViewMotion;
/**
* Set to true if an error was detected to prevent automatic navigation
*/
public error = false;
@Input() @Input()
public set motion(motion: ViewMotion) { public set motion(motion: ViewMotion) {
this._motion = motion; this._motion = motion;
@ -52,15 +58,23 @@ export class MotionCommentsComponent extends BaseComponent {
/** /**
* Watches for changes in sections and the operator. If one of them changes, the sections are reloaded * Watches for changes in sections and the operator. If one of them changes, the sections are reloaded
* and the comments updated. * and the comments updated.
*
* @param commentRepo The repository that handles server communication
* @param formBuilder Form builder to handle text editing
* @param operator service to get the sections
* @param titleService set the browser title
* @param translate the translation service
* @param matSnackBar showing errors and information
*/ */
public constructor( public constructor(
private commentRepo: MotionCommentSectionRepositoryService, private commentRepo: MotionCommentSectionRepositoryService,
private http: HttpService,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
public vp: ViewportService, private operator: OperatorService,
private operator: OperatorService titleService: Title,
translate: TranslateService,
matSnackBar: MatSnackBar
) { ) {
super(); super(titleService, translate, matSnackBar);
this.commentRepo.getViewModelListObservable().subscribe(sections => this.setSections(sections)); this.commentRepo.getViewModelListObservable().subscribe(sections => this.setSections(sections));
this.operator.getObservable().subscribe(() => this.setSections(this.commentRepo.getViewModelList())); this.operator.getObservable().subscribe(() => this.setSections(this.commentRepo.getViewModelList()));
@ -68,6 +82,7 @@ export class MotionCommentsComponent extends BaseComponent {
/** /**
* sets the `sections` member with sections, if the operator has reading permissions. * sets the `sections` member with sections, if the operator has reading permissions.
*
* @param allSections A list of all sections available * @param allSections A list of all sections available
*/ */
private setSections(allSections: ViewMotionCommentSection[]): void { private setSections(allSections: ViewMotionCommentSection[]): void {
@ -77,6 +92,7 @@ export class MotionCommentsComponent extends BaseComponent {
/** /**
* Returns true if the operator has write permissions for the given section, so he can edit the comment. * Returns true if the operator has write permissions for the given section, so he can edit the comment.
*
* @param section The section to judge about * @param section The section to judge about
*/ */
public canEditSection(section: ViewMotionCommentSection): boolean { public canEditSection(section: ViewMotionCommentSection): boolean {
@ -98,6 +114,7 @@ export class MotionCommentsComponent extends BaseComponent {
/** /**
* Puts the comment into edit mode. * Puts the comment into edit mode.
*
* @param section The section for the comment. * @param section The section for the comment.
*/ */
public editComment(section: ViewMotionCommentSection): void { public editComment(section: ViewMotionCommentSection): void {
@ -110,25 +127,27 @@ export class MotionCommentsComponent extends BaseComponent {
/** /**
* Saves the comment. Makes a request to the server. * Saves the comment. Makes a request to the server.
*
* @param section The section for the comment to save * @param section The section for the comment to save
*/ */
public async saveComment(section: ViewMotionCommentSection): Promise<void> { public async saveComment(section: ViewMotionCommentSection): Promise<void> {
const commentText = this.commentForms[section.id].get('comment').value; const commentText = this.commentForms[section.id].get('comment').value;
try { const sectionId = section.id;
await this.http const motionId = this.motion.id;
.post(`rest/motions/motion/${this.motion.id}/manage_comments/`, { await this.commentRepo.saveComment(motionId, sectionId, commentText).then(
section_id: section.id, () => {
comment: commentText this.cancelEditing(section);
}); },
this.cancelEditing(section); error => {
} catch (e) { this.error = true;
console.log(e); this.raiseError(`${error} :"${section.name}"`);
// TODO: Errorhandling }
} );
} }
/** /**
* Cancles the editing for a comment. * Cancles the editing for a comment.
*
* @param section The section for the comment * @param section The section for the comment
*/ */
public cancelEditing(section: ViewMotionCommentSection): void { public cancelEditing(section: ViewMotionCommentSection): void {
@ -137,7 +156,9 @@ export class MotionCommentsComponent extends BaseComponent {
/** /**
* Returns true, if the comment is edited. * Returns true, if the comment is edited.
*
* @param section The section for the comment. * @param section The section for the comment.
* @returns a boolean of the comments is edited
*/ */
public isCommentEdited(section: ViewMotionCommentSection): boolean { public isCommentEdited(section: ViewMotionCommentSection): boolean {
return Object.keys(this.commentForms).includes('' + section.id); return Object.keys(this.commentForms).includes('' + section.id);

View File

@ -7,6 +7,7 @@ import { MotionCommentSection } from '../../../shared/models/motions/motion-comm
import { Group } from '../../../shared/models/users/group'; import { Group } from '../../../shared/models/users/group';
import { Identifiable } from '../../../shared/models/base/identifiable'; import { Identifiable } from '../../../shared/models/base/identifiable';
import { CollectionStringModelMapperService } from '../../../core/services/collectionStringModelMapper.service'; import { CollectionStringModelMapperService } from '../../../core/services/collectionStringModelMapper.service';
import { HttpService } from 'app/core/services/http.service';
/** /**
* Repository Services for Categories * Repository Services for Categories
@ -29,26 +30,49 @@ export class MotionCommentSectionRepositoryService extends BaseRepository<
* Creates a CategoryRepository * Creates a CategoryRepository
* Converts existing and incoming category to ViewCategories * Converts existing and incoming category to ViewCategories
* Handles CRUD using an observer to the DataStore * Handles CRUD using an observer to the DataStore
* @param DataSend *
* @param mapperService Mapper Service for the Collection Strings
* @param DS Service that handles the dataStore
* @param dataSend Service to handle the dataSending
* @param http Service to handle direct http-communication
*/ */
public constructor( public constructor(
protected DS: DataStoreService,
mapperService: CollectionStringModelMapperService, mapperService: CollectionStringModelMapperService,
private dataSend: DataSendService protected DS: DataStoreService,
private dataSend: DataSendService,
private http: HttpService
) { ) {
super(DS, mapperService, MotionCommentSection, [Group]); super(DS, mapperService, MotionCommentSection, [Group]);
} }
/**
* Creates the ViewModel for the MotionComment Section
*
* @param section the MotionCommentSection the View Model should be created of
* @returns the View Model representation of the MotionCommentSection
*/
protected createViewModel(section: MotionCommentSection): ViewMotionCommentSection { protected createViewModel(section: MotionCommentSection): ViewMotionCommentSection {
const read_groups = this.DS.getMany(Group, section.read_groups_id); const read_groups = this.DS.getMany(Group, section.read_groups_id);
const write_groups = this.DS.getMany(Group, section.write_groups_id); const write_groups = this.DS.getMany(Group, section.write_groups_id);
return new ViewMotionCommentSection(section, read_groups, write_groups); return new ViewMotionCommentSection(section, read_groups, write_groups);
} }
/**
* Creates the Comment Section
*
* @param section section to be created
* @returns the promise to create the comment section
*/
public async create(section: MotionCommentSection): Promise<Identifiable> { public async create(section: MotionCommentSection): Promise<Identifiable> {
return await this.dataSend.createModel(section); return await this.dataSend.createModel(section);
} }
/**
* Updates an existion CommentSection
*
* @param section the update that the section should be created on
* @param viewSection the view model representation of that section
*/
public async update(section: Partial<MotionCommentSection>, viewSection?: ViewMotionCommentSection): Promise<void> { public async update(section: Partial<MotionCommentSection>, viewSection?: ViewMotionCommentSection): Promise<void> {
let updateSection: MotionCommentSection; let updateSection: MotionCommentSection;
if (viewSection) { if (viewSection) {
@ -60,7 +84,27 @@ export class MotionCommentSectionRepositoryService extends BaseRepository<
await this.dataSend.updateModel(updateSection); await this.dataSend.updateModel(updateSection);
} }
/**
* Deletes a MotionCommentSection
*
* @param viewSection the view model representation of the model that should be deleted
*/
public async delete(viewSection: ViewMotionCommentSection): Promise<void> { public async delete(viewSection: ViewMotionCommentSection): Promise<void> {
await this.dataSend.deleteModel(viewSection.section); await this.dataSend.deleteModel(viewSection.section);
} }
/**
* Saves a comment made at a MotionCommentSection
*
* @param motionId ID of the Motion
* @param sectionId ID of the Section where the comment was made
* @param sectionComment the comment text
* @returns the promise to create the object
*/
public async saveComment(motionId: number, sectionId: number, sectionComment: String): Promise<object> {
return this.http.post(`rest/motions/motion/${motionId}/manage_comments/`, {
section_id: sectionId,
comment: sectionComment
});
}
} }