Search in sources :

Example 1 with Config

use of com.erudika.para.core.utils.Config in project scoold by Erudika.

the class ScooldUtils method sendCommentNotifications.

public void sendCommentNotifications(Post parentPost, Comment comment, Profile commentAuthor, HttpServletRequest req) {
    // send email notification to author of post except when the comment is by the same person
    if (parentPost != null && comment != null) {
        // parent author is not current user (authUser)
        parentPost.setAuthor(pc.read(Profile.id(parentPost.getCreatorid())));
        Map<String, Object> payload = new LinkedHashMap<>(ParaObjectUtils.getAnnotatedFields(comment, false));
        payload.put("parent", parentPost);
        payload.put("author", commentAuthor);
        triggerHookEvent("comment.create", payload);
        // get the last 5-6 commentators who want to be notified - https://github.com/Erudika/scoold/issues/201
        Pager p = new Pager(1, Config._TIMESTAMP, false, 5);
        boolean isCommentatorThePostAuthor = StringUtils.equals(parentPost.getCreatorid(), comment.getCreatorid());
        Set<String> last5ids = pc.findChildren(parentPost, Utils.type(Comment.class), "!(" + Config._CREATORID + ":\"" + comment.getCreatorid() + "\")", p).stream().map(c -> c.getCreatorid()).distinct().collect(Collectors.toSet());
        if (!isCommentatorThePostAuthor && !last5ids.contains(parentPost.getCreatorid())) {
            last5ids = new HashSet<>(last5ids);
            last5ids.add(parentPost.getCreatorid());
        }
        Map<String, String> lang = getLang(req);
        List<Profile> last5commentators = pc.readAll(new ArrayList<>(last5ids));
        last5commentators = last5commentators.stream().filter(u -> u.getCommentEmailsEnabled()).collect(Collectors.toList());
        pc.readAll(last5commentators.stream().map(u -> u.getCreatorid()).collect(Collectors.toList())).forEach(author -> {
            if (isCommentNotificationAllowed()) {
                Map<String, Object> model = new HashMap<String, Object>();
                String name = commentAuthor.getName();
                String body = Utils.markdownToHtml(comment.getComment());
                String pic = Utils.formatMessage("<img src='{0}' width='25'>", escapeHtmlAttribute(avatarRepository.getLink(commentAuthor, AvatarFormat.Square25)));
                String postURL = getServerURL() + parentPost.getPostLink(false, false);
                String subject = Utils.formatMessage(lang.get("notification.comment.subject"), name, parentPost.getTitle());
                model.put("subject", escapeHtml(subject));
                model.put("logourl", getSmallLogoUrl());
                model.put("heading", Utils.formatMessage(lang.get("notification.comment.heading"), Utils.formatMessage("<a href='{0}'>{1}</a>", postURL, escapeHtml(parentPost.getTitle()))));
                model.put("body", Utils.formatMessage("<h2>{0} {1}:</h2><div class='panel'>{2}</div>", pic, escapeHtml(name), body));
                emailer.sendEmail(Arrays.asList(((User) author).getEmail()), subject, compileEmailTemplate(model));
            }
        });
    }
}
Also used : Question(com.erudika.scoold.core.Question) Arrays(java.util.Arrays) Webhook(com.erudika.para.core.Webhook) ServletException(javax.servlet.ServletException) Date(java.util.Date) HttpUtils.getCookieValue(com.erudika.scoold.utils.HttpUtils.getCookieValue) JOSEException(com.nimbusds.jose.JOSEException) LoggerFactory(org.slf4j.LoggerFactory) Vote(com.erudika.para.core.Vote) Scanner(java.util.Scanner) ParaClient(com.erudika.para.client.ParaClient) Revision(com.erudika.scoold.core.Revision) StringUtils(org.apache.commons.lang3.StringUtils) Base64(org.apache.commons.codec.binary.Base64) MACVerifier(com.nimbusds.jose.crypto.MACVerifier) Matcher(java.util.regex.Matcher) Locale(java.util.Locale) Map(java.util.Map) ParseException(java.text.ParseException) Config(com.erudika.para.core.utils.Config) ConstraintViolation(javax.validation.ConstraintViolation) ValidationUtils(com.erudika.para.core.validation.ValidationUtils) ParaObject(com.erudika.para.core.ParaObject) Predicate(java.util.function.Predicate) HttpHeaders(org.springframework.http.HttpHeaders) AvatarFormat(com.erudika.scoold.utils.avatars.AvatarFormat) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ConfigObject(com.typesafe.config.ConfigObject) Set(java.util.Set) JWSAlgorithm(com.nimbusds.jose.JWSAlgorithm) UnapprovedQuestion(com.erudika.scoold.core.UnapprovedQuestion) Emailer(com.erudika.para.core.email.Emailer) JWSHeader(com.nimbusds.jose.JWSHeader) SignedJWT(com.nimbusds.jwt.SignedJWT) Collectors(java.util.stream.Collectors) Comment(com.erudika.scoold.core.Comment) List(java.util.List) JWSSigner(com.nimbusds.jose.JWSSigner) Tag(com.erudika.para.core.Tag) GravatarAvatarGenerator(com.erudika.scoold.utils.avatars.GravatarAvatarGenerator) Optional(java.util.Optional) DEFAULT_SPACE(com.erudika.scoold.core.Post.DEFAULT_SPACE) Para(com.erudika.para.core.utils.Para) Pattern(java.util.regex.Pattern) Feedback(com.erudika.scoold.core.Feedback) Sysprop(com.erudika.para.core.Sysprop) ParaObjectUtils(com.erudika.para.core.utils.ParaObjectUtils) ALL_MY_SPACES(com.erudika.scoold.core.Post.ALL_MY_SPACES) JWTClaimsSet(com.nimbusds.jwt.JWTClaimsSet) AvatarRepositoryProxy(com.erudika.scoold.utils.avatars.AvatarRepositoryProxy) HashMap(java.util.HashMap) Callable(java.util.concurrent.Callable) Pager(com.erudika.para.core.utils.Pager) ENTHUSIAST(com.erudika.scoold.core.Profile.Badge.ENTHUSIAST) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) LinkedHashMap(java.util.LinkedHashMap) Inject(javax.inject.Inject) HttpServletRequest(javax.servlet.http.HttpServletRequest) Named(javax.inject.Named) LinkedList(java.util.LinkedList) TEACHER(com.erudika.scoold.core.Profile.Badge.TEACHER) UnapprovedReply(com.erudika.scoold.core.UnapprovedReply) LinkedHashSet(java.util.LinkedHashSet) MACSigner(com.nimbusds.jose.crypto.MACSigner) JWSVerifier(com.nimbusds.jose.JWSVerifier) RegExUtils(org.apache.commons.lang3.RegExUtils) Logger(org.slf4j.Logger) AvatarRepository(com.erudika.scoold.utils.avatars.AvatarRepository) Address(com.erudika.para.core.Address) Post(com.erudika.scoold.core.Post) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) StringEscapeUtils(org.apache.commons.text.StringEscapeUtils) User(com.erudika.para.core.User) Utils(com.erudika.para.core.utils.Utils) Report(com.erudika.scoold.core.Report) Component(org.springframework.stereotype.Component) TreeMap(java.util.TreeMap) ScooldServer(com.erudika.scoold.ScooldServer) NumberUtils(org.apache.commons.lang3.math.NumberUtils) Reply(com.erudika.scoold.core.Reply) Collections(java.util.Collections) Profile(com.erudika.scoold.core.Profile) InputStream(java.io.InputStream) Comment(com.erudika.scoold.core.Comment) User(com.erudika.para.core.User) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Profile(com.erudika.scoold.core.Profile) LinkedHashMap(java.util.LinkedHashMap) Pager(com.erudika.para.core.utils.Pager) ParaObject(com.erudika.para.core.ParaObject) ConfigObject(com.typesafe.config.ConfigObject)

