package com.ciandt.techgallery.service.impl;
import com.google.api.server.spi.response.BadRequestException;
import com.google.api.server.spi.response.InternalServerErrorException;
import com.google.api.server.spi.response.NotFoundException;
import com.googlecode.objectify.Ref;
import com.ciandt.techgallery.persistence.dao.TechnologyFollowersDAO;
import com.ciandt.techgallery.persistence.dao.impl.TechnologyFollowersDAOImpl;
import com.ciandt.techgallery.persistence.model.TechGalleryUser;
import com.ciandt.techgallery.persistence.model.Technology;
import com.ciandt.techgallery.persistence.model.TechnologyFollowers;
import com.ciandt.techgallery.service.TechnologyFollowersService;
import com.ciandt.techgallery.service.TechnologyService;
import com.ciandt.techgallery.service.UserServiceTG;
import com.ciandt.techgallery.service.enums.ValidationMessageEnums;
import com.ciant.techgallery.transaction.Transactional;
import java.util.ArrayList;
/**
* Services for Technology Endpoint requests.
*
* @author felipers
*
*/
@Transactional
public class TechnologyFollowersServiceImpl implements TechnologyFollowersService {
/*
* Attributes --------------------------------------------
*/
private static TechnologyFollowersServiceImpl instance;
UserServiceTG userService = UserServiceTGImpl.getInstance();
TechnologyService techService = TechnologyServiceImpl.getInstance();
TechnologyFollowersDAO followersDao = TechnologyFollowersDAOImpl.getInstance();
/*
* Constructors --------------------------------------------
*/
private TechnologyFollowersServiceImpl() {}
/**
* Singleton method for the service.
*
* @author ibrahim
*
* @return TechnologyFollowersServiceImpl instance.
*/
public static TechnologyFollowersServiceImpl getInstance() {
if (instance == null) {
instance = new TechnologyFollowersServiceImpl();
}
return instance;
}
/*
* Methods --------------------------------------------
*/
@Override
public TechnologyFollowers getTechnologyFollowersByTechnology(final Technology technology)
throws BadRequestException {
if (technology == null) {
throw new BadRequestException(ValidationMessageEnums.NO_TECHNOLOGY_WAS_FOUND.message());
} else {
return followersDao.findByTechnology(technology);
}
}
@Override
@Transactional
public Technology followTechnology(String technologyId, TechGalleryUser techUser)
throws BadRequestException, NotFoundException, InternalServerErrorException {
Technology technology = techService.getTechnologyById(technologyId, null);
TechnologyFollowers technologyFollowers = followersDao.findById(technology.getId());
if (technologyFollowers == null
|| !technologyFollowers.getFollowers().contains(Ref.create(techUser))) {
technologyFollowers = follow(technologyFollowers, techUser, technology);
} else if (technologyFollowers != null
&& technologyFollowers.getFollowers().contains(Ref.create(techUser))) {
technologyFollowers = unfollow(technologyFollowers, techUser, technology);
}
update(technologyFollowers);
userService.updateUser(techUser);
return technology;
}
private TechnologyFollowers unfollow(TechnologyFollowers technologyFollowers,
TechGalleryUser techUser, Technology technology) throws BadRequestException {
technologyFollowers.getFollowers().remove(Ref.create(techUser));
techUser.getFollowedTechnologyIds().remove(technology.getId());
if (technologyFollowers.getFollowers().isEmpty()) {
followersDao.delete(technologyFollowers);
return null;
}
return technologyFollowers;
}
@Override
public TechnologyFollowers follow(TechnologyFollowers technologyFollowers,
TechGalleryUser techUser, Technology technology) {
if (technologyFollowers == null) {
technologyFollowers = new TechnologyFollowers();
technologyFollowers.setId(technology.getId());
technologyFollowers.setTechnology(Ref.create(technology));
technologyFollowers.setFollowers(new ArrayList<Ref<TechGalleryUser>>());
}
technologyFollowers.getFollowers().add(Ref.create(techUser));
if (techUser.getFollowedTechnologyIds() == null) {
techUser.setFollowedTechnologyIds(new ArrayList<String>());
}
techUser.getFollowedTechnologyIds().add(technology.getId());
return technologyFollowers;
}
@Override
public void update(TechnologyFollowers technologyFollowers) throws BadRequestException {
if (technologyFollowers != null) {
if (technologyFollowers.getTechnology() == null) {
throw new BadRequestException(ValidationMessageEnums.TECHNOLOGY_ID_CANNOT_BLANK.message());
}
if (technologyFollowers.getFollowers() == null
|| technologyFollowers.getFollowers().isEmpty()) {
throw new BadRequestException(ValidationMessageEnums.FOLLOWERS_CANNOT_EMPTY.message());
}
if (technologyFollowers.getId() != null
&& followersDao.findById(technologyFollowers.getId()) != null) {
followersDao.update(technologyFollowers);
} else {
followersDao.add(technologyFollowers);
}
}
}
@Override
public TechnologyFollowers findById(String id) {
return followersDao.findById(id);
}
}