Skip to content
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

Release 3 #22

Open
wants to merge 19 commits into
base: master
Choose a base branch
from
Open
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
122 changes: 121 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,121 @@
# contacts-groups
# contacts-groups

> moved task to here

# express-sqlite3-crud

# EXPRESS CONTACTS-GROUPS
---------------------------
Buatlah sebuah aplikasi sederhana menggunakan Express JS dan SQLITE3 untuk
menampilkan list Contact, Group, Addresses dan Profiles menambah data Contact, Group, Addresses dan Profiles ,
melakukan edit data dan delete data berdasarkan data yang dipilih

- [x] completed
## Release 0
1. Buatlah file dengan nama setup.js yang akan dijalankan pertama kali untuk membuat
table pada database. Tentukan column mana saja yang akan di set unique.
2. Berikan validasi di setiap create table sehingga meskipun setup dijalankan berulang
kali, tidak error

Structure table:
* Contacts:
- attribute id ber-type integer
- attribute name ber-type string
- attribute company ber-type string
- attribute telp_number ber-type string
- attribute email ber-type string
* Groups:
- attribute id ber-type integer
- attribute name_of_group ber-type string
* Profile:
- attribute id ber-type integer
- attribute username ber-type string
- attribute password ber-type string
* Addresses:
- attribute id ber-type integer
- attribute street ber-type string
- attribute city ber-type string
- attribute zipcode ber-type integer

- [x] completed
## Release 1 - Basic Routing for Contacts dan Groups
Buatlah sejumlah route berikut dan tampilkan melalui view engine ejs

|METHOD | ROUTE | KETERANGAN |
|-------|:------------------------|:-----------------------------------------------------
|GET | /contacts | Menampilkan semua data contacts |
|POST | /contacts | Menerima input contact |
|GET | /contacts/edit/:id | Menampilkan data contact spesifik untuk diubah |
|POST | /contacts/edit/:id | Menerima data form untuk update contact |
|GET | /contacts/delete/:id | Menghapus data contact berdasarkan id |
|GET | /groups | Menampilkan semua data groups |
|POST | /groups | Menerima data form untuk input group |
|GET | /groups/edit/:id | Menampilkan data group spesifik untuk diubah |
|POST | /groups/edit/:id | Menerima data form untuk update group |
|GET | /groups/delete/:id | Menghapus data group berdasarkan id |

- [x] completed
## Release 2 - Basic Routing for Addresses dan Profiles
Buatlah sejumlah route berikut dan tampilkan melalui view engine ejs

|METHOD | ROUTE | KETERANGAN |
|-------|:------------------------|:-----------------------------------------------------
|GET | /addresses | Menampilkan semua data addresses |
|POST | /addresses | Menerima data form untuk input address |
|GET | /addresses/edit/:id | Menampilkan data address spesifik untuk diubah |
|POST | /addresses/edit/:id | Menerima data form untuk update address |
|GET | /addresses/delete/:id | Menghapus data address berdasarkan id |
|GET | /profiles | Menampilkan semua data profiles |
|POST | /profiles | Menerima data form untuk input profile |
|GET | /profiles/edit/:id | Menampilkan data profile spesifik untuk diubah |
|POST | /profiles/edit/:id | Menerima data form untuk update profile |
|GET | /profiles/delete/:id | Menghapus data profile berdasarkan id |

- [x] completed
## Release 3
1. Tabel Contacts dan Table Profiles memiliki relasi dimana satu data contact hanya boleh memiliki satu data profile.
Pada file setup.js tambahkan column relasi foreign key dan tentukan di tabel mana foreign key tersebut ditambahkan (hint: gunakan alter table)
2. Tentukan (jika ada dan perlu) column mana saja yang harus di set UNIQUE (baca dokumentasi sqlite3 untuk menambahkan unique pada existing table)

- [x] completed
## Release 4
1. Pada route get '/profiles', tambahkanlah column untuk menampilkan nama contact (jika data contact telah di-assign)
2. Pada saat melakukan add di halaman profiles, tambahkanlah input fields berupa select-option(dropdown/combobox) yang isinya merupakan nama dari semua contact. Sehingga ketika user/client menekan tombol save, data contact akan ke-assign pada data profile tersebut
3. Pada saat melakukan edit di halaman profiles, data profile harus ter-populate ke masing-masing input form-nya, termasuk selected dropdown-nya

- [x] incomplete
## Release 5
- Tambahkan validasi pada halaman Contact, saat melakukan add field name tidak boleh kosong. Munculkan pesan error pada frontend (ejs)
- Tambahkan validasi pada halaman Profile, saat melakukan add profile dan memilih contact yang sudah memiliki profile munculkan pesan error "Your contact already have profile" pada frontend (ejs)

- [x] completed
## Release 6
Tabel Contacts dan Table Address memiliki relasi dimana satu data contact boleh memiliki lebih dari satu data address
Pada file setup.js tambahkan column relasi foreign key dan tentukan di tabel mana foreign key tersebut ditambahkan (hint: gunakan alter table)

- [x] completed
## Release 7
1. Pada route get '/addresses', tambahkanlah column untuk menampilkan nama contact (jika data contact telah di-assign)
2. Pada saat melakukan add di halaman address, tambahkanlah input fields berupa select-option(dropdown/combobox) yang isinya merupakan nama dari semua contact. Sehingga ketika user/client menekan tombol save, data contact akan ke-assign pada data address tersebut
3. Pada saat melakukan edit di halaman address, data address harus ter-populate ke masing-masing input form-nya, termasuk selected dropdown-nya

