package com.example.service;
import java.util.Date;
import java.util.List;
import com.example.entity.Item;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
@Service
public class ItemDBImpl implements ItemDB {
// 환경설정으로 생성된 객체를 가져옴
@Autowired
private MongoTemplate mongoDB;
@Autowired
private SequenceService sequence;
@Override
public int insertItem(Item item) {
try {
long seq = sequence.generatorSequence("SEQ_ITEM4_CODE");
item.setCode(seq);
item.setRegdate(new Date());
Item item1 = mongoDB.insert(item);
if (item1.getCode() == seq) {
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
@Override
public List<Item> selectListPageSearchItem(int page, String text) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("name").regex(".*" + text + ".*");
query.addCriteria(criteria);
Pageable pageable = PageRequest.of(page - 1, 10);
query.with(pageable);
query.fields().exclude("filedata", "filetype", "filesize", "filename"); // projection
Sort sort = Sort.by(Direction.DESC, "_id");
query.with(sort);
return mongoDB.find(query, Item.class);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public int deleteItem(Long code) {
try {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(code));
DeleteResult result = mongoDB.remove(query, Item.class);
if (result.getDeletedCount() == 1L) {
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
@Override
public Item selectOneItem(Long code) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(code);
query.addCriteria(criteria);
return mongoDB.findOne(query, Item.class);
} catch (Exception e) {
e.printStackTrace(); // 개발자를 위한 출력(debug용)
return null;
}
}
@Override
public Item selectOneItemImage(Long code) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(code);
query.addCriteria(criteria);
query.fields().include("filedata", "filetype", "filesize");
return mongoDB.findOne(query, Item.class);
} catch (Exception e) {
}
return null;
}
@Override
public int updateItem(Item item) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(item.getCode());
query.addCriteria(criteria);
Update update = new Update();
update.set("name", item.getName());
update.set("price", item.getPrice());
update.set("quantity", item.getQuantity());
if (item.getFilesize() > 0) { // 첨부되었다면
update.set("filedata", item.getFiledata());
update.set("filesize", item.getFilesize());
update.set("filetype", item.getFiletype());
update.set("filename", item.getFilename());
}
UpdateResult result = mongoDB.updateFirst(query, update, Item.class);
if (result.getModifiedCount() == 1L) {
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
@Override
public long selectItemCount() {
try {
Query query = new Query();
return mongoDB.count(query, Item.class);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
@Override
public long CountSearchItem(String text) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("name").regex(".*" + text + ".*");
query.addCriteria(criteria);
return mongoDB.count(query, Item.class);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
}