Example 2 with Config

use of com.erudika.para.core.utils.Config in project scoold by Erudika.

the class ScooldUtils method fullQuestionsSearch.

public List<Post> fullQuestionsSearch(String query, Pager... pager) {
    String typeFilter = Config._TYPE + ":(" + String.join(" OR ", Utils.type(Question.class), Utils.type(Reply.class), Utils.type(Comment.class)) + ")";
    String qs = StringUtils.isBlank(query) || query.startsWith("*") ? typeFilter : query + " AND " + typeFilter;
    List<ParaObject> mixedResults = pc.findQuery("", qs, pager);
    Predicate<ParaObject> isQuestion = obj -> obj.getType().equals(Utils.type(Question.class));
    Map<String, ParaObject> idsToQuestions = new HashMap<>(mixedResults.stream().filter(isQuestion).collect(Collectors.toMap(q -> q.getId(), q -> q)));
    Set<String> toRead = new LinkedHashSet<>();
    mixedResults.stream().filter(isQuestion.negate()).forEach(obj -> {
        if (!idsToQuestions.containsKey(obj.getParentid())) {
            toRead.add(obj.getParentid());
        }
    });
    // find all parent posts but this excludes parents of parents - i.e. won't work for comments in answers
    List<Post> parentPostsLevel1 = pc.readAll(new ArrayList<>(toRead));
    parentPostsLevel1.stream().filter(isQuestion).forEach(q -> idsToQuestions.put(q.getId(), q));
    toRead.clear();
    // read parents of parents if any
    parentPostsLevel1.stream().filter(isQuestion.negate()).forEach(obj -> {
        if (!idsToQuestions.containsKey(obj.getParentid())) {
            toRead.add(obj.getParentid());
        }
    });
    List<Post> parentPostsLevel2 = pc.readAll(new ArrayList<>(toRead));
    parentPostsLevel2.stream().forEach(q -> idsToQuestions.put(q.getId(), q));
    ArrayList<Post> results = new ArrayList<Post>(idsToQuestions.size());
    for (ParaObject result : idsToQuestions.values()) {
        if (result instanceof Post) {
            results.add((Post) result);
        }
    }
    return results;
}
Also used : Question(com.erudika.scoold.core.Question) Arrays(java.util.Arrays) Webhook(com.erudika.para.core.Webhook) ServletException(javax.servlet.ServletException) Date(java.util.Date) HttpUtils.getCookieValue(com.erudika.scoold.utils.HttpUtils.getCookieValue) JOSEException(com.nimbusds.jose.JOSEException) LoggerFactory(org.slf4j.LoggerFactory) Vote(com.erudika.para.core.Vote) Scanner(java.util.Scanner) ParaClient(com.erudika.para.client.ParaClient) Revision(com.erudika.scoold.core.Revision) StringUtils(org.apache.commons.lang3.StringUtils) Base64(org.apache.commons.codec.binary.Base64) MACVerifier(com.nimbusds.jose.crypto.MACVerifier) Matcher(java.util.regex.Matcher) Locale(java.util.Locale) Map(java.util.Map) ParseException(java.text.ParseException) Config(com.erudika.para.core.utils.Config) ConstraintViolation(javax.validation.ConstraintViolation) ValidationUtils(com.erudika.para.core.validation.ValidationUtils) ParaObject(com.erudika.para.core.ParaObject) Predicate(java.util.function.Predicate) HttpHeaders(org.springframework.http.HttpHeaders) AvatarFormat(com.erudika.scoold.utils.avatars.AvatarFormat) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ConfigObject(com.typesafe.config.ConfigObject) Set(java.util.Set) JWSAlgorithm(com.nimbusds.jose.JWSAlgorithm) UnapprovedQuestion(com.erudika.scoold.core.UnapprovedQuestion) Emailer(com.erudika.para.core.email.Emailer) JWSHeader(com.nimbusds.jose.JWSHeader) SignedJWT(com.nimbusds.jwt.SignedJWT) Collectors(java.util.stream.Collectors) Comment(com.erudika.scoold.core.Comment) List(java.util.List) JWSSigner(com.nimbusds.jose.JWSSigner) Tag(com.erudika.para.core.Tag) GravatarAvatarGenerator(com.erudika.scoold.utils.avatars.GravatarAvatarGenerator) Optional(java.util.Optional) DEFAULT_SPACE(com.erudika.scoold.core.Post.DEFAULT_SPACE) Para(com.erudika.para.core.utils.Para) Pattern(java.util.regex.Pattern) Feedback(com.erudika.scoold.core.Feedback) Sysprop(com.erudika.para.core.Sysprop) ParaObjectUtils(com.erudika.para.core.utils.ParaObjectUtils) ALL_MY_SPACES(com.erudika.scoold.core.Post.ALL_MY_SPACES) JWTClaimsSet(com.nimbusds.jwt.JWTClaimsSet) AvatarRepositoryProxy(com.erudika.scoold.utils.avatars.AvatarRepositoryProxy) HashMap(java.util.HashMap) Callable(java.util.concurrent.Callable) Pager(com.erudika.para.core.utils.Pager) ENTHUSIAST(com.erudika.scoold.core.Profile.Badge.ENTHUSIAST) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) LinkedHashMap(java.util.LinkedHashMap) Inject(javax.inject.Inject) HttpServletRequest(javax.servlet.http.HttpServletRequest) Named(javax.inject.Named) LinkedList(java.util.LinkedList) TEACHER(com.erudika.scoold.core.Profile.Badge.TEACHER) UnapprovedReply(com.erudika.scoold.core.UnapprovedReply) LinkedHashSet(java.util.LinkedHashSet) MACSigner(com.nimbusds.jose.crypto.MACSigner) JWSVerifier(com.nimbusds.jose.JWSVerifier) RegExUtils(org.apache.commons.lang3.RegExUtils) Logger(org.slf4j.Logger) AvatarRepository(com.erudika.scoold.utils.avatars.AvatarRepository) Address(com.erudika.para.core.Address) Post(com.erudika.scoold.core.Post) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) StringEscapeUtils(org.apache.commons.text.StringEscapeUtils) User(com.erudika.para.core.User) Utils(com.erudika.para.core.utils.Utils) Report(com.erudika.scoold.core.Report) Component(org.springframework.stereotype.Component) TreeMap(java.util.TreeMap) ScooldServer(com.erudika.scoold.ScooldServer) NumberUtils(org.apache.commons.lang3.math.NumberUtils) Reply(com.erudika.scoold.core.Reply) Collections(java.util.Collections) Profile(com.erudika.scoold.core.Profile) InputStream(java.io.InputStream) LinkedHashSet(java.util.LinkedHashSet) Comment(com.erudika.scoold.core.Comment) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Post(com.erudika.scoold.core.Post) ArrayList(java.util.ArrayList) ParaObject(com.erudika.para.core.ParaObject) UnapprovedReply(com.erudika.scoold.core.UnapprovedReply) Reply(com.erudika.scoold.core.Reply) Question(com.erudika.scoold.core.Question) UnapprovedQuestion(com.erudika.scoold.core.UnapprovedQuestion)

