diff --git a/src/main/java/me/minidigger/hangar/db/dao/api/ProjectApiDao.java b/src/main/java/me/minidigger/hangar/db/dao/api/ProjectApiDao.java new file mode 100644 index 000000000..a92e41556 --- /dev/null +++ b/src/main/java/me/minidigger/hangar/db/dao/api/ProjectApiDao.java @@ -0,0 +1,47 @@ +package me.minidigger.hangar.db.dao.api; + +import org.jdbi.v3.sqlobject.config.RegisterBeanMapper; +import org.jdbi.v3.sqlobject.customizer.AllowUnusedBindings; +import org.jdbi.v3.sqlobject.statement.SqlQuery; +import org.jdbi.v3.stringtemplate4.UseStringTemplateEngine; +import org.springframework.stereotype.Repository; + +import java.util.List; + +import me.minidigger.hangar.model.Category; +import me.minidigger.hangar.model.generated.Project; +import me.minidigger.hangar.model.generated.Tag; + +@Repository +@RegisterBeanMapper(Project.class) +public interface ProjectApiDao { + + @UseStringTemplateEngine + @SqlQuery("SELECT p.created_at," + + " p.plugin_id," + + " p.name," + + " p.owner_name," + + " p.slug," + + " p.promoted_versions," + + " p.views," + + " p.downloads," + + " p.recent_views," + + " p.recent_downloads," + + " p.stars," + + " p.watchers," + + " p.category," + + " p.description," + + " COALESCE(p.last_updated, p.created_at) AS last_updated," + + " p.visibility, " +//"" + + " ps.homepage," + + " ps.issues," + + " ps.source," + + " ps.support," + + " ps.license_name," + + " ps.license_url," + + " ps.forum_sync" + + " FROM home_projects p" + + " JOIN projects ps ON p.id = ps.id") // TODO add all the missing filters + @AllowUnusedBindings // todo remove + List listProjects(String pluginId, List categories, List tags, String query, String owner, boolean seeHidden, Long requesterId, String ordering, long limit, long offset); +} diff --git a/src/main/java/me/minidigger/hangar/service/project/ProjectService.java b/src/main/java/me/minidigger/hangar/service/project/ProjectService.java index 91e34bd39..c2cd3bd72 100644 --- a/src/main/java/me/minidigger/hangar/service/project/ProjectService.java +++ b/src/main/java/me/minidigger/hangar/service/project/ProjectService.java @@ -5,6 +5,7 @@ import me.minidigger.hangar.db.dao.HangarDao; import me.minidigger.hangar.db.dao.ProjectDao; import me.minidigger.hangar.db.dao.UserDao; import me.minidigger.hangar.db.dao.VisibilityDao; +import me.minidigger.hangar.db.dao.api.ProjectApiDao; import me.minidigger.hangar.db.model.ProjectVersionsTable; import me.minidigger.hangar.db.model.ProjectVisibilityChangesTable; import me.minidigger.hangar.db.model.ProjectsTable; @@ -49,15 +50,17 @@ public class ProjectService { private final HangarDao projectDao; private final HangarDao userDao; private final HangarDao visibilityDao; + private final HangarDao projectApiDao; private final UserService userService; private final FlagService flagService; @Autowired - public ProjectService(HangarConfig hangarConfig, HangarDao projectDao, HangarDao userDao, HangarDao visibilityDao, UserService userService, FlagService flagService) { + public ProjectService(HangarConfig hangarConfig, HangarDao projectDao, HangarDao userDao, HangarDao visibilityDao, HangarDao projectApiDao, UserService userService, FlagService flagService) { this.hangarConfig = hangarConfig; this.projectDao = projectDao; this.userDao = userDao; this.visibilityDao = visibilityDao; + this.projectApiDao = projectApiDao; this.userService = userService; this.flagService = flagService; } @@ -192,8 +195,16 @@ public class ProjectService { return projectDao.get().getUnhealthyProjects(hangarConfig.projects.getStaleAge().toMillis()); } - public List getProjects(String pluginId, List categories, List parsedTags, String query, String owner, boolean seeHidden, Long requesterId, ProjectSortingStrategy sort, boolean relevance, long limit, long offset) { - return List.of(getProjectApi("test")); // TODO getProjects query + public List getProjects(String pluginId, List categories, List tags, String query, String owner, boolean seeHidden, Long requesterId, ProjectSortingStrategy sort, boolean relevance, long limit, long offset) { + String ordering; + if (relevance && query != null && !query.isEmpty()) { + // TODO implement ordering by relevance, see APIVV2Queries#199 + ordering = sort.getSql(); + } else { + ordering = sort.getSql(); + } + + return projectApiDao.get().listProjects(pluginId, categories, tags, query, owner, seeHidden, requesterId, ordering, limit, offset); } public long countProjects(String pluginId, List categories, List parsedTags, String query, String owner, boolean seeHidden, Long requesterId) {