Skip to content

fully set up #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 3, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# rest-api-with-hapi-typescript-tsoa-prisma-and-postgresql

This is a church office management REST api built with Hapi js, TypeScript Open API (TSOA) library, Prisma ORM and Postgresql. With Unit tests and End-toEnd tests.
This is a church office management REST api built with Hapi js, TypeScript, Prisma ORM and Postgresql. With Unit tests and End-toEnd tests.

It has an auto generated documentation with OpenAPI v3 specification, courtesy of TSOA.
It is an example of how to modularize / structure hapi API implementation into controllers and services. Good separation of concerns for ease of maintenance for large projects, and type safety, courtesy of typescript.
69 changes: 69 additions & 0 deletions dist/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.appInstance = void 0;
const Hapi = __importStar(require("@hapi/hapi"));
const attendanceSumRoutes_1 = __importDefault(require("./attendance-sum/attendanceSumRoutes"));
const attendanceRoutes_1 = __importDefault(require("./attendance/attendanceRoutes"));
const inventoryRoutes_1 = __importDefault(require("./inventory/inventoryRoutes"));
const offeringRecordsRoutes_1 = __importDefault(require("./offering-records/offeringRecordsRoutes"));
const teachingsRoutes_1 = __importDefault(require("./teachings/teachingsRoutes"));
const titheRecordsRoutes_1 = __importDefault(require("./tithe-records/titheRecordsRoutes"));
const usersRoutes_1 = __importDefault(require("./users/usersRoutes"));
class App {
constructor() {
}
// function to initialize the server after routes have been registered
init() {
// set up server
this.theApp = Hapi.server({
port: process.env.PORT || 3000,
host: process.env.HOST || '0.0.0.0',
});
// register routes
this.theApp.register([
attendanceRoutes_1.default,
attendanceSumRoutes_1.default,
inventoryRoutes_1.default,
offeringRecordsRoutes_1.default,
teachingsRoutes_1.default,
titheRecordsRoutes_1.default,
usersRoutes_1.default
]).then(() => {
console.log("Route(s) have been registered");
});
// initialize app with routes
this.theApp.initialize().then(() => {
console.log("The app has been initialized");
});
}
// Function to start the server for the main application or for tests
start() {
this.theApp.start().then(() => {
console.log(`Server running at: ${this.theApp.info.uri}`);
});
}
}
// create singleton for use in main app or for tests.
exports.appInstance = new App();
2 changes: 2 additions & 0 deletions dist/attendance-sum/attendance-sum.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
85 changes: 85 additions & 0 deletions dist/attendance-sum/attendanceSumController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AttendanceSumController = void 0;
const attendanceSumService_1 = require("./attendanceSumService");
const boom_1 = __importDefault(require("@hapi/boom"));
class AttendanceSumController {
create(request, h) {
return __awaiter(this, void 0, void 0, function* () {
try {
const requestBody = request.payload;
const result = yield new attendanceSumService_1.AttendanceSumService().create(requestBody);
return h.response(result).code(201);
}
catch (error) {
request.log("error", error);
return boom_1.default.badImplementation(JSON.stringify(error));
}
});
}
getAll(request, h) {
return __awaiter(this, void 0, void 0, function* () {
try {
const result = yield new attendanceSumService_1.AttendanceSumService().getAll();
return h.response(result).code(200);
}
catch (error) {
request.log("error", error);
return boom_1.default.badImplementation(JSON.stringify(error));
}
});
}
getById(request, h) {
return __awaiter(this, void 0, void 0, function* () {
try {
const id = +request.params.id;
const result = yield new attendanceSumService_1.AttendanceSumService().getById(id);
return h.response(result).code(200);
}
catch (error) {
request.log("error", error);
return boom_1.default.badImplementation(JSON.stringify(error));
}
});
}
update(request, h) {
return __awaiter(this, void 0, void 0, function* () {
try {
const id = +request.params.id;
const requestBody = request.payload;
const result = yield new attendanceSumService_1.AttendanceSumService().update(requestBody, id);
return h.response(result).code(200);
}
catch (error) {
request.log("error", error);
return boom_1.default.badImplementation(JSON.stringify(error));
}
});
}
delete(request, h) {
return __awaiter(this, void 0, void 0, function* () {
try {
const id = +request.params.id;
const result = yield new attendanceSumService_1.AttendanceSumService().delete(id);
return h.response(result).code(200);
}
catch (error) {
request.log("error", error);
return boom_1.default.badImplementation(JSON.stringify(error));
}
});
}
}
exports.AttendanceSumController = AttendanceSumController;
48 changes: 48 additions & 0 deletions dist/attendance-sum/attendanceSumRoutes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const attendanceSumController_1 = require("./attendanceSumController");
// create instance of controller
const controller = new attendanceSumController_1.AttendanceSumController();
// configure the routes
const attendanceSumRoutes = {
name: "attendance-sum",
register: (server) => __awaiter(void 0, void 0, void 0, function* () {
server.route([
{
method: 'POST',
path: '/attendance-sum',
handler: controller.create
},
{
method: 'GET',
path: '/attendance-sum',
handler: controller.getAll
},
{
method: 'GET',
path: '/attendance-sum/{id}',
handler: controller.getById
},
{
method: 'PUT',
path: '/attendance-sum/{id}',
handler: controller.update
},
{
method: 'DELETE',
path: '/attendance-sum/{id}',
handler: controller.delete
}
]);
})
};
exports.default = attendanceSumRoutes;
105 changes: 105 additions & 0 deletions dist/attendance-sum/attendanceSumService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AttendanceSumService = void 0;
const client_1 = require("@prisma/client");
class AttendanceSumService {
constructor() {
this.prisma = new client_1.PrismaClient();
}
create(theDto) {
return __awaiter(this, void 0, void 0, function* () {
try {
return yield this.prisma.attendanceSum.create({
data: {
eventName: theDto.eventName,
date: theDto.date,
totalChildren: theDto.totalChildren,
totalFemale: theDto.totalFemale,
totalMale: theDto.totalMale
}
});
}
catch (error) {
console.log(error);
}
finally {
yield this.prisma.$disconnect();
}
});
}
getById(id) {
return __awaiter(this, void 0, void 0, function* () {
try {
return yield this.prisma.attendanceSum.findUnique({
where: {
id
}
});
}
catch (error) {
console.log(error);
}
finally {
yield this.prisma.$disconnect();
}
});
}
getAll() {
return __awaiter(this, void 0, void 0, function* () {
try {
return yield this.prisma.attendanceSum.findMany();
}
catch (error) {
console.log(error);
}
finally {
yield this.prisma.$disconnect();
}
});
}
update(theDto, id) {
return __awaiter(this, void 0, void 0, function* () {
try {
return yield this.prisma.attendanceSum.update({
where: {
id: id
},
data: Object.assign({}, theDto)
});
}
catch (error) {
console.log(error);
}
finally {
yield this.prisma.$disconnect();
}
});
}
delete(id) {
return __awaiter(this, void 0, void 0, function* () {
try {
return yield this.prisma.attendanceSum.delete({
where: {
id
}
});
}
catch (error) {
console.log(error);
}
finally {
yield this.prisma.$disconnect();
}
});
}
}
exports.AttendanceSumService = AttendanceSumService;
2 changes: 2 additions & 0 deletions dist/attendance/attendance.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Loading