Example 3 with Config

use of com.erudika.para.core.utils.Config in project scoold by Erudika.

the class AdminController method importAccountsFromSO.

private void importAccountsFromSO(List<Map<String, Object>> objs) {
    logger.info("Importing {} accounts...", objs.size());
    List<Map<String, String>> toPatch = new LinkedList<>();
    Map<String, String> accounts = objs.stream().collect(Collectors.toMap(k -> ((Integer) k.get("accountId")).toString(), v -> (String) v.get("verifiedEmail")));
    // find all user objects even if there are more than 10000 users in the system
    Pager pager = new Pager(1, "_docid", false, Config.MAX_ITEMS_PER_PAGE);
    List<User> users;
    do {
        users = pc.findQuery(Utils.type(User.class), "*", pager);
        if (!users.isEmpty()) {
            users.stream().forEach(u -> {
                if (accounts.containsKey(u.getCreatorid())) {
                    u.setEmail(accounts.get(u.getCreatorid()));
                    Map<String, String> user = new HashMap<>();
                    user.put(Config._ID, u.getId());
                    user.put(Config._EMAIL, u.getEmail());
                    user.put(Config._IDENTIFIER, u.getEmail());
                    toPatch.add(user);
                }
            });
        }
        pc.invokePatch("_batch", toPatch, Map.class);
        toPatch.clear();
    } while (!users.isEmpty());
}
Also used : SIGNINLINK(com.erudika.scoold.ScooldServer.SIGNINLINK) Question(com.erudika.scoold.core.Question) RequestParam(org.springframework.web.bind.annotation.RequestParam) Arrays(java.util.Arrays) Webhook(com.erudika.para.core.Webhook) Date(java.util.Date) LoggerFactory(org.slf4j.LoggerFactory) ParaClient(com.erudika.para.client.ParaClient) StringUtils(org.apache.commons.lang3.StringUtils) ObjectReader(com.fasterxml.jackson.databind.ObjectReader) Model(org.springframework.ui.Model) Locale(java.util.Locale) Map(java.util.Map) TypeReference(com.fasterxml.jackson.core.type.TypeReference) ParseException(java.text.ParseException) Config(com.erudika.para.core.utils.Config) ZipEntry(java.util.zip.ZipEntry) ScooldUtils(com.erudika.scoold.utils.ScooldUtils) PostMapping(org.springframework.web.bind.annotation.PostMapping) ParaObject(com.erudika.para.core.ParaObject) ObjectWriter(com.fasterxml.jackson.databind.ObjectWriter) ConfigValue(com.typesafe.config.ConfigValue) MediaType(org.springframework.http.MediaType) Set(java.util.Set) StreamingResponseBody(org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody) UUID(java.util.UUID) JsonMapper(com.fasterxml.jackson.databind.json.JsonMapper) SignedJWT(com.nimbusds.jwt.SignedJWT) Collectors(java.util.stream.Collectors) Comment(com.erudika.scoold.core.Comment) List(java.util.List) Tag(com.erudika.para.core.Tag) Optional(java.util.Optional) ADMINLINK(com.erudika.scoold.ScooldServer.ADMINLINK) App(com.erudika.para.core.App) Sysprop(com.erudika.para.core.Sysprop) ZipOutputStream(java.util.zip.ZipOutputStream) ParaObjectUtils(com.erudika.para.core.utils.ParaObjectUtils) ZipInputStream(java.util.zip.ZipInputStream) JsonGenerator(com.fasterxml.jackson.core.JsonGenerator) RequestMapping(org.springframework.web.bind.annotation.RequestMapping) HashMap(java.util.HashMap) Pager(com.erudika.para.core.utils.Pager) Controller(org.springframework.stereotype.Controller) ArrayList(java.util.ArrayList) HOMEPAGE(com.erudika.scoold.ScooldServer.HOMEPAGE) Inject(javax.inject.Inject) LinkedHashMap(java.util.LinkedHashMap) MapperFeature(com.fasterxml.jackson.databind.MapperFeature) HttpServletRequest(javax.servlet.http.HttpServletRequest) FilterInputStream(java.io.FilterInputStream) GetMapping(org.springframework.web.bind.annotation.GetMapping) LinkedList(java.util.LinkedList) Logger(org.slf4j.Logger) Post(com.erudika.scoold.core.Post) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) ResponseBody(org.springframework.web.bind.annotation.ResponseBody) User(com.erudika.para.core.User) Utils(com.erudika.para.core.utils.Utils) DateUtils(org.apache.commons.lang3.time.DateUtils) TimeUnit(java.util.concurrent.TimeUnit) HttpStatus(org.springframework.http.HttpStatus) Reply(com.erudika.scoold.core.Reply) MultipartFile(org.springframework.web.multipart.MultipartFile) SerializationFeature(com.fasterxml.jackson.databind.SerializationFeature) ResponseEntity(org.springframework.http.ResponseEntity) Collections(java.util.Collections) Profile(com.erudika.scoold.core.Profile) InputStream(java.io.InputStream) User(com.erudika.para.core.User) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Pager(com.erudika.para.core.utils.Pager) Map(java.util.Map) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) LinkedList(java.util.LinkedList)