- [x] completed
## Release 8
- Buatlah routing baru "/addresses_with_contact" yang isinya menampilkan list dari addresses, kemudian tambahkan name dan company dari Contact yang sesuai dengan cara memanipulasi object di routing sebelum dikirimkan ke view menggunakan callback (untuk melatih "callback" kamu maka untuk kasus ini tidak boleh menggunakan JOIN)
- Tambahkan link pada halaman Contact untuk memanggil routing yang baru kalian buat di atas

- [] incomplete
## Release 9
Tabel Contacts dan Table Groups memiliki relasi dimana satu data contact boleh memiliki lebih dari satu data group, dan satu group boleh memiliki lebih dari satu data contact. Pada file setup.js tambahkan tabel conjuction yang dibutuhkan dan foreign key-foreign key yang dibutuhkan.

- [] incomplete
## Release 10
1. Pada saat melakukan add di halaman contacts, tambahkanlah input fields berupa select-options(dropdown/combobox) yang isinya merupakan nama dari semua group yang sudah ada. Ketika user/client menekan tombol save maka data contact dan group akan tersimpan pada tabel contact maupun tabel conjunctionnya.
2. Pada halaman list contacts tambahkan column group dimana pada coloum tersebut berisi nama-nama group yang telah di-assign untuk contact tersebut menggunakan callback. Di release ini table contact tidak boleh di join dengan table manapun, namun table Contacts_Groups boleh join dengan table Groups.

- [] incomplete
## Release 11
1. Tambahak route '/groups/assign_contacts/:id_group' (GET dan POST) dimana route ini berfungsi untuk menyimpan data relasi antara group dan contact-nya
2. Pada halaman list groups, tambahkan link 'assign contact' untuk setiap data group, dimana jika user/client menekan link tersebut maka akan menuju halaman 'assign_contacts' (gunakan route GET yang telah kamu buat diatas). Pada halaman ini tampilkan tulisan "Assign contacts for group: [nama_group]" dan buatlah form yang didalamnya terdapat select-options untuk memilih contact yang ingin di-assign
3. Pada saat user/client menekan tombol save maka panggilah route POST yang telah kalian buat di-point no.1 dan simpanlah data-data relasi antara contact dan group pada tabel conjunction
4. Pada halaman list groups tambahkan column contact dimana pada coloum tersebut berisi nama-nama contact yang telah di-assign untuk group tersebut menggunakan callback. Di release ini table Groups tidak boleh di join dengan table manapun, namun table Contacts_Groups boleh join dengan table Contacts.
25 changes: 25 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
const app = require('express')();
const bodyParser = require('body-parser');
const ejs = require('ejs');

const index = require('./routes/index');
const contacts = require('./routes/contacts');
const groups = require('./routes/groups');
const address = require('./routes/address');
const profiles = require('./routes/profiles');

app.set('views', './view');
app.set('view engine', 'ejs');

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use('/', index);
app.use('/contacts', contacts);
app.use('/groups', groups);
app.use('/address', address);
app.use('/profiles', profiles);

app.listen('3000', () => {
console.log(`App started on port 3000`);
});
69 changes: 0 additions & 69 deletions crud.md

This file was deleted.

Binary file added database/database.db
Binary file not shown.
19 changes: 0 additions & 19 deletions many-to-many.md

This file was deleted.

92 changes: 92 additions & 0 deletions models/address.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('./database/database.db', err => {
if (err) console.error(err);
});

class Address {
static findAllAddress() {
const queryJoin = `
SELECT *
FROM Addresses
JOIN Contacts ON Addresses.id_contact = Contacts.id
`;

return new Promise((resolve, reject) => {
db.all(queryJoin, (err, records) => {
if (err) reject(err);
resolve(records);
});
});
}

static createAddress(data) {
const queryPut = `
INSERT INTO Addresses (street, city, zipcode, id_contact)
VALUES ('${data.street}','${data.city}', '${data.zipcode}', '${data.id}')
`;

return new Promise((resolve, reject) => {
db.run(queryPut, err => {
if (err) reject(err);
resolve();
});
});
}

static editAddress(data) {
const queryEdit = `SELECT * FROM Addresses WHERE id IS ${data.id}`;

return new Promise((resolve, reject) => {
db.get(queryEdit, (err, records) => {
if (err) reject(err);
resolve(records);
});
});
}

static updateAddress(data) {
const queryUpdate = `
UPDATE Addresses
SET street = '${data.street}',
city = '${data.city}',
zipcode = '${data.zipcode}'
WHERE id IS ${data.id}
`;

return new Promise((resolve, reject) => {
db.run(queryUpdate, err => {
if (err) reject(err);
resolve();
});
});
}

static deleteAddress(data, callback) {
const queryDelete = `DELETE FROM Addresses WHERE id IS ${data.id}`;

return new Promise((resolve, reject) => {
db.run(queryDelete, err => {
if (err) reject(err);
resolve();
});
})
}

/* static findAddressWithContacts(callback) {
const queryContacts = `SELECT * FROM Contacts`;
const queryAddress = `SELECT * FROM Addresses`;

db.all(queryContacts, (err, contactRecords) => {
db.all(queryAddress, (err, addressRecords) => {
if (err) callback(err, null);
const recordsObj = {
contacts: contactRecords,
address: addressRecords
}
callback(null, recordsObj);
});
});
} */
}

module.exports = Address;
Loading