UploadStore.java

/*
 * Copyright © 2024-2025 The CTAN Team and individual authors
 *
 * This file is distributed under the 3-clause BSD license.
 * See file LICENSE for details.
 */
package org.ctan.site.stores;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.ctan.site.domain.catalogue.Upload;
import org.ctan.site.services.DateUtils;
import org.ctan.site.stores.base.AbstractStore;
import org.hibernate.SessionFactory;

import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;

/**
 * The class <code>UploadStore</code> contains the repository for votes.
 *
 * @author <a href="mailto:gene@ctan.org">Gerd Neugebauer</a>
 */
public class UploadStore extends AbstractStore<Upload> {

    /**
     * The class <code>StringsMap</code> contains a class for a mapping of
     * String to Object.
     */
    public static class StringsMap extends HashMap<String, Object> {

        /**
         * The field <code>serialVersionUID</code> contains the the version
         * number.
         */
        private static final long serialVersionUID = 1L;

        /**
         * The method <code>add</code> provides means to add a key/value pair.
         *
         * @param key the key
         * @param value the value
         * @return this
         */
        public StringsMap add(String key, Object value) {

            put(key, value);
            return this;
        }
    }

    /**
     * This is the constructor for the <code>UploadStore</code>.
     *
     * @param sessionFactory the session factory
     */
    public UploadStore(SessionFactory sessionFactory) {

        super(sessionFactory);
    }

    /**
     * The method <code>getStatistics</code> provides means to retrieve
     * statistics for the upload.
     *
     * @return the statistics
     */
    public Map<String, Integer> getStatistics() {

        currentSession().getCriteriaBuilder();
        var query = criteriaQuery();
        query.from(Upload.class);
        Map<String, Integer> map = new HashMap<String, Integer>();
        for (var it : list(query)) {
            var date = it.getDateCreated();
            if (date != null) {
                var f = DateUtils.LOCAL_DATE_FORMATTER_YYYY_MM.format(date);
                var val = map.get(f);
                if (val == null) {
                    map.put(f, 1);
                } else {
                    map.put(f, val + 1);
                }
            }
        }
        return map;
    }

    /**
     * {@inheritDoc}
     *
     * @see org.ctan.site.stores.base.AbstractStore#listQuery(java.lang.String,
     *     jakarta.persistence.criteria.CriteriaBuilder,
     *     jakarta.persistence.criteria.CriteriaQuery)
     */
    @Override
    protected Root<Upload> listQuery(String term, CriteriaBuilder cb,
        CriteriaQuery<Upload> query) {

        Root<Upload> root = query.from(Upload.class);
        if (term != null && !term.isBlank()) {
            var t = "%" + term.toLowerCase() + "%";
            query.where(cb.or(
                cb.like(cb.lower(root.get("pkg")), t),
                cb.like(cb.lower(root.get("uploader")), t)));
        }
        return root;
    }

    /**
     * {@inheritDoc}
     *
     * @see org.ctan.site.stores.base.AbstractStore#map(java.util.List)
     */
    @Override
    protected List<Map<String, Object>> map(List<Upload> list) {

        return list.stream()
            .map(it -> it.toMap())
            .collect(Collectors.toList());
    }
}