Example 4 with Config

use of com.erudika.para.core.utils.Config in project scoold by Erudika.

the class TagsController method rename.

@PostMapping
public String rename(@RequestParam String tag, @RequestParam String newtag, HttpServletRequest req, HttpServletResponse res, Model model) {
    Profile authUser = utils.getAuthUser(req);
    int count = 0;
    if (utils.isMod(authUser)) {
        Tag updated;
        Tag oldTag = new Tag(tag);
        Tag newTag = new Tag(newtag);
        Tag t = pc.read(Utils.type(Tag.class), oldTag.getId());
        if (t != null && !oldTag.getTag().equals(newTag.getTag())) {
            if (oldTag.getTag().equals(newTag.getTag())) {
                t.setCount(pc.getCount(Utils.type(Question.class), Collections.singletonMap(Config._TAGS, oldTag.getTag())).intValue());
                updated = pc.update(t);
            } else {
                pc.delete(t);
                t.setId(newtag);
                logger.info("User {} ({}) is renaming tag '{}' to '{}'.", authUser.getName(), authUser.getCreatorid(), oldTag.getTag(), t.getTag());
                t.setCount(pc.getCount(Utils.type(Question.class), Collections.singletonMap(Config._TAGS, newTag.getTag())).intValue());
                Pager pager = new Pager(1, "_docid", false, Config.MAX_ITEMS_PER_PAGE);
                List<Question> questionslist;
                do {
                    questionslist = pc.findTagged(Utils.type(Question.class), new String[] { oldTag.getTag() }, pager);
                    for (Question q : questionslist) {
                        t.setCount(t.getCount() + 1);
                        q.setTags(Optional.ofNullable(q.getTags()).orElse(Collections.emptyList()).stream().map(ts -> {
                            if (ts.equals(newTag.getTag())) {
                                t.setCount(t.getCount() - 1);
                            }
                            return ts.equals(oldTag.getTag()) ? t.getTag() : ts;
                        }).distinct().collect(Collectors.toList()));
                        logger.debug("Updated {} out of {} questions with new tag {}.", questionslist.size(), pager.getCount(), t.getTag());
                    }
                    if (!questionslist.isEmpty()) {
                        pc.updateAll(questionslist);
                    }
                } while (!questionslist.isEmpty());
                // overwrite new tag object
                updated = pc.create(t);
            }
            model.addAttribute("tag", updated);
            count = t.getCount();
        }
    }
    if (utils.isAjaxRequest(req)) {
        res.setStatus(200);
        res.setContentType("application/json");
        try {
            res.getWriter().println("{\"count\":" + count + ", \"tag\":\"" + new Tag(newtag).getTag() + "\"}");
        } catch (IOException ex) {
        }
        return "blank";
    } else {
        return "redirect:" + TAGSLINK + "?" + req.getQueryString();
    }
}
Also used : PathVariable(org.springframework.web.bind.annotation.PathVariable) SIGNINLINK(com.erudika.scoold.ScooldServer.SIGNINLINK) Question(com.erudika.scoold.core.Question) RequestParam(org.springframework.web.bind.annotation.RequestParam) LoggerFactory(org.slf4j.LoggerFactory) RequestMapping(org.springframework.web.bind.annotation.RequestMapping) ParaClient(com.erudika.para.client.ParaClient) Pager(com.erudika.para.core.utils.Pager) Controller(org.springframework.stereotype.Controller) Inject(javax.inject.Inject) HttpServletRequest(javax.servlet.http.HttpServletRequest) MediaType(javax.ws.rs.core.MediaType) Model(org.springframework.ui.Model) GetMapping(org.springframework.web.bind.annotation.GetMapping) Config(com.erudika.para.core.utils.Config) ScooldUtils(com.erudika.scoold.utils.ScooldUtils) PostMapping(org.springframework.web.bind.annotation.PostMapping) Logger(org.slf4j.Logger) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) ResponseBody(org.springframework.web.bind.annotation.ResponseBody) Collectors(java.util.stream.Collectors) Utils(com.erudika.para.core.utils.Utils) List(java.util.List) Tag(com.erudika.para.core.Tag) TAGSLINK(com.erudika.scoold.ScooldServer.TAGSLINK) Optional(java.util.Optional) Collections(java.util.Collections) Profile(com.erudika.scoold.core.Profile) Pager(com.erudika.para.core.utils.Pager) Question(com.erudika.scoold.core.Question) Tag(com.erudika.para.core.Tag) IOException(java.io.IOException) Profile(com.erudika.scoold.core.Profile) PostMapping(org.springframework.web.bind.annotation.PostMapping)

