diff --git a/rest-io/rest-io-tests.ts b/rest-io/rest-io-tests.ts new file mode 100644 index 0000000000..5f558b77a2 --- /dev/null +++ b/rest-io/rest-io-tests.ts @@ -0,0 +1,18 @@ +/// + +import express = require('express'); +import restIO = require('rest-io'); +import mongoose = require('mongoose'); + +var app = express(); + +// register the express app with rest.io +restIO.restIO(app, { + resources: __dirname + '/resources' +}); + +mongoose.connect('mongodb://localhost:27017/test'); +app.listen(3000, function () { + console.log('Server has started under port: 3000'); +}); +module.exports = app; \ No newline at end of file diff --git a/rest-io/rest-io.d.ts b/rest-io/rest-io.d.ts new file mode 100644 index 0000000000..a2dac465b6 --- /dev/null +++ b/rest-io/rest-io.d.ts @@ -0,0 +1,148 @@ +// Type definitions for rest-io 4.0 +// Project: https://github.com/EnoF/rest-io +// Definitions by: Andy Tang , Stefan Schacherl +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// +/// + + +declare module 'rest-io' { +import {Router, Application, Response, Request} from 'express'; + +import {Mongoose, Schema, Model, Document, Types, Promise} from 'mongoose'; + + function restIO(app: Application, config?: IRestIOConfig): RestIO; + + export interface RestIO { + resource: ResourceModule + } + + export interface IRestIOConfig { + resources: string; + db?: Mongoose; + } + + export interface ResourceModule { + Resource: Resource; + AuthorizedResource: AuthorizedResource; + authorizedResource: AuthorizedResourceModule; + UserResource: UserResource; + SubResource: SubResource; + } + + export class Resource { + baseUrl: string; + url: string; + parameterizedUrl: string; + model: Model; + resDef: IResource; + parentResource: Resource; + router: Router; + app: Application; + db: Mongoose; + paramId: string; + parentRef: string; + populate: string; + + constructor(resDef: IResource); + + createModel(resDef: IResource): Model; + + toClassName(name: string): string; + + setupRoutes(): void; + + getAll(req: Request, res: Response): void; + + buildParentSearch(req: Request): any; + + getById(req: Request, res: Response): void; + + create(req: Request, res: Response): void; + + update(req: Request, res: Response): void; + + del(req: Request, res: Response): void; + + errorHandler(err: Error, res: Response): void; + } + + export interface IResource { + name: string; + model: any; + parentRef?: string; + populate?: string; + plural?: string; + parentResource?: Resource; + } + + export interface AuthorizedResourceModule { + AuthorizedResource: AuthorizedResource + ROLES: Roles + } + + export interface Roles { + USER: string; + SUPER_USER: string; + MODERATOR: string; + ADMIN: string; + } + + export class AuthorizedResource extends Resource { + methodAccess: IMethodAccess; + + maxDays: number; + + permissions: IMethodAccess; + + isTokenExpired(createdAt: Date): boolean; + + getRoles(id: string): Promise; + + hasAuthorizedRole(roles: Array, authorizedRoles: Array): boolean; + + hasAccessRightsDefined(req: Request, authorizedRoles: Array): boolean; + + isAuthorized(req: Request, authorizedRoles: Array): boolean; + + sendUnauthorized(error: Error, res: Response): void; + } + + export interface IMethodAccess { + getAll: Array; + getById: Array; + create: Array; + update: Array; + del: Array; + } + + export class UserResource extends AuthorizedResource { + ensureBaseUserModel(model: any): void; + + createRoleModel(): void; + + isSelf(req: Request): boolean; + + login(req: Request, res: Response): void; + } + + export class SubResource extends Resource { + constructor(resDef: ISubResource); + + createProjectionQuery(req: Request): any; + + createPullQuery(req: Request): any; + + createFindQuery(req: Request): any; + + createSubUpdateQuery(req: Request): any; + } + + export interface ISubResource { + name: string; + plural?: string; + parentResource: Resource; + populate?: string; + } +} \ No newline at end of file