cu.uci.coj.restapi.controller.RestUserProfileController.java Source code

Java tutorial

Introduction

Here is the source code for cu.uci.coj.restapi.controller.RestUserProfileController.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cu.uci.coj.restapi.controller;

import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
import com.wordnik.swagger.annotations.ApiResponse;
import com.wordnik.swagger.annotations.ApiResponses;
import cu.uci.coj.dao.InstitutionDAO;
import cu.uci.coj.dao.UserDAO;
import cu.uci.coj.dao.UtilDAO;
import cu.uci.coj.model.Country;
import cu.uci.coj.model.Entry;
import cu.uci.coj.model.Institution;
import cu.uci.coj.model.Language;
import cu.uci.coj.model.Problem;
import cu.uci.coj.model.User;
import cu.uci.coj.restapi.templates.UserProfileRest;
import cu.uci.coj.restapi.utils.ErrorUtils;
import cu.uci.coj.restapi.utils.TokenUtils;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.validator.EmailValidator;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 *
 * @author cesar
 */
@Controller
@RequestMapping("/userprofile")
public class RestUserProfileController {

    @Resource
    private UserDAO userDAO;
    @Resource
    protected JdbcTemplate jdbcTemplate;
    @Resource
    private UtilDAO utilDAO;
    @Resource
    private InstitutionDAO institutionDAO;

    @ApiOperation(value = "Obtener el perfil de un usuario", notes = "Dado el nombre de usuario, devuelve el perfil de este.", response = UserProfileRest.class)
    @ApiResponses(value = { @ApiResponse(code = 401, message = "username disabled"),
            @ApiResponse(code = 404, message = "bad user") })
    @RequestMapping(value = "/{username}", method = RequestMethod.GET, headers = "Accept=application/json")
    @ResponseBody
    public ResponseEntity<?> getUserProfile(@ApiParam(value = "Nombre  de usuario") @PathVariable String username) {

        User user = null;

        if (!userDAO.bool("is.user.enabled", username))
            return new ResponseEntity<>(ErrorUtils.USERNAME_DISABLED, HttpStatus.UNAUTHORIZED);

        Integer uid = userDAO.idByUsername(username);
        if (uid != null && userDAO.isUser(username)) {
            user = userDAO.loadUserData(username);
            if (user.isTeam())
                return new ResponseEntity<>(ErrorUtils.BAD_USER, HttpStatus.NOT_FOUND);

            List<Problem> solved = userDAO.objects("problems.solved.1", Problem.class, user.getUid());
            List<Problem> unsolved = userDAO.getProblemsTryied(user.getUid());

            if (solved.isEmpty()) {
                user.setLast_accepted("***");
            }
            if (unsolved.isEmpty() && solved.isEmpty()) {
                user.setLast_submission("***");
            }

            user.setSolved(solved.size());
            user.setUnsolved(unsolved.size());
            user.setRanking(userDAO.integer("ranking.position", username));
            user.setTot_ranking(userDAO.countEnabledUsers(null, false));
            user.setRankingbycountry(userDAO.integer("ranking.position.country", user.getCountry_id(), username));
            user.setTot_rankingbycountry(userDAO.countEnabledUsersByCountry(null, false, user.getCountry_id()));
            user.setRankingbyinstitution(
                    userDAO.integer("ranking.position.institution", user.getInstitution_id(), username));
            user.setTot_rankingbyinstitution(
                    userDAO.countEnabledUsersByInstitutions(null, false, user.getInstitution_id()));
        }

        Entry lastentry = userDAO.object("last.entry.by.user", Entry.class, uid);

        String lastentryText = "";
        String lastentryDate = "";
        if (lastentry != null) {
            lastentryText = lastentry.getText();
            lastentryDate = lastentry.getDate().toString();
        }

        int followers = userDAO.integer(0, "count.followers", uid);
        int following = userDAO.integer(0, "count.following", uid);

        String avatar = "http://coj.uci.cu/images/avatars/" + username;
        String gender = "female";
        if (user.getGender() == 1)
            gender = "male";

        UserProfileRest userRest = new UserProfileRest(avatar, user.getName(), user.getLastname(), username, gender,
                user.getCountry(), user.getCountry_desc(), user.getInstitution_desc(), user.getPlanguage(),
                user.getRgdate(), user.getLast_submission(), user.getLast_accepted(), user.getScore(),
                user.getRanking(), user.getRankingbyinstitution(), user.getRankingbycountry(), lastentryText,
                lastentryDate, followers, following);
        userRest.setNickname(user.getNick());

        return new ResponseEntity<>(userRest, HttpStatus.OK);
    }

