Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
Commits on Source (2)
# Course API
## Get All Course Data
- Endpoint: `/course`
- Endpoint: `/course/[?facultyId=<facultyId>&majorId=<majorId>&curriculumYear=<curriculumYear>]`
- HTTP Method: `GET`
- Response Body (Success):
```
[
{
"id": "517c210a-f35e-4978-ba9f-e38a6addccbd",
"code": "IF5122",
"name": "Pembangunan Perangkat Lunak",
"id": "2c8595c3-c402-4852-8df9-214a308e65b9",
"code": "IF5124",
"name": "Kualitas Perangkat Lunak",
"type": "WAJIB",
"credits": 2,
"defaultSemester": 2,
"shortSyllabus": "Review SDLC dan software methodology, agile methodology, OOAD, Design principles, Component design, Configuration management, Continous integration, Service oriented Design, Code Inspection and Code Review",
"completeSyllabus": "Pada kuliah ini mahasiswa dibekali dengan prinsip design perangkat lunak yang “baik”, dan menerapkan proses pembangunan (konstruksi) perangkat lunak dalam team, sesuai dengan praktik yang diterapkan di industri dan tools yang banyak digunakan. Topik yang dicakup adalah : Review SDLC dan software methodology, agile methodology, OOAD, Design principles, Component design, Configuration management, Continous integration, Service oriented Design, Code Inspection and Code Review.",
"completeSyllabus": "Pada kuliah ini mahasiswa dibekali dengan prinsip design perangkat lunak yang “baik”, dan menerapkan proses pembangunan (konstruksi) perangkat lunak dalam team, sesuai dengan praktik yang diterapkan di industri dan tools yang banyak digunakan.",
"outcomes": "Mahasiswa mampu untuk menerapkan prinsip design dalam membangun perangkat lunak, dan membangun perangkat lunak sesuai praktik yang baik (studi kasus).",
"curriculumYear": 2013,
"createdAt": "2021-02-26T08:00:29.228Z",
"updatedAt": "2021-02-26T08:00:29.228Z",
"majorId": "e4a4753d-0413-4494-8c92-35d0dab531a4"
},
{
"id": "197308bd-5031-4acf-9c68-f5508e790c34",
"code": "IF3250",
"name": "Proyek Perangkat Lunak",
"type": "WAJIB",
"credits": 4,
"defaultSemester": 6,
"shortSyllabus": "Kuliah ini memberikan gambaran kompleksitas dan pengalaman mengenai pengembangan perangkat lunak skala besar.",
"completeSyllabus": "Definisi perangkat lunak skala besar; berbagai masalah dalam pengembangan perangkat lunak skala besar dan solusinya; abstraksi; SW Pattern; code generator; pengenalan berbagai platform, framework, dan tools; konfigurasi P/L (konsep, tools, practices...); dilengkapi dengan studi kasus berupa proyek pembangunan P/L skala besar dengan mempraktekkan semua teori yang telah diberikan, atau berupa reverse engineering suatu perangkat lunak skala besar untuk mendapatkan modelnya; ",
"outcomes": "1. Memahami definisi P/L skala besar serta berbagai persoalan pengembangan P/L skala besar\n 2. Memahami teknik/metoda terkait dengan pembangunan P/L skala besar, seperti manajemen konfigurasi P/L",
"curriculumYear": 2019,
"createdAt": "2021-02-26T08:00:29.228Z",
"updatedAt": "2021-02-26T08:00:29.228Z",
"majorId": "708d0497-b2fa-432f-9744-1fe00d728694"
"createdAt": "2021-04-13T19:51:51.737Z",
"updatedAt": "2021-04-13T19:51:51.737Z",
"majorId": "10ee3421-21da-46ca-bb2d-c65c9d76b2db",
"Major": {
"id": "10ee3421-21da-46ca-bb2d-c65c9d76b2db",
"numberCode": 235,
"name": "Magister Teknik Informatika",
"createdAt": "2021-04-09T14:56:55.279Z",
"updatedAt": "2021-04-09T14:56:55.279Z",
"facultyId": "caf88945-21c7-475a-8ad9-fe1779aa0a11",
"Faculty": {
"id": "caf88945-21c7-475a-8ad9-fe1779aa0a11",
"shortName": "STEI",
"fullName": "Sekolah Teknik Elektro dan Informatika",
"createdAt": "2021-04-09T14:56:55.184Z",
"updatedAt": "2021-04-09T14:56:55.184Z"
}
},
"courseS2": []
},
{
"id": "a406659a-b83d-43ea-84f7-29beb43e4867",
"code": "IF5010",
"name": "Sistem & Arsitektur Komputer A",
"id": "e1b53710-b8f2-4564-b326-c7f74de81aa2",
"code": "IF2036",
"name": "Rekayasa Perangkat Lunak",
"type": "WAJIB",
"credits": 2,
"defaultSemester": 1,
"shortSyllabus": "Memberikan pengetahuan tentang riset dan teknologi sistem arsitektur komputer terkini.",
"completeSyllabus": "Pembahasan yg lebih dalam dan lanjut tentang modern microprocessors and computer systems, akan dibahas antara lain: Hirarki memory (cache memory, virtual memory, memory management), Instruksi Pipelining.",
"outcomes": "Mahasiswa diharapkan mampu memahami pengetahuan tentang riset dan teknologi sistem arsitektur komputer.",
"curriculumYear": 2013,
"createdAt": "2021-02-26T08:00:29.228Z",
"updatedAt": "2021-02-26T08:00:29.228Z",
"majorId": "e4a4753d-0413-4494-8c92-35d0dab531a4"
},
{
"id": "fd751303-002f-4b66-b99b-4f837228c36a",
"code": "IF6012",
"name": "Arsitektur Komputer Lanjut",
"type": "PILIHAN",
"credits": 3,
"defaultSemester": null,
"shortSyllabus": "Membahas aspek kuantitatif dan kualitatif dari desain arsitektur komputer.",
"completeSyllabus": "Dasar Desain Komputer, Instruction level parallelism, limits on ILP, multi processor dan thread level parallelism, memory hierarchy design, storage systems.",
"outcomes": "1. Siswa mampu memahami prinsip dasar arsitektur komputer modern.\n 2. Memahami design tradeoff pada arsitektur komputer.",
"defaultSemester": 2,
"shortSyllabus": "Review SDLC dan software methodology, agile methodology, OOAD, Design principles, Component design, Configuration management, Continous integration, Service oriented Design, Code Inspection and Code Review",
"completeSyllabus": "Pada kuliah ini mahasiswa dibekali dengan prinsip design perangkat lunak yang “baik”, dan menerapkan proses pembangunan (konstruksi) perangkat lunak dalam team, sesuai dengan praktik yang diterapkan di industri dan tools yang banyak digunakan.",
"outcomes": "Mahasiswa mampu untuk menerapkan prinsip design dalam membangun perangkat lunak, dan membangun perangkat lunak sesuai praktik yang baik (studi kasus).",
"curriculumYear": 2013,
"createdAt": "2021-02-26T08:00:29.228Z",
"updatedAt": "2021-02-26T08:00:29.228Z",
"majorId": "e4a4753d-0413-4494-8c92-35d0dab531a4"
"createdAt": "2021-04-09T15:23:13.444Z",
"updatedAt": "2021-04-13T19:16:53.968Z",
"majorId": null,
"Major": null,
"courseS2": []
},
{
"id": "ccc45a58-0aa2-4edb-8e9e-e20761684d71",
"code": "IF6099",
"name": "Tesis",
"id": "e2239de2-afe4-4c99-96ce-2affbfefa259",
"code": "IF5124",
"name": "Kualitas Perangkat Lunak",
"type": "WAJIB",
"credits": 6,
"defaultSemester": 3,
"shortSyllabus": "Kuliah ini berisi representasi proyek akhir mahasiswa atau Tesis yang bertujuan mengintegrasikan materi yang sudah didapat di perkuliahan.",
"completeSyllabus": "Menjelaskan dan mengaplikasikan teori, metode, teknik yang relavan pada suatu area yang dipilih, menginterpretasikan data, dan mengambil suatu konklusi/kesimpulan serta saran yang sesuai.",
"outcomes": "Mahasiswa diharapkan mampu menghasilkan tesis, dan menuliskan sebuah publikasi ilmiah",
"credits": 2,
"defaultSemester": 2,
"shortSyllabus": "Review SDLC dan software methodology, agile methodology, OOAD, Design principles, Component design, Configuration management, Continous integration, Service oriented Design, Code Inspection and Code Review",
"completeSyllabus": "Pada kuliah ini mahasiswa dibekali dengan prinsip design perangkat lunak yang “baik”, dan menerapkan proses pembangunan (konstruksi) perangkat lunak dalam team, sesuai dengan praktik yang diterapkan di industri dan tools yang banyak digunakan.",
"outcomes": "Mahasiswa mampu untuk menerapkan prinsip design dalam membangun perangkat lunak, dan membangun perangkat lunak sesuai praktik yang baik (studi kasus).",
"curriculumYear": 2013,
"createdAt": "2021-02-26T08:00:29.228Z",
"updatedAt": "2021-02-26T08:00:29.228Z",
"majorId": "e4a4753d-0413-4494-8c92-35d0dab531a4"
},
{
"id": "592e1dea-12b7-449e-befb-b097e7696b57",
"code": "IF2036",
"name": "Rekayasa Perangkat Lunak",
"type": "WAJIB",
"credits": 3,
"defaultSemester": 4,
"shortSyllabus": "Konsep dasar, daur hidup, dan tahapan rekayasa perangkat lunak (analisis, perancangan, konstruksi, pengujian, dan perawatan), berdasarkan dua metode utama: metode konvensional (terstruktur) dan metode berorientasi objek, dilengkapi studi kasus pada tahap analisis dan perancangan.",
"completeSyllabus": "Materi yang diberikan meliputi tahapan rekayasa perangkat lunak yang terdiri dari analisis, pearncangan, konstruksi, pengujian, dan perawatan, dengan memberikan gambaran dua metode, yaitu metode konvensional (terstruktur) dan metode berorientasi objek, dan dilengkapi dengan studi kasus untuk memberikan pemahaman yang lebih baik terutama pada tahap analisis dan perancangan perangkat lunak.",
"outcomes": null,
"curriculumYear": 2019,
"createdAt": "2021-02-26T08:00:29.228Z",
"updatedAt": "2021-02-26T08:00:29.228Z",
"majorId": "708d0497-b2fa-432f-9744-1fe00d728694"
"createdAt": "2021-04-13T19:50:56.955Z",
"updatedAt": "2021-04-13T19:50:56.955Z",
"majorId": "10ee3421-21da-46ca-bb2d-c65c9d76b2db",
"Major": {
"id": "10ee3421-21da-46ca-bb2d-c65c9d76b2db",
"numberCode": 235,
"name": "Magister Teknik Informatika",
"createdAt": "2021-04-09T14:56:55.279Z",
"updatedAt": "2021-04-09T14:56:55.279Z",
"facultyId": "caf88945-21c7-475a-8ad9-fe1779aa0a11",
"Faculty": {
"id": "caf88945-21c7-475a-8ad9-fe1779aa0a11",
"shortName": "STEI",
"fullName": "Sekolah Teknik Elektro dan Informatika",
"createdAt": "2021-04-09T14:56:55.184Z",
"updatedAt": "2021-04-09T14:56:55.184Z"
}
},
"courseS2": []
}
]
```
......@@ -236,6 +225,33 @@
}
```
- Request Body (import from previous course):
```json
{
"previousId": "e2239de2-afe4-4c99-96ce-2affbfefa259",
"curriculumYear": 2019
}
```
- Response Body (import from previous course):
```json
{
"id": "2c8595c3-c402-4852-8df9-214a308e65b9",
"code": "IF5124",
"name": "Kualitas Perangkat Lunak",
"type": "WAJIB",
"credits": 2,
"defaultSemester": 2,
"shortSyllabus": "Review SDLC dan software methodology, agile methodology, OOAD, Design principles, Component design, Configuration management, Continous integration, Service oriented Design, Code Inspection and Code Review",
"completeSyllabus": "Pada kuliah ini mahasiswa dibekali dengan prinsip design perangkat lunak yang “baik”, dan menerapkan proses pembangunan (konstruksi) perangkat lunak dalam team, sesuai dengan praktik yang diterapkan di industri dan tools yang banyak digunakan.",
"outcomes": "Mahasiswa mampu untuk menerapkan prinsip design dalam membangun perangkat lunak, dan membangun perangkat lunak sesuai praktik yang baik (studi kasus).",
"curriculumYear": 2019,
"majorId": "10ee3421-21da-46ca-bb2d-c65c9d76b2db",
"updatedAt": "2021-04-13T19:51:51.737Z",
"createdAt": "2021-04-13T19:51:51.737Z"
}
```
- Response Body (Failure):
```json
{
......
......@@ -10,12 +10,19 @@ const { NotExistError } = require('../util/error');
const {
createCourse,
updateCourse
updateCourse,
getAllCourses
} = require('../util/db/course');
exports.getAllCourseData = async (req, res) => {
let courses = await Course.findAll();
res.json(courses);
try {
const { opts } = req.body;
const courses = await getAllCourses(opts);
res.json(courses);
} catch (error) {
handleRequestWithInternalServerError(res, error);
}
};
exports.getCourseData = async (req, res) => {
......
......@@ -13,10 +13,17 @@ const {
const { getOption } = require('../util/db/option');
const { getCourse } = require('../util/db/course');
const {
CourseS2,
Major,
Faculty
} = require('../models/index');
const createCourseMiddleware = async (req, res, next) => {
let newCourse;
let {
previousId,
code,
name,
type,
......@@ -32,6 +39,29 @@ const createCourseMiddleware = async (req, res, next) => {
try {
if (previousId) {
checkRequiredParameter({curriculumYear});
const previousCourse = await getCourse({
where: {
id: previousId
},
include: [{
model: CourseS2,
as: 'courseS2'
}]
});
code = previousCourse.code;
name = previousCourse.name;
type = previousCourse.type;
credits = previousCourse.credits;
defaultSemester = previousCourse.defaultSemester;
shortSyllabus = previousCourse.shortSyllabus;
completeSyllabus = previousCourse.completeSyllabus;
outcomes = previousCourse.outcomes;
majorId = previousCourse.majorId;
optionId = previousCourse.courseS2.optionId;
}
checkRequiredParameter({ code, name, type, credits, curriculumYear });
checkRequiredParameter({
oneOf: {
......@@ -167,7 +197,58 @@ const updateCourseMiddleware = async (req, res, next) => {
}
};
const getAllCoursesMiddleware = async (req, res, next) => {
const {
facultyId,
majorId,
curriculumYear
} = req.query;
let opts = {
where: {},
include: []
};
if (curriculumYear) {
opts.where.curriculumYear = curriculumYear;
}
if (facultyId) {
opts.include = [{
model: Major,
include:[{
model: Faculty,
where: {
id: facultyId
}
}]
}];
}
if (majorId) {
opts.include = [{
model: Major,
where: {
id: majorId
}
}];
}
opts.include.push(
{
model: CourseS2,
as: 'courseS2',
},
);
req.body.opts = opts;
next();
};
module.exports = {
createCourseMiddleware,
updateCourseMiddleware
updateCourseMiddleware,
getAllCoursesMiddleware
}
\ No newline at end of file
......@@ -5,10 +5,12 @@ var courseController = require('../controllers/course');
const {
createCourseMiddleware,
updateCourseMiddleware
updateCourseMiddleware,
getAllCoursesMiddleware
} = require('../middleware/course');
// GET request to get all faculty data
router.get('/', getAllCoursesMiddleware);
router.get('/', courseController.getAllCourseData);
// GET request to get course data by id
......
......@@ -23,6 +23,7 @@ const NAME = 'Pembangunan Perangkat Lunak';
const DEFAULT_SEMESTER = 1;
const TYPE = CourseTypeEnum.MANDATORY;
const CURRICULUM_YEAR = 2013;
const NEXT_CURRICULUM_YEAR = 2019;
const OUTCOMES = 'Outcome';
const SHORT_SYLLABUS = 'Short syllabus';
const COMPLETE_SYLLABUS = 'Complete syllabus';
......@@ -44,7 +45,7 @@ const TYPE_UNDEFINED_ERROR = 'Undefined type';
const REQUIRED_PARAMETERES_UNDEFINED_ERROR = 'Undefined one of these parameters: code, or name, or type, or credits, or defaultSemester, or shortSyllabus, or completeSyllabus, or outcomes, or curriculumYear';
describe('Course Test', () => {
let major, option;
let major, option, course;
beforeEach(async () => {
await Course.destroy({ where: {} });
......@@ -64,6 +65,14 @@ describe('Course Test', () => {
option = await Option.create({
majorId: major.id
});
course = await Course.create({
code: CODE,
name: NAME,
type: TYPE,
credits: CREDITS,
majorId: major.id
});
});
afterEach(() => {
......@@ -258,6 +267,41 @@ describe('Course Test', () => {
});
});
it('should return course data when import previous data request body valid', (done) => {
const requestBody = {
previousId: course.id,
curriculumYear: NEXT_CURRICULUM_YEAR,
};
chai
.request(server)
.post(EndpointEnum.COURSE)
.send(requestBody)
.end((_, res) => {
res.should.have.status(SUCCESS_CODE);
res.body.should.have.property('id').to.not.equal(null);
res.body.should.have.property('code').deep.equal(CODE);
res.body.should.have.property('name').deep.equal(NAME);
res.body.should.have
.property('type')
.deep.equal(TYPE);
res.body.should.have
.property('credits')
.deep.equal(CREDITS);
res.body.should.have.property('defaultSemester');
res.body.should.have
.property('curriculumYear')
.deep.equal(requestBody.curriculumYear);
res.body.should.have.property('shortSyllabus');
res.body.should.have.property('completeSyllabus');
res.body.should.have.property('outcomes');
res.body.should.have.property('majorId').to.not.equal(null);
res.body.should.have.property('updatedAt').to.not.equal(null);
res.body.should.have.property('createdAt').to.not.equal(null);
done();
});
});
it('should return error when request body invalid (wrong course type enum)', (done) => {
const requestBody = {
code: CODE,
......@@ -322,14 +366,7 @@ describe('Course Test', () => {
describe('Updating course data', () => {
let course;
beforeEach(async () => {
course = await Course.create({
majorId: major.id
});
});
it('should return course data when request body valid', (done) => {
it('should return course data when update request body valid', (done) => {
const requestBody = {
code: CODE,
name: NAME,
......
......@@ -40,8 +40,17 @@ const updateCourse = async (course, changeset) => {
return result;
};
const getAllCourses = async (opts = {}) => {
const courses = await Course.findAll(opts);
if (!courses) throw new NotExistError();
return courses;
};
module.exports = {
createCourse,
getCourse,
updateCourse
updateCourse,
getAllCourses
}
\ No newline at end of file