Commit f2d44586 authored by 神楽坂玲奈's avatar 神楽坂玲奈

Merge branch 'master' of github.com:mycard/mycard-console

parents ed50f74d 3188a486
...@@ -19,7 +19,7 @@ export class AppDetailComponent implements OnInit { ...@@ -19,7 +19,7 @@ export class AppDetailComponent implements OnInit {
async ngOnInit() { async ngOnInit() {
this.route.parent.params this.route.parent.params
.switchMap((params: Params) => this.appService.getApp(params['id'])) .switchMap((params: Params) => this.appService.find(params['id']))
.subscribe(app => { .subscribe(app => {
this.app = app; this.app = app;
}); });
......
...@@ -23,7 +23,7 @@ export class AppLocalesComponent implements OnInit { ...@@ -23,7 +23,7 @@ export class AppLocalesComponent implements OnInit {
async ngOnInit() { async ngOnInit() {
this.route.parent.params this.route.parent.params
.switchMap((params: Params) => this.appService.getApp(params['id'])) .switchMap((params: Params) => this.appService.find(params['id']))
.subscribe(app => { .subscribe(app => {
this.app = app; this.app = app;
this.locales = Object.keys(app.name); this.locales = Object.keys(app.name);
......
...@@ -19,7 +19,7 @@ export class AppPackagesComponent implements OnInit { ...@@ -19,7 +19,7 @@ export class AppPackagesComponent implements OnInit {
async ngOnInit() { async ngOnInit() {
this.route.parent.params this.route.parent.params
.switchMap((params: Params) => this.appService.getApp(params['id'])) .switchMap((params: Params) => this.appService.find(params['id']))
.subscribe(app => { .subscribe(app => {
this.app = app; this.app = app;
}); });
......
...@@ -15,7 +15,7 @@ export class AppComponent implements OnInit { ...@@ -15,7 +15,7 @@ export class AppComponent implements OnInit {
ngOnInit() { ngOnInit() {
this.route.params this.route.params
.switchMap((params: Params) => this.appService.getApp(params['id'])) .switchMap((params: Params) => this.appService.find(params['id']))
.subscribe(app => { .subscribe(app => {
this.app = app; this.app = app;
}); });
......
import {Injectable} from '@angular/core'; import {Injectable} from '@angular/core';
import App from '../models/browserapp'; import App from '../models/browserapp';
import {Http, RequestOptions, Headers} from '@angular/http'; import {Http, RequestOptions, Headers, Response} from '@angular/http';
import 'rxjs/add/operator/toPromise'; import 'rxjs/add/operator/toPromise';
import {Observable} from 'rxjs/Rx';
/** /**
* Created by weijian on 2016/12/30. * Created by weijian on 2016/12/30.
*/ */
function addJsonOptions(options?: RequestOptions): RequestOptions {
if (options) {
options.headers.append('Content-Type', 'application/json');
} else {
let headers = new Headers({'Content-Type': 'application/json'})
options = new RequestOptions({headers: headers});
}
return options;
}
@Injectable() @Injectable()
export class AppService { export class AppService {
constructor(private http: Http) { constructor(private http: Http) {
} }
getApps(): Promise<App[]> { all(): Promise<App[]> {
return this.http.get('http://localhost:8000/apps').map((response) => response.json().map((app: any) => new App(app))).toPromise(); return this.http.get('http://localhost:8000/apps')
.map((response) => {
return response.json().map((app: any) => new App(app));
}).catch(this.handleError)
.toPromise();
} }
getApp(id: string): Promise<App> { handleError(error: Response | any) {
return this.http.get(`http://localhost:8000/apps/${id}`).map((response) => new App(response.json())).toPromise(); // In a real world app, we might use a remote logging infrastructure
let err: Error;
if (error instanceof Response) {
err = error.json() || {};
} else {
err = new Error('Unknown Error');
}
return Observable.throw(err);
} }
save(app: App): Promise<any> { save(app: App): Promise<any> {
let headers = new Headers({'Content-Type': 'application/json'}); let options = addJsonOptions();
let options = new RequestOptions({headers: headers}); return this.http.post(`http://localhost:8000/apps/${app.id}`, app, options)
return this.http.post(`http://localhost:8000/apps/${app.id}`, app, options).map((response) => response.json()).toPromise(); .map((response) => response.json())
.catch(this.handleError)
.toPromise();
} }
update(app: App) { update(app: App) {
let options = addJsonOptions();
return this.http.patch(`http://localhost:8000/apps/${app.id}`, app, options)
.map((response) => response.json())
.catch(this.handleError)
.toPromise();
}
remove(app: App) {
return this.http.delete(`http://localhost:8000/apps/${app.id}`)
.map((response) => response.json())
.catch(this.handleError)
.toPromise();
}
find(id: string): Promise<App> {
return this.http.get(`http://localhost:8000/apps/${id}`)
.map((response) => response.json)
.catch(this.handleError)
.toPromise();
} }
} }
...@@ -22,7 +22,7 @@ export class AppsComponent implements OnInit { ...@@ -22,7 +22,7 @@ export class AppsComponent implements OnInit {
} }
async getApps() { async getApps() {
this.apps = await this.appService.getApps(); this.apps = await this.appService.all();
} }
async create_app() { async create_app() {
......
...@@ -32,6 +32,7 @@ export class Model { ...@@ -32,6 +32,7 @@ export class Model {
static async findOne(query: Object): Promise<any|null> { static async findOne(query: Object): Promise<any|null> {
let collection = await this.getCollection(); let collection = await this.getCollection();
let result = await collection.find(query).limit(1).next(); let result = await collection.find(query).limit(1).next();
console.log(result, query,this.dbName);
if (result) { if (result) {
return new this(result); return new this(result);
} else { } else {
......
...@@ -19,5 +19,9 @@ export class BadRequest extends KoaError { ...@@ -19,5 +19,9 @@ export class BadRequest extends KoaError {
super(msg, 400); super(msg, 400);
} }
} }
export const InternalError = new KoaError(STATUS_CODES[500], 500); export class InternalError extends KoaError {
constructor(public error: Error) {
super(STATUS_CODES[500], 500);
}
}
...@@ -28,7 +28,7 @@ export class App extends Model { ...@@ -28,7 +28,7 @@ export class App extends Model {
async checkExists() { async checkExists() {
let app = await App.findOne({id: this.id}); let app = await App.findOne({id: this.id});
if (app) { if (app) {
throw new ModelExistsError(this.id); throw new ModelExistsError(`App ${this.id} exists`);
} }
} }
......
import {KoaError} from '../koa/errors';
/** /**
* Created by weijian on 2017/1/4. * Created by weijian on 2017/1/4.
*/ */
class ModelError extends Error { export abstract class ModelError extends KoaError {
abstract errCode: string;
constructor(msg: string, status: number) {
super(msg, status);
}
}
export class ModelExistsError extends ModelError {
errCode: string = 'ERROR_MODULE_EXISTS';
constructor(msg: string) { constructor(msg: string) {
super(msg); super(msg, 400);
} }
} }
export class ModelExistsError extends Error { export class ModelInvalidError extends ModelError {
constructor(id: string) { errCode: string = 'ERROR_MODEL_INVALID';
super(`App ${id} already exists`);
constructor(msg: string) {
super(msg, 400);
} }
} }
...@@ -2,10 +2,9 @@ ...@@ -2,10 +2,9 @@
* Created by weijian on 2016/12/28. * Created by weijian on 2016/12/28.
*/ */
import Router = require('koa-router'); import Router = require('koa-router');
import {NotFound, BadRequest, InternalError} from '../koa/errors'; import {NotFound, InternalError} from '../koa/errors';
import {Model} from '../db/mongo';
import {App} from '../models/app'; import {App} from '../models/app';
import {ModelExistsError} from '../models/errors'; import {ModelError, ModelInvalidError} from '../models/errors';
const router = new Router(); const router = new Router();
router.get('/apps', async(ctx, next) => { router.get('/apps', async(ctx, next) => {
...@@ -22,33 +21,39 @@ router.get('/apps/:id', async(ctx, next) => { ...@@ -22,33 +21,39 @@ router.get('/apps/:id', async(ctx, next) => {
}); });
router.post('/apps/:id', async(ctx, next) => { router.post('/apps/:id', async(ctx, next) => {
if (!ctx.request.body.id || ctx.params.id !== ctx.request.body.id) {
throw new ModelInvalidError('App id not same');
}
let app = new App(ctx.request.body); let app = new App(ctx.request.body);
try { try {
ctx.body = await app.save(); ctx.body = await app.save();
} catch (e) { } catch (e) {
if (e instanceof ModelExistsError) { if (e instanceof ModelError) {
throw new BadRequest(`App ${ctx.params.id} already exists`); throw e;
} else { } else {
throw InternalError; throw new InternalError(e);
} }
} }
}); });
router.patch('/apps/:id', async(ctx, next) => { router.patch('/apps/:id', async(ctx, next) => {
let app: App|null = await Model.findOne({id: ctx.params.id}); let app: App|null = await App.findOne({id: ctx.params.id});
if (!app) { if (!app) {
throw new NotFound(`App ${ctx.params.id} Not Found`); throw new NotFound(`App ${ctx.params.id} Not Found`);
} }
if (!ctx.request.body.id || ctx.request.body.id !== app.id) {
throw new ModelInvalidError('Can not change AppID');
}
Object.assign(app, ctx.request.body); Object.assign(app, ctx.request.body);
await app.save(); ctx.body = await app.save();
}); });
router.delete('/apps/:id', async(ctx, next) => { router.delete('/apps/:id', async(ctx, next) => {
let result = await App.remove({id: ctx.params.id}); let result = await App.remove({id: ctx.params.id});
if (!result.deletedCount) { if (!result.result.n) {
throw new NotFound(`App ${ctx.params.id} Not Found`); throw new NotFound(`App ${ctx.params.id} Not Found`);
} }
ctx.body = result; ctx.body = result.result;
}); });
export default router; export default router;
...@@ -26,14 +26,18 @@ app.use(async(ctx, next) => { ...@@ -26,14 +26,18 @@ app.use(async(ctx, next) => {
await next(); await next();
} catch (err) { } catch (err) {
// will only respond with JSON // will only respond with JSON
console.log(err.status);
ctx.status = err.status || 500; ctx.status = err.status || 500;
ctx.body = { ctx.body = {
message: err.message message: err.message,
}; };
if (ctx.response.status >= 400) { if (err.errCode) {
logger.warn(err); ctx.body['errCode'] = err.errCode;
} else if (ctx.response.status >= 500) { }
if (ctx.response.status >= 500) {
logger.error(err); logger.error(err);
} else if (ctx.response.status >= 400) {
logger.warn(err);
} }
} }
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment