UNPKG

20.2 kBSource Map (JSON)View Raw
1{"version":3,"file":"naker-naco.js.map","sources":["ng://@naker/naco/domains/values/config.ts","ng://@naker/naco/domains/models/user.ts","ng://@naker/naco/domains/services/naco.service.ts","ng://@naker/naco/domains/values/signature.ts","ng://@naker/naco/guards/authenticated.guard.ts","ng://@naker/naco/interceptors/auth.interceptor.ts","ng://@naker/naco/factories/naco-factory.ts","ng://@naker/naco/views/pages/auth.page.ts","ng://@naker/naco/views/routes.ts","ng://@naker/naco/views/module.ts","ng://@naker/naco/naco.module.ts"],"sourcesContent":["export class Config {\n public endpoint: string = 'https://account.kemnaker.go.id';\n public clientId: string;\n\n public constructor(data?: Partial<Config>) {\n Object.assign(this, data);\n }\n}\n","import { forwardRef } from '@angular/core';\nimport { Type } from 'class-transformer';\n\nexport class User {\n public id: string;\n public username: string;\n public email?: string;\n public name: string;\n public status: number;\n\n @Type(forwardRef(() => Date) as any)\n public updatedAt: Date;\n}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Storage } from '@ubud/storage';\nimport { Config } from '../values/config';\nimport { User } from '../models/user';\nimport { Observable, of } from 'rxjs';\nimport { Signature } from '../values/signature';\nimport { fromPromise } from 'rxjs/internal/observable/fromPromise';\nimport { map, switchMap } from 'rxjs/internal/operators';\nimport { plainToClass } from 'class-transformer';\nimport { HttpClient } from '@angular/common/http';\n\n@Injectable()\nexport class NacoService {\n public readonly VERSION = 'v1';\n\n private signature: Signature | null = null;\n private user: User | null = null;\n\n public constructor(private config: Config, private router: Router, private storage: Storage, private http: HttpClient) {\n }\n\n public getUser(): Observable<User | null> {\n if (null !== this.user) {\n return of(this.user);\n }\n\n return fromPromise(this.storage.get('user')).pipe(\n switchMap((user: User | null) => {\n if (null !== user) {\n return of(user);\n }\n\n const uri = this.config.endpoint + '/api/' + this.VERSION + '/users/me';\n\n return fromPromise(this.getSignature()).pipe(\n switchMap((signature: Signature | null) => {\n if (null === signature) {\n return of(null);\n }\n\n const options = {\n headers: {\n Authorization: `${signature.type} ${signature.token}`,\n },\n };\n\n return this.http.get<any>(uri, options).pipe(\n map((res: any) => {\n if (res.data) {\n return res.data;\n }\n\n throw new Error('There are no body to be transformed');\n }),\n map((data: any) => {\n const authUser = plainToClass(User, data);\n\n this.storage.set('user', authUser);\n\n return authUser;\n }),\n );\n }),\n );\n }),\n );\n }\n\n public getSignature(): Promise<Signature | null> {\n if (null !== this.signature) {\n return Promise.resolve(this.signature);\n }\n\n return this.storage.get('signature');\n }\n\n public setSignature(signature: Signature): void {\n this.signature = signature;\n this.storage.set('signature', signature);\n }\n\n public login(scopes: string, redirectUri?: string): string {\n if (!redirectUri) {\n redirectUri = this.router.url;\n }\n\n const state = this.generateState();\n\n this.storage.set('state', state);\n\n const query: string = this.buildQueryString(\n {\n 'response_type': 'token',\n 'scopes': scopes,\n 'client': this.config.clientId,\n 'state': state,\n 'continue': redirectUri,\n },\n );\n\n return this.config.endpoint + '/auth?' + query;\n }\n\n public logout(redirectUri?: string): Promise<string> {\n this.signature = null;\n this.user = null;\n\n return new Promise(resolve => {\n Promise.all([\n this.storage.remove('signature'),\n this.storage.remove('user'),\n ]).then(() => {\n let endpoint = this.config.endpoint + '/auth/logout';\n\n if (redirectUri) {\n endpoint += '?continue=' + redirectUri;\n }\n\n resolve(endpoint);\n });\n });\n }\n\n public getState() {\n return this.storage.get('state');\n }\n\n private generateState(): string {\n const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let text = '';\n\n for (let i = 0; i < 5; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return text;\n }\n\n private buildQueryString(params: object): string {\n const queryParams = Object.keys(params).map((key: string) => {\n return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);\n });\n\n return queryParams.join('&');\n }\n}\n","export class Signature {\n public expiresIn: number;\n public token: string;\n public type: string;\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, CanActivateChild } from '@angular/router';\nimport { NacoService } from '../domains/services/naco.service';\nimport { first, map } from 'rxjs/internal/operators';\nimport { User } from '../domains/models/user';\nimport { Observable } from 'rxjs';\nimport { Storage } from '@ubud/storage';\n\n@Injectable()\nexport class AuthenticatedGuard implements CanActivate, CanActivateChild {\n public constructor(private service: NacoService, private storage: Storage) {\n }\n\n public canActivate(): Observable<boolean> {\n return this.service.getUser().pipe(\n first(),\n map((user: User | null) => {\n if (null === user) {\n let redirectUri = document.location.protocol + '//' + document.location.hostname;\n\n if (document.location.port) {\n redirectUri += ':' + document.location.port;\n }\n\n this.storage.set('naco_intended_url', window.location.href).then(() => {\n window.location.href = this.service.login(\n 'basic email',\n redirectUri + '/auth',\n );\n });\n }\n\n return !!user;\n }),\n );\n }\n\n public canActivateChild(): Observable<boolean> {\n return this.canActivate();\n }\n}\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { NacoService } from '../domains/services/naco.service';\nimport { fromPromise } from 'rxjs/internal/observable/fromPromise';\nimport { Signature } from '../domains/values/signature';\nimport { catchError, switchMap } from 'rxjs/internal/operators';\nimport { ErrorObservable } from 'rxjs-compat/observable/ErrorObservable';\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n public constructor(private naco: NacoService) {\n }\n\n public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n return fromPromise(this.naco.getSignature()).pipe(\n switchMap((signature: Signature | null) => {\n if (!signature) {\n return next.handle(req);\n }\n\n return next\n .handle(\n req.clone({\n setHeaders: {\n Authorization: `${signature.type} ${signature.token}`,\n },\n }),\n )\n .pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401) {\n // TODO: Refresh token\n }\n\n return ErrorObservable.create(error);\n }),\n );\n }),\n );\n }\n}\n","import { NacoService } from '../domains/services/naco.service';\nimport { Config } from '../domains/values/config';\nimport { Router } from '@angular/router';\nimport { Storage } from '@ubud/storage';\nimport { InjectionToken } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nexport function nacoFactory(config: object, router: Router, storage: Storage, http: HttpClient) {\n return new NacoService(\n new Config({ ...config }),\n router,\n storage,\n http\n );\n}\n\nexport const NACO_CONFIG = new InjectionToken<object>('NACO_CONFIG');\n","import { Component } from '@angular/core';\nimport { ActivatedRoute, Params } from '@angular/router';\nimport { NacoService } from '../../domains/services/naco.service';\nimport { Signature } from '../../domains/values/signature';\nimport { User } from '../../domains/models/user';\nimport { Storage } from '@ubud/storage';\n\n@Component({\n selector: 'naker-auth-page',\n template: '{{ message }}',\n})\nexport class AuthPage {\n public message: string = 'Authenticating...';\n\n public constructor(private route: ActivatedRoute, private naco: NacoService, private storage: Storage) {\n this.route.queryParams.subscribe((params: Params) => this.handle(params));\n }\n\n public handle(params: Params): void {\n if (params.state) {\n this.naco.getState().then((state: string | null) => {\n if (state !== params.state) {\n this.message = 'Invalid CSRF';\n\n return;\n }\n\n this.authenticate(params);\n });\n } else {\n this.authenticate(params);\n }\n }\n\n private authenticate(params: Params): void {\n const signature: Signature = {\n expiresIn: params.expires_in,\n type: params.token_type,\n token: params.access_token,\n };\n\n this.naco.setSignature(signature);\n\n this.naco.getUser().subscribe((user: User | null) => {\n if (null !== user) {\n this.storage.get('naco_intended_url').then((url: any) => {\n window.location.href = url ? url : '/';\n });\n\n return;\n }\n\n this.message = 'Unauthenticated!';\n });\n }\n}\n\n","import { ModuleWithProviders } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { AuthPage } from './pages/auth.page';\n\nconst routes: Routes = [\n {\n path: 'auth',\n component: AuthPage\n },\n];\n\nexport const AUTH_ROUTING: ModuleWithProviders = RouterModule.forChild(routes);\n","import { NgModule } from '@angular/core';\nimport { AUTH_ROUTING } from './routes';\nimport { AuthPage } from './pages/auth.page';\n\n@NgModule({\n imports: [\n AUTH_ROUTING,\n ],\n declarations: [\n AuthPage,\n ],\n})\nexport class NacoViewModule {\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { NacoService } from './domains/services/naco.service';\nimport { AuthenticatedGuard } from './guards/authenticated.guard';\nimport { NACO_CONFIG, nacoFactory } from './factories/naco-factory';\nimport { Router } from '@angular/router';\nimport { Storage, UbudStorageModule } from '@ubud/storage';\nimport { NacoViewModule } from './views/module';\nimport { HttpClient } from '@angular/common/http';\n\n@NgModule({\n imports: [\n UbudStorageModule,\n NacoViewModule,\n ],\n})\nexport class NacoModule {\n public static forRoot(config: { clientId: string, endpoint?: string }): ModuleWithProviders {\n return {\n ngModule: NacoModule,\n providers: [\n {\n provide: NACO_CONFIG,\n useValue: config,\n },\n {\n provide: NacoService,\n useFactory: nacoFactory,\n deps: [NACO_CONFIG, Router, Storage, HttpClient],\n },\n AuthenticatedGuard,\n ],\n };\n }\n}\n"],"names":[],"mappings":"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"}