Skip to main content

Read Controller

16 November 2023

Pada Alurkerja Java, terdapat class ReadController yang dapat digunakan untuk menampilkan data dari table views.

ReadController merupakan controller yang khusus digunakan untuk menampilkan data yang bersifat Read Only, sehingga tidak perlu menggunakan CrudController.

ReadController memiliki 3 buah endpoint yaitu endpoint untuk mendapatkan spesifikasi, endpoint untuk menampilkan list, dan endpoint untuk menampilkan detail. ReadController membutuhkan 4 parameter yaitu Entity/Views, DTO, Service, dan Repository.

Cara Menggunakan ReadController

Membuat Entity

Sample Code
@Getter
@Entity
@Immutable
@Subselect("select u.id, \n" +
"u.id_ext, \n" +
"u.email as user_email, \n" +
"u.name as user_name, \n" +
"u.created_date,\n" +
"p.code position_code, \n" +
"case \n" +
"\twhen p is null then u.position\n" +
"\telse p.name\n" +
"end position_name, \n" +
"lo.name as location, \n" +
"la.name as layer, \n" +
"p.caretaker, p.use_caretaker \n" +
"from users u \n" +
"left join position p on u.id_ext = p.user_id_ext \n" +
"left join users_location lo on u.location_code = lo.code \n" +
"left join users_layer la on u.layer_code = la.code \n" +
"where u.email is not null and u.delete_at is null and p.delete_at is null")
public class DataUser {
@Column(name = "id")
private UUID id;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "position_code")
private String code;
@Column(name = "position_name")
private String name;
@Column(name = "user_email")
private String userEmail;
@Column(name = "user_name")
private String userName;
@Column(name = "location")
private String location;
@Column(name = "layer")
private String layer;
@Column(name = "caretaker")
private String caretaker;
@Column(name = "use_caretaker")
private Boolean useCaretaker;
}

Membuat DTO

Buatlah sebuah class DTO yang extend BaseDto

Sample Code
import com.alurkerja.spec.entity.BaseDto;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class DataUserDto extends BaseDto<DataUser, DataUserDto> {
private String code;
private String name;
private String userName;
}

Membuat Spesification

Buatlah sebuah class Spesification yang extend GenericSearchSpecification

Sample Code
import com.alurkerja.core.repository.search.GenericSearchSpecification;

public class DataUserSpesification extends GenericSearchSpecification<DataUser, DataUserDto> {

public DataUserSpesification(DataUserDto dto) {
super(dto);
}

@Override
public void buildSpecification(DataUserDto dto) {
this.defaultFilter(dto, "userName");
this.defaultSearch(dto, "userName");
}
}

Membuat Repository

Buatlah sebuah class repository yang extend CrudRepository

Sample Code
import com.alurkerja.core.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface DataUserRepository extends CrudRepository<DataUser> {
}

Membuat Service

Buatlah sebuah class service yang extend ReadService

Sample Code
import com.alurkerja.auth.service.AuthenticationService;
import com.alurkerja.core.service.ReadOnlyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class DataUserService extends ReadService<DataUser, DataUserDto, DataUserRepository> {
protected DataUserService(DataUserRepository simpleJpaRepository) {
super(simpleJpaRepository);
}

@Override
public String getCurrentUser() {
return null;
}

@Override
public String getCurrentGroup() {
return null;
}

@Override
public String getCurrentOrganization() {
return null;
}

@Override
public Specification<DataUser> instantiateSpecification(DataUserDto dto) {
return new DataUserSpesification(dto);
}
}

Membuat Controller

Buatlah sebuah class Controller yang extend ReadController

Sample Code
import com.alurkerja.core.controller.ReadController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/crud/data-user")
public class DataUserController extends ReadController<DataUser, DataUserDto, DataUserService, DataUserRepository> {
protected DataUserController(DataUserService dataUserService) {
super(dataUserService);
}
}

Daftar Endpoint pada ReadController

AksiMetodeURl
SpecGET{{baseUrl}}/crud/data-user/spec
ListGET{{baseUrl}}/crud/data-user
DetailGET{{baseUrl}}/crud/data-user/{id}

Table diatas Merupakan endpoint yang tersedia pada DataUserController yang extend ReadController