diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 0569996..529e65b 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -1,3 +1,4 @@ +import { CreateAuthComponent } from './pages/create-auth/create-auth.component'; import { CreateSlaveComponent } from './pages/create-slave/create-slave.component'; import { EditSlaveComponent } from './pages/edit-slave/edit-slave.component'; import { PasswordComponent } from './pages/password/password.component'; @@ -33,13 +34,29 @@ const routes: Routes = [ component: EditSlaveComponent }, { - path: 'domains/auth/:domainId', - component: EditAuthComponent + path: 'domains/master/:domainId', + component: EditAuthComponent, + data: { type: 'MASTER' } + }, + { + path: 'domains/native/:domainId', + component: EditAuthComponent, + data: { type: 'NATIVE' } }, { path: 'domains/create/slave', component: CreateSlaveComponent }, + { + path: 'domains/create/master', + component: CreateAuthComponent, + data: { type: 'MASTER' } + }, + { + path: 'domains/create/native', + component: CreateAuthComponent, + data: { type: 'NATIVE' } + }, { path: 'password', component: PasswordComponent diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index de148be..04e29ce 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -1,3 +1,4 @@ +import { CreateAuthComponent } from './pages/create-auth/create-auth.component'; import { StopPropagateClickDirective } from './utils/stop-propagate-click.directive'; import { PagesizeComponent } from './partials/pagesize/pagesize.component'; import { PagingComponent } from './partials/paging/paging.component'; @@ -50,7 +51,8 @@ import { CreateSlaveComponent } from './pages/create-slave/create-slave.componen EditAuthComponent, SelectComponent, StopPropagateClickDirective, - CreateSlaveComponent + CreateSlaveComponent, + CreateAuthComponent ], imports: [ BrowserModule, diff --git a/frontend/src/app/datatypes/modal-options.datatype.ts b/frontend/src/app/datatypes/modal-options.datatype.ts index 333147a..4692786 100644 --- a/frontend/src/app/datatypes/modal-options.datatype.ts +++ b/frontend/src/app/datatypes/modal-options.datatype.ts @@ -15,7 +15,7 @@ export class ModalOptionsDatatype { heading: string body: string acceptText: string - dismisText: string, + dismisText?: string, acceptClass?: string }) { Object.assign(this, init); diff --git a/frontend/src/app/operations/domains.operations.ts b/frontend/src/app/operations/domains.operations.ts index 309d963..9e830c2 100644 --- a/frontend/src/app/operations/domains.operations.ts +++ b/frontend/src/app/operations/domains.operations.ts @@ -75,9 +75,32 @@ export class DomainsOperation { } return result; + } catch (e) { + if (e.response.status || e.response.status === 409) { + throw new Error('Domain already exists!'); + } else { + console.error(e); + return new DomainApitype({}); + } + } + } + + public async setSoa(domainId: number, primary: string, email: string, refresh: number, + retry: number, expire: number, ttl: number): Promise { + try { + await this.http.put(['/domains', domainId.toString(), 'soa'], { + primary: primary, + email: email, + refresh: refresh, + retry: retry, + expire: expire, + ttl: ttl + }); + + return true; } catch (e) { console.error(e); - return new DomainApitype({}); + return false; } } } diff --git a/frontend/src/app/pages/create-auth/create-auth.component.html b/frontend/src/app/pages/create-auth/create-auth.component.html new file mode 100644 index 0000000..2289563 --- /dev/null +++ b/frontend/src/app/pages/create-auth/create-auth.component.html @@ -0,0 +1,75 @@ +
+
+

Create {{ type | lowercase }} zone

+
+
+
+
+
+
+ + +
+ Name can not be empty. +
+
+ +
+ + +
+ Primary can not be empty. +
+
+ +
+ + +
+ Must be a valid email address. +
+
+
+ +
+
+ + +
+ Refresh must be positive integer. +
+
+ +
+ + +
+ Retry must be positive integer. +
+
+
+ +
+
+ + +
+ Expire must be positive integer. +
+
+ +
+ + +
+ TTL must be positive integer. +
+
+
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/frontend/src/app/pages/create-auth/create-auth.component.scss b/frontend/src/app/pages/create-auth/create-auth.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/app/pages/create-auth/create-auth.component.ts b/frontend/src/app/pages/create-auth/create-auth.component.ts new file mode 100644 index 0000000..3f6b49d --- /dev/null +++ b/frontend/src/app/pages/create-auth/create-auth.component.ts @@ -0,0 +1,63 @@ +import { ModalOptionsDatatype } from './../../datatypes/modal-options.datatype'; +import { ModalService } from './../../services/modal.service'; +import { DomainsOperation } from './../../operations/domains.operations'; +import { ActivatedRoute, ParamMap, Router } from '@angular/router'; +import { FormGroup, Validators, FormBuilder, AbstractControl, ValidationErrors } from '@angular/forms'; +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/timer'; +import 'rxjs/add/operator/switchMap'; +import 'rxjs/add/operator/map'; +import { fromPromise } from 'rxjs/observable/fromPromise'; + +@Component({ + selector: 'app-create-slave', + templateUrl: './create-auth.component.html', + styleUrls: ['./create-auth.component.scss'] +}) +export class CreateAuthComponent implements OnInit { + + public authForm: FormGroup; + public type: string; + + constructor(private fb: FormBuilder, private route: ActivatedRoute, private domains: DomainsOperation, + private router: Router, private modal: ModalService) { } + + ngOnInit() { + this.createForm(); + + this.route.data.subscribe((data) => this.type = data.type); + } + + private createForm() { + this.authForm = this.fb.group({ + name: ['', Validators.required], + primary: ['', Validators.required], + email: ['', Validators.email], + refresh: ['3600', [Validators.required, Validators.pattern(/^[0-9]+$/)]], + retry: ['900', [Validators.required, Validators.pattern(/^[0-9]+$/)]], + expire: ['604800', [Validators.required, Validators.pattern(/^[0-9]+$/)]], + ttl: ['86400', [Validators.required, Validators.pattern(/^[0-9]+$/)]] + }); + } + + public async onSubmit() { + try { + const v = this.authForm.value; + + const domain = await this.domains.create(v.name, this.type); + + await this.domains.setSoa(domain.id, v.primary, v.email, +v.refresh, +v.retry, +v.expire, +v.ttl); + + this.router.navigate(['/domains/master', domain.id.toString()]); + } catch (e) { + await this.modal.showMessage(new ModalOptionsDatatype({ + heading: 'Error', + body: e.message, + acceptText: 'OK', + dismisText: '', + acceptClass: 'warning' + })); + } + } +} diff --git a/frontend/src/app/pages/create-slave/create-slave.component.ts b/frontend/src/app/pages/create-slave/create-slave.component.ts index b89c785..8a001bb 100644 --- a/frontend/src/app/pages/create-slave/create-slave.component.ts +++ b/frontend/src/app/pages/create-slave/create-slave.component.ts @@ -1,7 +1,9 @@ +import { ModalService } from './../../services/modal.service'; import { DomainsOperation } from './../../operations/domains.operations'; import { ActivatedRoute, ParamMap, Router } from '@angular/router'; import { FormGroup, Validators, FormBuilder } from '@angular/forms'; import { Component, OnInit } from '@angular/core'; +import { ModalOptionsDatatype } from '../../datatypes/modal-options.datatype'; @Component({ selector: 'app-create-slave', @@ -12,7 +14,8 @@ export class CreateSlaveComponent implements OnInit { public slaveForm: FormGroup; - constructor(private fb: FormBuilder, private route: ActivatedRoute, private domains: DomainsOperation, private router: Router) { } + constructor(private fb: FormBuilder, private route: ActivatedRoute, private domains: DomainsOperation, + private router: Router, private modal: ModalService) { } ngOnInit() { this.createForm(); @@ -26,9 +29,20 @@ export class CreateSlaveComponent implements OnInit { } public async onSubmit() { - const v = this.slaveForm.value; - const newDomain = await this.domains.create(v.name, 'SLAVE', v.master); - this.slaveForm.reset(); - this.router.navigate(['/domains/slave', newDomain.id.toString()]); + try { + const v = this.slaveForm.value; + + const newDomain = await this.domains.create(v.name, 'SLAVE', v.master); + + this.router.navigate(['/domains/slave', newDomain.id.toString()]); + } catch (e) { + await this.modal.showMessage(new ModalOptionsDatatype({ + heading: 'Error', + body: e.message, + acceptText: 'OK', + dismisText: '', + acceptClass: 'warning' + })); + } } } diff --git a/frontend/src/app/pages/domains/domains.component.html b/frontend/src/app/pages/domains/domains.component.html index 942e24d..55d6890 100644 --- a/frontend/src/app/pages/domains/domains.component.html +++ b/frontend/src/app/pages/domains/domains.component.html @@ -2,8 +2,8 @@
- - + +
diff --git a/frontend/src/app/pages/domains/domains.component.ts b/frontend/src/app/pages/domains/domains.component.ts index d119c6a..2f6d185 100644 --- a/frontend/src/app/pages/domains/domains.component.ts +++ b/frontend/src/app/pages/domains/domains.component.ts @@ -84,8 +84,10 @@ export class DomainsComponent implements OnInit { public async onDomainClick(domain: DomainApitype) { if (domain.type === 'SLAVE') { this.router.navigate(['/domains/slave/', domain.id.toString()]); - } else if (domain.type === 'MASTER' || domain.type === 'NATIVE') { - this.router.navigate(['/domains/auth/', domain.id.toString()]); + } else if (domain.type === 'MASTER') { + this.router.navigate(['/domains/master/', domain.id.toString()]); + } else if (domain.type === 'NATIVE') { + this.router.navigate(['/domains/native/', domain.id.toString()]); } } diff --git a/frontend/src/app/pages/edit-auth/edit-auth.component.html b/frontend/src/app/pages/edit-auth/edit-auth.component.html index 372e765..caf60e8 100644 --- a/frontend/src/app/pages/edit-auth/edit-auth.component.html +++ b/frontend/src/app/pages/edit-auth/edit-auth.component.html @@ -1,3 +1,3 @@

- edit-auth works! + Zone type: {{ type }}

\ No newline at end of file diff --git a/frontend/src/app/pages/edit-auth/edit-auth.component.ts b/frontend/src/app/pages/edit-auth/edit-auth.component.ts index 8819dcb..6eeff02 100644 --- a/frontend/src/app/pages/edit-auth/edit-auth.component.ts +++ b/frontend/src/app/pages/edit-auth/edit-auth.component.ts @@ -1,3 +1,4 @@ +import { ActivatedRoute } from '@angular/router'; import { Component, OnInit } from '@angular/core'; @Component({ @@ -7,9 +8,12 @@ import { Component, OnInit } from '@angular/core'; }) export class EditAuthComponent implements OnInit { - constructor() { } + public type: string; + + constructor(private route: ActivatedRoute) { } ngOnInit() { + this.route.data.subscribe((data) => this.type = data.type); } } diff --git a/frontend/src/app/partials/modal-container/modal-container.component.html b/frontend/src/app/partials/modal-container/modal-container.component.html index f07a8dd..739fafc 100644 --- a/frontend/src/app/partials/modal-container/modal-container.component.html +++ b/frontend/src/app/partials/modal-container/modal-container.component.html @@ -8,7 +8,7 @@

{{options.body}}