Example 5 with Config

use of com.erudika.para.core.utils.Config in project scoold by Erudika.

the class PeopleController method bulkEdit.

@PostMapping("/bulk-edit")
public String bulkEdit(@RequestParam(required = false) String[] selectedUsers, @RequestParam(required = false) final String[] selectedSpaces, HttpServletRequest req) {
    Profile authUser = utils.getAuthUser(req);
    boolean isAdmin = utils.isAdmin(authUser);
    String operation = req.getParameter("operation");
    String selection = req.getParameter("selection");
    if (isAdmin && ("all".equals(selection) || selectedUsers != null)) {
        // find all user objects even if there are more than 10000 users in the system
        Pager pager = new Pager(1, "_docid", false, Config.MAX_ITEMS_PER_PAGE);
        List<Profile> profiles;
        LinkedList<Map<String, Object>> toUpdate = new LinkedList<>();
        List<String> spaces = (selectedSpaces == null || selectedSpaces.length == 0) ? Collections.emptyList() : Arrays.asList(selectedSpaces);
        do {
            String query = (selection == null || "selected".equals(selection)) ? Config._ID + ":(\"" + String.join("\" \"", selectedUsers) + "\")" : "*";
            profiles = pc.findQuery(Utils.type(Profile.class), query, pager);
            profiles.stream().filter(p -> !utils.isMod(p)).forEach(p -> {
                if ("add".equals(operation)) {
                    p.getSpaces().addAll(spaces);
                } else if ("remove".equals(operation)) {
                    p.getSpaces().removeAll(spaces);
                } else {
                    p.setSpaces(new HashSet<String>(spaces));
                }
                Map<String, Object> profile = new HashMap<>();
                profile.put(Config._ID, p.getId());
                profile.put("spaces", p.getSpaces());
                toUpdate.add(profile);
            });
        } while (!profiles.isEmpty());
        // always patch outside the loop because we modify _docid values!!!
        LinkedList<Map<String, Object>> batch = new LinkedList<>();
        while (!toUpdate.isEmpty()) {
            batch.add(toUpdate.pop());
            if (batch.size() >= 100) {
                // partial batch update
                pc.invokePatch("_batch", batch, Map.class);
                batch.clear();
            }
        }
        if (!batch.isEmpty()) {
            pc.invokePatch("_batch", batch, Map.class);
        }
    }
    return "redirect:" + PEOPLELINK + (isAdmin ? "?" + req.getQueryString() : "");
}
Also used : SIGNINLINK(com.erudika.scoold.ScooldServer.SIGNINLINK) Arrays(java.util.Arrays) RequestParam(org.springframework.web.bind.annotation.RequestParam) RequestMapping(org.springframework.web.bind.annotation.RequestMapping) HashMap(java.util.HashMap) ParaClient(com.erudika.para.client.ParaClient) Pager(com.erudika.para.core.utils.Pager) Controller(org.springframework.stereotype.Controller) HashSet(java.util.HashSet) Inject(javax.inject.Inject) HttpServletRequest(javax.servlet.http.HttpServletRequest) Model(org.springframework.ui.Model) Map(java.util.Map) GetMapping(org.springframework.web.bind.annotation.GetMapping) LinkedList(java.util.LinkedList) Config(com.erudika.para.core.utils.Config) ScooldUtils(com.erudika.scoold.utils.ScooldUtils) PostMapping(org.springframework.web.bind.annotation.PostMapping) ParaObject(com.erudika.para.core.ParaObject) PEOPLELINK(com.erudika.scoold.ScooldServer.PEOPLELINK) HttpServletResponse(javax.servlet.http.HttpServletResponse) Utils(com.erudika.para.core.utils.Utils) HttpUtils(com.erudika.scoold.utils.HttpUtils) List(java.util.List) Collections(java.util.Collections) Profile(com.erudika.scoold.core.Profile) HashMap(java.util.HashMap) Profile(com.erudika.scoold.core.Profile) LinkedList(java.util.LinkedList) Pager(com.erudika.para.core.utils.Pager) ParaObject(com.erudika.para.core.ParaObject) HashMap(java.util.HashMap) Map(java.util.Map) HashSet(java.util.HashSet) PostMapping(org.springframework.web.bind.annotation.PostMapping)

Aggregations

ParaClient (com.erudika.para.client.ParaClient)6 Config (com.erudika.para.core.utils.Config)6 Pager (com.erudika.para.core.utils.Pager)6 Utils (com.erudika.para.core.utils.Utils)6 ParaObject (com.erudika.para.core.ParaObject)5 Tag (com.erudika.para.core.Tag)5 Profile (com.erudika.scoold.core.Profile)5 Sysprop (com.erudika.para.core.Sysprop)4 User (com.erudika.para.core.User)4 Question (com.erudika.scoold.core.Question)4 ScooldUtils (com.erudika.scoold.utils.ScooldUtils)4 Collections (java.util.Collections)4 List (java.util.List)4 Webhook (com.erudika.para.core.Webhook)3 ParaObjectUtils (com.erudika.para.core.utils.ParaObjectUtils)3 SIGNINLINK (com.erudika.scoold.ScooldServer.SIGNINLINK)3 LinkedList (java.util.LinkedList)3 Map (java.util.Map)3 Optional (java.util.Optional)3 Collectors (java.util.stream.Collectors)3