    @ApiOperation(value = "Modificar Perfil de Usuario", notes = "Modifica el perfil de usuario con los datos enviados.")
    @ApiResponses(value = {
            @ApiResponse(code = 401, message = "username token mismatch<br> hash incorrect<br> token expirated<br> username apikey mismatch<br> apikey hash incorrect<br> apikey expirated<br> apikey secret incorrect<br> token or apikey incorrect"),
            @ApiResponse(code = 400, message = "institution witout country<br> incorrect request"),
            @ApiResponse(code = 412, message = "Nick must not more than 25 characters<br> Nick must not less than 3 characters<br> The first name is too short<br> The first name is too long<br> The first name contains invalid characters<br> The last name is too long<br> The last name is too short<br> The last name contains invalid characters<br> Required field<br> This e-mail already exists<br> Invalid email."),
            @ApiResponse(code = 404, message = "bad user<br> bad institution id<br> bad language<br> bad locale<br> bad gender<br> bad country id"),
            @ApiResponse(code = 500, message = "failed send email"), })
    @RequestMapping(value = "/update", method = RequestMethod.PUT, headers = "Accept=application/json", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    @ResponseBody
    public ResponseEntity<?> UpdateProfile(
            @ApiParam(value = "Llave de desarrollador") @RequestParam(value = "apikey") String apikey,
            @ApiParam(value = "Token de usuario") @RequestParam(value = "token") String token,
            @ApiParam(value = "Ao de nacimiento") @RequestParam(value = "year", required = false) Integer year,
            @ApiParam(value = "Mes de nacimiento") @RequestParam(value = "month", required = false) Integer month,
            @ApiParam(value = "Da de nacimiento") @RequestParam(value = "day", required = false) Integer day,
            @ApiParam(value = "Apodo") @RequestParam(value = "nick", required = false) String nick,
            @ApiParam(value = "Nombre") @RequestParam(value = "name", required = false) String name,
            @ApiParam(value = "Apellido") @RequestParam(value = "lastname", required = false) String lastname,
            @ApiParam(value = "Correo") @RequestParam(value = "email", required = false) String email,
            @ApiParam(value = "Identificador del Pas") @RequestParam(value = "country_id", required = false) Integer country_id,
            @ApiParam(value = "Identificador de la Institucin") @RequestParam(value = "institution_id", required = false) Integer institution_id,
            @ApiParam(value = "Identificador del lenguaje favorito (Ver filters)") @RequestParam(value = "lid", required = false) Integer lid,
            @ApiParam(value = "Identificador del idioma favorito (Ver filters)") @RequestParam(value = "locale", required = false) Integer locale,
            @ApiParam(value = "Sexo:  (1)Hombre (2) Mujer", allowableValues = "1,2") @RequestParam(value = "gender", required = false) Integer gender) {

        try {

            int error = ValidateApiAndToken(apikey, token);
            if (error > 0) {
                return new ResponseEntity<>(TokenUtils.ErrorMessage(error), HttpStatus.UNAUTHORIZED);
            }

            String username = null;
            username = ExtractUser(token);

            User user = userDAO.loadAllUserData(username);
            if (year != null)
                user.setYear(year);
            if (month != null)
                user.setMonth(month);
            if (day != null)
                user.setDay(day);
            user.setUsername(username);
            if (nick != null)
                user.setNick(nick);
            if (name != null)
                user.setName(name);
            if (lastname != null)
                user.setLastname(lastname);
            if (email != null)
                user.setEmail(email);
            if (country_id != null)
                user.setCountry_id(country_id);
            if (institution_id != null)
                user.setInstitution_id(institution_id);
            if (lid != null)
                user.setLid(lid);
            if (locale != null)
                user.setLocale(locale);
            if (gender != null)
                user.setGender(gender);

            user.setUid(userDAO.integer("select.uid.by.username", username));
            user.setDob(new Date(user.getYear() - 1900, user.getMonth() - 1, user.getDay()));

            boolean is_team = !userDAO.bool("is.user", user.getUsername());
            if (is_team)
                return new ResponseEntity<>(ErrorUtils.BAD_USER, HttpStatus.NOT_FOUND);

            user.setTeam(false);

            String errors = ValidateUser(user);
            if (!errors.equals("0"))
                return new ResponseEntity<>(errors, HttpStatus.PRECONDITION_FAILED);

            if (country_id != null && !ValidateCountry(country_id))
                return new ResponseEntity<>(ErrorUtils.BAD_COUNTRY_ID, HttpStatus.NOT_FOUND);

            if (country_id != null && institution_id != null && !ValidateInstitutionID(country_id, institution_id))
                return new ResponseEntity<>(ErrorUtils.BAD_INSTITUTION_ID, HttpStatus.NOT_FOUND);

            if (country_id == null && institution_id != null)
                return new ResponseEntity<>(ErrorUtils.INSTITUTION_WITHOUT_COUNTRY, HttpStatus.BAD_REQUEST);

            if (lid != null && !ValidateLanguage(lid))
                return new ResponseEntity<>(ErrorUtils.BAD_LANGUAGE, HttpStatus.NOT_FOUND);

            if (locale != null && !ValidateLocale(locale))
                return new ResponseEntity<>(ErrorUtils.BAD_LOCALE, HttpStatus.NOT_FOUND);

            if (gender != null && gender != 1 && gender != 2)
                return new ResponseEntity<>(ErrorUtils.BAD_GENDER, HttpStatus.NOT_FOUND);

            try {
                userDAO.updateUser(user);
            } catch (Exception e) {
                return new ResponseEntity<>(ErrorUtils.FAILED_SEND_EMAIL, HttpStatus.INTERNAL_SERVER_ERROR);
            }

        } catch (IOException ex) {
            return new ResponseEntity<>(ErrorUtils.INCORRECT_JSON, HttpStatus.BAD_REQUEST);
        }

        return new ResponseEntity<>(HttpStatus.OK);
    }

    private boolean ValidateCountry(Integer country_id) {
        String sql = "SELECT * FROM public.country WHERE country_id = ?";
        try {
            Country country = (Country) jdbcTemplate.queryForObject(sql, new Object[] { country_id },
                    new BeanPropertyRowMapper(Country.class));
        } catch (Exception e) {
            return false;
        }

        return true;
    }

    private boolean ValidateLocale(Integer locale) {
        List<cu.uci.coj.model.Locale> listlocale = utilDAO.objects("enabled.locale", cu.uci.coj.model.Locale.class);
        for (cu.uci.coj.model.Locale l : listlocale) {
            if (locale == l.getLid())
                return true;
        }

        return false;
    }

    private boolean ValidateLanguage(Integer lid) {
        List<Language> listlanguages = utilDAO.getEnabledProgramingLanguages();
        for (Language l : listlanguages) {
            if (lid == l.getLid())
                return true;
        }

        return false;
    }

    private boolean ValidateInstitutionID(int country_id, int institution_id) {
        List<Institution> institutions = institutionDAO.getEnabledInstitutionsByCountry_id(country_id);

        if (institution_id == -1)
            return true;

        for (Institution ins : institutions) {
            if (ins.getId() == institution_id)
                return true;
        }

        return false;
    }

    private String ValidateUser(User user) {
        ResourceBundleMessageSource r = new ResourceBundleMessageSource();
        r.setBasename("messages_en");

        user.setDob(new Date(user.getYear() - 1900, user.getMonth() - 1, user.getDay()));

        if (user.getNick().length() == 0)
            return r.getMessage("judge.register.error.nick", null, new Locale("en"));

        if ((user.getNick().length()) > 15)
            return r.getMessage("judge.register.error.long25charact", null, new Locale("en"));

        if (user.getNick().length() < 3)
            return r.getMessage("judge.register.error.less3charact", null, new Locale("en"));

        if (user.getName().length() < 1)
            return r.getMessage("errormsg.7", null, new Locale("en"));

        if (user.getName().length() > 30)
            return r.getMessage("errormsg.6", null, new Locale("en"));

        if (!user.getName().matches("[a-zA-Z\\.\\-\\'\\s]+"))
            return r.getMessage("errormsg.8", null, new Locale("en"));

        if (user.getLastname().length() < 1)
            return r.getMessage("errormsg.10", null, new Locale("en"));

        if (user.getLastname().length() > 50)
            return r.getMessage("errormsg.9", null, new Locale("en"));

        if (!user.getLastname().matches("[a-zA-Z\\.\\-\\'\\s]+"))
            return r.getMessage("errormsg.11", null, new Locale("en"));

        // si el correo ha sido cambiado y esta en uso por otra persona en el
        // COJ
        if (user.getEmail().length() == 0)
            return r.getMessage("errormsg.51", null, new Locale("en"));

        if (!StringUtils.isEmpty(user.getEmail()) && userDAO.bool("email.changed", user.getEmail(), user.getUid())
                && userDAO.emailExistUpdate(user.getEmail().trim(), user.getUsername()))
            return r.getMessage("judge.register.error.emailexist", null, new Locale("en"));

        EmailValidator emailValidator = EmailValidator.getInstance(); //ver como inyectar este objeto
        if (!emailValidator.isValid(user.getEmail()))
            return r.getMessage("judge.register.error.bademail", null, new Locale("en"));

        if (user.getCountry_id() == 0)
            return r.getMessage("judge.register.error.country", null, new Locale("en"));

        if (user.getInstitution_id() == 0)
            return r.getMessage("judge.register.error.institution", null, new Locale("en"));

        if (user.getLid() == 0)
            return r.getMessage("judge.register.error.planguage", null, new Locale("en"));

        if (user.getLocale() == 0)
            return r.getMessage("judge.register.error.locale", null, new Locale("en"));

        if (user.getName().length() == 0)
            return r.getMessage("judge.register.error.name", null, new Locale("en"));

        if (user.getGender() == 0)
            return r.getMessage("judge.register.error.gender", null, new Locale("en"));

        return "0";
    }

    private int ValidateApiAndToken(String apikey, String token) throws IOException {

        try {
            int error = TokenUtils.ValidateAPIKey(apikey);
            if (error > 0) {
                return error;
            }

            int error2 = TokenUtils.ValidateTokenUser(token);
            if (error2 > 0) {
                return error2;
            }
        } catch (Exception e) {
            return 9;
        }

        return 0;
    }

    private String ExtractUser(String token) {
        String username = null;
        try {
            username = TokenUtils.getUsernameFromToken(token);
        } catch (Exception ex) {
            Logger.getLogger(RestProblemsController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return username;
    }

}