jadi project ini adalah sistem coontact management yang pengguna untuk mengelola kontak dan alamat.semua datanya bisa disimpen di sini! Sistem ini buat pakai Spring Boot. project ini memiliki fitur
- User Management: Mengelola data pengguna (registrasi, login, update, dll).
- Contact Management: Mengelola data kontak (nama, email, telepon, dll).
- Address Management: Mengelola alamat yang terkait dengan kontak.
Dependensi: Spring Boot: Framework buat bikin aplikasi Java yang cepat dan efisien. Spring Data JPA: Buat ngelola database dengan mudah. PostgreSQL: Database buat nyimpen semua data. Spring Security: Buat ngatur keamanan aplikasi, termasuk login dan JWT. JWT (JSON Web Token): Buat autentikasi, biar aplikasi lebih aman. Lombok: Biar nggak perlu nulis getter-setter manual, lebih hemat waktu. Validation: Buat mastiin data yang diinput bener, misalnya email harus valid. Unit Testing: Buat ngetes kode biar nggak ada bug.
Struktur Project
D:\Restful-Api-Application
├── RestfulApiApplication.java // Main class buat jalanin aplikasi
├── security // Folder buat ngatur keamanan
│ ├── JWTAuthenticationFilter.java // Filter buat ngecek JWT
│ ├── JWTUtil.java // Utility buat generate dan validasi JWT
│ └── SecurityConfig.java // Konfigurasi Spring Security
├── controller // Folder buat API endpoint
│ ├── UserController.java // Endpoint buat user (register, login, dll)
│ ├── ContactController.java // Endpoint buat kontak
│ └── AddressController.java // Endpoint buat alamat
├── model // Folder buat entitas data
│ ├── User.java // Model buat data user
│ ├── Contact.java // Model buat data kontak
│ ├── AuthenticationResponse.java // Response buat login (JWT)
│ ├── AuthenticationRequest.java // Request buat login (username & password)
│ └── Address.java // Model buat data alamat
├── repository // Folder buat ngakses database
│ ├── UserRepository.java // Repository buat user
│ ├── ContactRepository.java // Repository buat kontak
│ └── AddressRepository.java // Repository buat alamat
├── service // Folder buat logika bisnis
│ ├── UserService.java // Service buat user
│ ├── ContactService.java // Service buat kontak
│ └── AddressService.java // Service buat alamat
├── util // Folder buat utility
│ └── SecretKeyGenerator.java // Utility buat generate secret key JWT
└── test // Folder buat unit test
├── com.example.belajarRestApi
│ ├── service // Folder buat unit test service
│ │ └── UserServiceTest.java // Unit test buat UserService
└── BelajarRestApplicationTests.java // Unit test utama
Database
- Nama Database:
belajar-restful-api
CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, name VARCHAR(100) NOT NULL );
CREATE TABLE contacts ( id SERIAL PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100), email VARCHAR(100) UNIQUE, phone VARCHAR(20), user_id INT REFERENCES users(id) ON DELETE CASCADE );
CREATE TABLE address ( id SERIAL PRIMARY KEY, street VARCHAR(255), city VARCHAR(100), province VARCHAR(100),users country VARCHAR(100), postal_code VARCHAR(20), contact_id INT REFERENCES contacts(id) ON DELETE CASCADE );
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'io.jsonwebtoken:jjwt-api:0.11.5' // Buat JWT compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2' // Buat testing runtimeOnly 'org.postgresql:postgresql' // Database PostgreSQL annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' }
project ini pubya fitur utama:
-
Data User:
username: Nama pengguna (unik).password: Kata sandi pengguna.nama: Peran pengguna.
-
API User:
- Register User: Mendaftarkan pengguna baru.
- Login User: Memungkinkan pengguna untuk login.
- Update User: Memperbarui informasi pengguna.
- Get User: Mengambil informasi pengguna.
- Logout User: Memungkinkan pengguna untuk logout.
-
Data Kontak:
firstName: Nama depan kontak.lastName: Nama belakang kontak.email: Alamat email kontak.phone: Nomor telepon kontak.
-
API Kontak:
- Create Contact: Menambahkan kontak baru.
- Update Contact: Memperbarui kontak berdasarkan ID.
- Get Contact: Mengambil kontak berdasarkan ID.
- Remove Contact: Menghapus kontak berdasarkan ID.
-
Data Alamat:
street: Nama jalan.city: Kota.province: Provinsi.country: Negara.postalCode: Kode pos.
-
API Alamat:
- Create Address: Menambahkan alamat baru.
- Update Address: Memperbarui alamat berdasarkan ID.
- Get Address: Mengambil alamat berdasarkan ID.
- List Address: Menampilkan daftar alamat.
- Remove Address: Menghapus alamat berdasarkan ID.
Berikut adalah endpoint API yang tersedia dalam proyek ini:
-
Register User:
- Method: POST
- Endpoint:
/api/users/register - Fungsi: Mendaftarkan pengguna baru.
-
Login User:
- Method: POST
- Endpoint:
/api/users/login - Fungsi: Memungkinkan pengguna untuk login.
-
Update User:
- Method: PUT
- Endpoint:
/api/users/{id} - Fungsi: Memperbarui informasi pengguna.
-
Get User:
- Method: GET
- Endpoint:
/api/users/{id} - Fungsi: Mengambil informasi pengguna.
-
Logout User:
- Method: POST
- Endpoint:
/api/users/logout - Fungsi: Memungkinkan pengguna untuk logout.
-
Get All Contacts:
- Method: GET
- Endpoint:
/api/contacts - Fungsi: Mengambil semua kontak.
-
Get Contact by ID:
- Method: GET
- Endpoint:
/api/contacts/{id} - Fungsi: Mengambil kontak berdasarkan ID.
-
Create Contact:
- Method: POST
- Endpoint:
/api/contacts - Fungsi: Menambahkan kontak baru.
-
Update Contact:
- Method: PUT
- Endpoint:
/api/contacts/{id} - Fungsi: Memperbarui kontak berdasarkan ID.
-
Delete Contact:
- Method: DELETE
- Endpoint:
/api/contacts/{id} - Fungsi: Menghapus kontak berdasarkan ID.
-
Create Address:
- Method: POST
- Endpoint:
/api/contacts/{contactId}/addresses - Fungsi: Menambahkan alamat baru untuk kontak tertentu.
-
Update Address:
- Method: PUT
- Endpoint:
/api/contacts/{contactId}/addresses/{addressId} - Fungsi: Memperbarui alamat berdasarkan ID.
-
Get Address:
- Method: GET
- Endpoint:
/api/contacts/{contactId}/addresses/{addressId} - Fungsi: Mengambil alamat berdasarkan ID.
-
List Addresses:
- Method: GET
- Endpoint:
/api/contacts/{contactId}/addresses - Fungsi: Menampilkan daftar alamat untuk kontak tertentu.
-
Remove Address:
- Method: DELETE
- Endpoint:
/api/contacts/{contactId}/addresses/{addressId} - Fungsi: Menghapus alamat berdasarkan ID.
- Registrasi dan Login:
- Pengguna mendaftar dan login menggunakan endpoint
/api/users/registerdan/api/users/login.
- Pengguna mendaftar dan login menggunakan endpoint
- Mengelola Kontak:
- Setelah login, pengguna dapat menambahkan, memperbarui, melihat, atau menghapus kontak menggunakan endpoint
/api/contacts.
- Setelah login, pengguna dapat menambahkan, memperbarui, melihat, atau menghapus kontak menggunakan endpoint
- Mengelola Alamat:
- Pengguna juga dapat menambahkan, memperbarui, melihat, atau menghapus alamat yang terkait dengan kontak menggunakan endpoint
/api/contacts/{contactId}/addresses.
- Pengguna juga dapat menambahkan, memperbarui, melihat, atau menghapus alamat yang terkait dengan kontak menggunakan endpoint
-
Buat application-test.properties
-
file ini isinya konfigurasi buat testing, pake database H2 (in-memory database) biar nggak ganggu database utama (PostgreSQL). Ini isi filenya:
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true
spring.h2.console.enabled=true spring.h2.console.path=/h2-console
3.Nambahin Dependensi untuk Unit Test // Dependensi buat testing testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
- Nulis Unit Test
package com.example.belajarRestApi.service;
import com.example.belajarRestApi.model.User; import com.example.belajarRestApi.repository.UserRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.security.core.userdetails.UserDetails; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.Arrays; import java.util.List; import java.util.Optional;
import static org.junit.jupiter.api.Assertions.; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.;
@ExtendWith(MockitoExtension.class) public class UserServiceTest {
@Mock
private UserRepository userRepository;
@Mock
private PasswordEncoder passwordEncoder;
@InjectMocks
private UserService userService;
private User mockUser;
@BeforeEach
void setUp() {
mockUser = new User();
mockUser.setId(1L);
mockUser.setUsername("testuser");
mockUser.setPassword("password");
mockUser.setName("Test User");
}
// Test methods...
}