/* * */ package org.smartly.packages.mongo.impl.db.service; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBObject; import org.smartly.IConstants; import org.smartly.commons.cryptograph.MD5; import org.smartly.commons.logging.Level; import org.smartly.commons.util.*; import org.smartly.packages.mongo.impl.AbstractMongoService; import org.smartly.packages.mongo.impl.IMongoConstants; import org.smartly.packages.mongo.impl.MongoPage; import org.smartly.packages.mongo.impl.StandardCodedException; import org.smartly.packages.mongo.impl.db.entity.MongoUser; import org.smartly.packages.mongo.impl.util.MongoUtils; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.regex.Pattern; /** * @author angelo.geminiani */ public class MongoUserService extends AbstractMongoService { // ------------------------------------------------------------------------ // Constructor // ------------------------------------------------------------------------ public MongoUserService(final DB db, final String[] langCodes) { super(db, MongoUser.COLLECTION, langCodes); } // ------------------------------------------------------------------------ // public // ------------------------------------------------------------------------ public MongoPage paged(final int skip, final int limit, final String searchText) { final DBObject query = new BasicDBObject(); final String[] fieldNames = null; // final int skip = 0; // final int limit = 10; final String[] sortAsc = new String[]{}; final String[] sortDes = new String[]{MongoUser.USERNAME}; if (!StringUtils.isNULL(searchText)) { final BasicDBList conditions = new BasicDBList(); conditions.add(MongoUtils.queryEquals(MongoUser.ID, searchText, MongoUtils.CASE_INSENSITIVE)); conditions.add(MongoUtils.queryContains(MongoUser.USERNAME, searchText, MongoUtils.CASE_INSENSITIVE)); conditions.add(MongoUtils.queryContains(MongoUser.EMAIL, searchText, MongoUtils.CASE_INSENSITIVE)); conditions.add(MongoUtils.queryContains(MongoUser.REALNAME, searchText, MongoUtils.CASE_INSENSITIVE)); conditions.add(MongoUtils.queryEquals(MongoUser.KEYWORDS, searchText, MongoUtils.CASE_INSENSITIVE)); query.put(MongoUtils.OP_OR, conditions); } return super.paged(query, fieldNames, skip, limit, sortAsc, sortDes); } public DBObject getById(final Object id, final boolean onlyEnabled) { final DBObject user = super.findById(id); if (null != user) { final boolean isenabled = MongoUser.getEnabled(user); if (onlyEnabled) { // only enabled users return isenabled ? user : null; } return user; } return null; } public List<DBObject> getByEmail(final String email) { try { final DBObject query = new BasicDBObject(); final Pattern equal = MongoUtils.patternEquals(email); //Pattern.compile("\\A" + email + "\\z", BeeMongoUtils.CASE_INSENSITIVE); query.put(MongoUser.EMAIL, equal); return super.find(query); } catch (Exception ex) { super.getLogger().log(Level.SEVERE, null, ex); } return new ArrayList<DBObject>(); } public List<DBObject> getByEmailExcerpt(final String email) { try { final DBObject query = new BasicDBObject(); final Pattern equal = MongoUtils.patternEquals(email); //Pattern.compile("\\A" + email + "\\z", BeeMongoUtils.CASE_INSENSITIVE); query.put(MongoUser.EMAIL, equal); return super.find(query, new String[]{MongoUser.ID, MongoUser.REALNAME, MongoUser.USERNAME}, new String[]{MongoUser.REALNAME}, null); } catch (Exception ex) { super.getLogger().log(Level.SEVERE, null, ex); } return new ArrayList<DBObject>(); } public MongoUser getFirst(final DBObject filter) { final DBObject object = super.findOne(filter); return null != object ? new MongoUser(object) : null; } /** * Try to signin * * @param id_user * @param password * @return */ public DBObject signin(final String id_user, final String password) { // try with username DBObject user = this.getByUsernameAndPassword(id_user, password); // id if (null == user) { // try with email user = this.lookupByIdAndPassword(id_user, password); } // email if (null == user) { // try with email user = this.getByEmailAndPassword(id_user, password); } // return user if (null != user && !MongoUser.getRemoved(user)) { // return user return user; } else { return null; } } public DBObject getByUsernameAndPassword(final String username, final String password) { return this.lookupByUsernameAndPassword(username, password); } public DBObject getByEmailAndPassword(final String email, final String password) { return this.lookupByEmailAndPassword(email, password); } public boolean exists(final String iduser) { return !CollectionUtils.isEmpty(this.lookup(iduser)); } public Collection<DBObject> lookup(final String iduser) { if (StringUtils.hasText(iduser)) { try { Collection<DBObject> users; //-- tryID --// users = this.lookupID(iduser); if (!CollectionUtils.isEmpty(users)) { return users; } //-- try with username --// users = this.lookupUserName(iduser); if (!CollectionUtils.isEmpty(users)) { return users; } //-- try with email --// users = this.lookupEmail(iduser); if (!CollectionUtils.isEmpty(users)) { return users; } } catch (Exception ex) { super.getLogger().log(Level.SEVERE, null, ex); } } return null; } public Collection<DBObject> lookupID(final String userId) { final DBObject query = new BasicDBObject(); query.put(MongoUser.ID, userId); return super.find(query); } public Collection<DBObject> lookupUserName(final String username) { final DBObject query = new BasicDBObject(); final Pattern equal = Pattern.compile("\\A" + username + "\\z", MongoUtils.CASE_INSENSITIVE); query.put(MongoUser.USERNAME, equal); return super.find(query); } public Collection<DBObject> lookupEmail(final String email) { final DBObject query = new BasicDBObject(); final Pattern equal = Pattern.compile("\\A" + email + "\\z", MongoUtils.CASE_INSENSITIVE); query.put(MongoUser.EMAIL, equal); return super.find(query); } public MongoUser createEmpty(final String langCode, final String country) throws Exception { final MongoUser user = new MongoUser(new BasicDBObject(IMongoConstants.ID, MongoUtils.createUUID())); MongoUser.setEnabled(user, true); user.setLang(StringUtils.hasText(langCode) ? langCode : IConstants.DEF_LANG); user.setCountryId(null != country ? country : "IT"); // initial username and password user.setUsername("new_user"); user.setPassword(RandomUtils.randomNumeric(6)); return user; } public MongoUser createNew(final String idphone, final String email, final String password, final String langCode, final String country) throws Exception { // have valid input data? if (StringUtils.hasText(idphone) || StringUtils.hasText(email)) { // does user exists? if (!this.exists(email)) { final MongoUser user = new MongoUser(); MongoUser.setEnabled(user, false); user.setPhonehome(""); user.setPhonemobile(StringUtils.leftStr(idphone, 6, true)); user.setPhoneoffice(StringUtils.leftStr(idphone, 6, true)); user.setLang(StringUtils.hasText(langCode) ? langCode : IConstants.DEF_LANG); user.setCountryId(null != country ? country : "IT"); // initial username and password user.setUsername(StringUtils.hasText(email) ? email : idphone); user.setPassword(StringUtils.hasText(password) ? password : RandomUtils.randomNumeric(6)); // init email if (RegExUtils.isValidEmail(email)) { user.setEmail(email); } // save user super.upsert(user); // return saved user return user; } } return null; } public MongoUser save(final DBObject item, final String... excludeProperties) throws StandardCodedException { final DBObject checkeduser = this.validateUser(item); final DBObject result = super.merge(checkeduser, excludeProperties); return null != result ? new MongoUser(result) : null; } public DBObject update(final DBObject user) throws Exception { if (null != user) { final Object id = MongoUtils.getId(user); if (null != id) { // save user return this.save(user, MongoUser.PASSWORD, MongoUser.CREATIONDATE); } else { throw new Exception( FormatUtils.format("User not found on database: {0}", user)); } } return null; } public boolean changePassword(final Object id, final String password) throws Exception { final DBObject user = this.getById(id, true); if (null != user) { MongoUser.setPassword(user, password); super.upsert(user); return true; } return false; } public void initCountry(final DBObject user) { if (null != user) { final String countryId = MongoUser.getCountryId(user); if (StringUtils.hasText(countryId)) { final DBObject country = this.getCountry(countryId); MongoUser.setCountry(user, country); } } } // ------------------------------------------------------------------------ // p r i v a t e // ------------------------------------------------------------------------ private DBObject validateUser(final DBObject item) { if (null != item) { try { } catch (Throwable t) { super.getLogger().log(Level.SEVERE, null, t); } } return item; } private DBObject lookupByIdAndPassword(final String id, final String password) { DBObject user = null; try { final DBObject query = new BasicDBObject(); final Pattern equal = MongoUtils.patternEquals(id); //Pattern.compile("\\A" + username + "\\z", BeeMongoUtils.CASE_INSENSITIVE); query.put(MongoUser.ID, equal); query.put(MongoUser.PASSWORD, password); // get user user = CollectionUtils.getFirst(super.find(query)); if (null == user) { query.put(MongoUser.PASSWORD, MD5.encode(password)); user = CollectionUtils.getFirst(super.find(query)); } } catch (Exception ex) { super.getLogger().log(Level.SEVERE, null, ex); } return user; } private DBObject lookupByUsernameAndPassword(final String username, final String password) { DBObject user = null; try { final DBObject query = new BasicDBObject(); final Pattern equal = MongoUtils.patternEquals(username); //Pattern.compile("\\A" + username + "\\z", BeeMongoUtils.CASE_INSENSITIVE); query.put(MongoUser.USERNAME, equal); query.put(MongoUser.PASSWORD, password); // get user user = CollectionUtils.getFirst(super.find(query)); if (null == user) { query.put(MongoUser.PASSWORD, MD5.encode(password)); user = CollectionUtils.getFirst(super.find(query)); } } catch (Exception ex) { super.getLogger().log(Level.SEVERE, null, ex); } return user; } private DBObject lookupByEmailAndPassword(final String email, final String password) { DBObject user = null; try { final DBObject query = new BasicDBObject(); final Pattern equal = MongoUtils.patternEquals(email); //Pattern.compile("\\A" + email + "\\z", BeeMongoUtils.CASE_INSENSITIVE); query.put(MongoUser.EMAIL, equal); query.put(MongoUser.PASSWORD, password); user = CollectionUtils.getFirst(super.find(query)); if (null == user) { query.put(MongoUser.PASSWORD, MD5.encode(password)); user = CollectionUtils.getFirst(super.find(query)); } } catch (Exception ex) { super.getLogger().log(Level.SEVERE, null, ex); } return user; } private DBObject getCountry(final String countryId) { final MongoCountryService srvc = new MongoCountryService(super.getDb(), super.getLanguages()); return srvc.findById(countryId); } }