Начало: Department

This commit is contained in:
DyCTaTOR 2024-04-12 00:56:59 +04:00
parent 3239674edf
commit 7ba6f53b0e
9 changed files with 70 additions and 93 deletions

View File

@ -7,6 +7,18 @@ plugins {
group = 'com.example' group = 'com.example'
version = '0.0.1-SNAPSHOT' version = '0.0.1-SNAPSHOT'
defaultTasks 'bootRun'
jar {
enabled = false
}
bootJar {
archiveFileName = String.format('%s-%s.jar', rootProject.name, version)
}
assert System.properties['java.specification.version'] == '17' || '21'
java { java {
sourceCompatibility = '17' sourceCompatibility = '17'
} }
@ -17,9 +29,13 @@ repositories {
dependencies { dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'
implementation 'org.modelmapper:modelmapper:3.2.0' implementation 'org.modelmapper:modelmapper:3.2.0'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2:2.2.224'
testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.boot:spring-boot-starter-test'
} }

View File

@ -1,6 +1,8 @@
package com.example.demo.core.configuration; package com.example.demo.core.configuration;
public class Constants { public class Constants {
public static final String SEQUENCE_NAME = "hibernate_sequence";
public static final String API_URL = "/api/1.0"; public static final String API_URL = "/api/1.0";
private Constants() { private Constants() {

View File

@ -1,7 +1,7 @@
package com.example.demo.core.error; package com.example.demo.core.error;
public class NotFoundException extends RuntimeException { public class NotFoundException extends RuntimeException {
public NotFoundException(Long id) { public <T> NotFoundException(Class<T> clazz, Long id) {
super(String.format("Entity with id [%s] is not found or not exists", id)); super(String.format("%s with id [%s] is not found or not exists", clazz.getSimpleName(), id));
} }
} }

View File

@ -1,15 +1,23 @@
package com.example.demo.core.model; package com.example.demo.core.model;
import com.example.demo.core.configuration.Constants;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import jakarta.persistence.SequenceGenerator;
@MappedSuperclass
public abstract class BaseEntity { public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = Constants.SEQUENCE_NAME)
@SequenceGenerator(name = Constants.SEQUENCE_NAME, sequenceName = Constants.SEQUENCE_NAME, allocationSize = 1)
protected Long id; protected Long id;
protected BaseEntity() { protected BaseEntity() {
} }
protected BaseEntity(Long id) {
this.id = id;
}
public Long getId() { public Long getId() {
return id; return id;
} }

View File

@ -1,17 +0,0 @@
package com.example.demo.core.repository;
import java.util.List;
public interface CommonRepository<E, T> {
List<E> getAll();
E get(T id);
E create(E entity);
E update(E entity);
E delete(E entity);
void deleteAll();
}

View File

@ -1,57 +0,0 @@
package com.example.demo.core.repository;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.example.demo.core.model.BaseEntity;
public abstract class MapRepository<E extends BaseEntity> implements CommonRepository<E, Long> {
private final Map<Long, E> entities = new TreeMap<>();
private Long lastId = 0L;
protected MapRepository() {
}
@Override
public List<E> getAll() {
return entities.values().stream().toList();
}
@Override
public E get(Long id) {
return entities.get(id);
}
@Override
public E create(E entity) {
lastId++;
entity.setId(lastId);
entities.put(lastId, entity);
return entity;
}
@Override
public E update(E entity) {
if (get(entity.getId()) == null) {
return null;
}
entities.put(entity.getId(), entity);
return entity;
}
@Override
public E delete(E entity) {
if (get(entity.getId()) == null) {
return null;
}
entities.remove(entity.getId());
return entity;
}
@Override
public void deleteAll() {
lastId = 0L;
entities.clear();
}
}

View File

@ -4,15 +4,20 @@ import java.util.Objects;
import com.example.demo.core.model.BaseEntity; import com.example.demo.core.model.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
@Entity
@Table(name = "departments")
public class DepartmentEntity extends BaseEntity { public class DepartmentEntity extends BaseEntity {
@Column(nullable = false, unique = true, length = 80)
private String name; private String name;
public DepartmentEntity() { public DepartmentEntity() {
super();
} }
public DepartmentEntity(Long id, String name) { public DepartmentEntity(Long id, String name) {
super(id);
this.name = name; this.name = name;
} }

View File

@ -1,10 +1,11 @@
package com.example.demo.department.repository; package com.example.demo.department.repository;
import org.springframework.stereotype.Repository; import java.util.Optional;
import org.springframework.data.repository.CrudRepository;
import com.example.demo.core.repository.MapRepository;
import com.example.demo.department.model.DepartmentEntity; import com.example.demo.department.model.DepartmentEntity;
@Repository public interface DepartmentRepository extends CrudRepository<DepartmentEntity, Long> {
public class DepartmentRepository extends MapRepository<DepartmentEntity> { Optional<DepartmentEntity> findByNameIgnoreCase(String name);
} }

View File

@ -1,9 +1,10 @@
package com.example.demo.department.service; package com.example.demo.department.service;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.stream.StreamSupport;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.demo.core.error.NotFoundException; import com.example.demo.core.error.NotFoundException;
import com.example.demo.department.model.DepartmentEntity; import com.example.demo.department.model.DepartmentEntity;
@ -17,27 +18,45 @@ public class DepartmentService {
this.repository = repository; this.repository = repository;
} }
private void checkName(String name) {
if (repository.findByNameIgnoreCase(name).isPresent()) {
throw new IllegalArgumentException(
String.format("Type with name %s is already exists", name));
}
}
@Transactional(readOnly = true)
public List<DepartmentEntity> getAll() { public List<DepartmentEntity> getAll() {
return repository.getAll(); return StreamSupport.stream(repository.findAll().spliterator(), false).toList();
} }
@Transactional(readOnly = true)
public DepartmentEntity get(Long id) { public DepartmentEntity get(Long id) {
return Optional.ofNullable(repository.get(id)) return repository.findById(id)
.orElseThrow(() -> new NotFoundException(id)); .orElseThrow(() -> new NotFoundException(DepartmentEntity.class, id));
} }
@Transactional
public DepartmentEntity create(DepartmentEntity entity) { public DepartmentEntity create(DepartmentEntity entity) {
return repository.create(entity); if (entity == null) {
throw new IllegalArgumentException("Entity is null");
}
checkName(entity.getName());
return repository.save(entity);
} }
@Transactional
public DepartmentEntity update(Long id, DepartmentEntity entity) { public DepartmentEntity update(Long id, DepartmentEntity entity) {
final DepartmentEntity existsEntity = get(id); final DepartmentEntity existsEntity = get(id);
checkName(entity.getName());
existsEntity.setName(entity.getName()); existsEntity.setName(entity.getName());
return repository.update(existsEntity); return repository.save(existsEntity);
} }
@Transactional
public DepartmentEntity delete(Long id) { public DepartmentEntity delete(Long id) {
final DepartmentEntity existsEntity = get(id); final DepartmentEntity existsEntity = get(id);
return repository.delete(existsEntity); repository.delete(existsEntity);
return existsEntity;
} }
} }