implemented AmGetPublishPosts to get the posts published to the front page
This commit is contained in:
+68
-2
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Amsterdam Web Communities System
|
* Amsterdam Web Communities System
|
||||||
* Copyright (c) 2025 Erbosoft Metaverse Design Solutions, All Rights Reserved
|
* Copyright (c) 2025-2026 Erbosoft Metaverse Design Solutions, All Rights Reserved
|
||||||
*
|
*
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
@@ -15,6 +15,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.erbosoft.com/amy/amsterdam/config"
|
"git.erbosoft.com/amy/amsterdam/config"
|
||||||
@@ -407,7 +408,7 @@ func AmGetPost(ctx context.Context, postId int64) (*PostHeader, error) {
|
|||||||
return &(dbdata[0]), nil
|
return &(dbdata[0]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
/* AmGetPostRage gets a range of posts from a topic by post numbers.
|
/* AmGetPostRange gets a range of posts from a topic by post numbers.
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* ctx - Standard Go context value.
|
* ctx - Standard Go context value.
|
||||||
* topic - Topic pointer to retrieve posts from.
|
* topic - Topic pointer to retrieve posts from.
|
||||||
@@ -524,3 +525,68 @@ func AmNewPost(ctx context.Context, conf *Conference, topic *Topic, user *User,
|
|||||||
|
|
||||||
return hdr, nil
|
return hdr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* AmGetPublishedPosts gets all posts published to the front page, up to the maximum number configured in the database.
|
||||||
|
* Parameters:
|
||||||
|
* ctx - Standard Go context value.
|
||||||
|
* Returns:
|
||||||
|
* Array of post headers, or nil.
|
||||||
|
* Standard Go error status.
|
||||||
|
*/
|
||||||
|
func AmGetPublishedPosts(ctx context.Context) ([]*PostHeader, error) {
|
||||||
|
// Read the globals.
|
||||||
|
gv, err := AmGlobals(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// Read the published posts.
|
||||||
|
rs, err := amdb.QueryContext(ctx, "SELECT postid FROM postpublish ORDER BY on_date DESC")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// Extract post IDs to an array.
|
||||||
|
pids := make([]int64, gv.FrontPagePosts)
|
||||||
|
i := 0
|
||||||
|
for i < int(gv.FrontPagePosts) && rs.Next() {
|
||||||
|
if err = rs.Scan(&(pids[i])); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
if i < int(gv.FrontPagePosts) {
|
||||||
|
pids = pids[:i] // truncate if we have fewer posts than spaces
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the post IDs to build a SQL statement.
|
||||||
|
pidStrs := make([]string, len(pids))
|
||||||
|
for i, pid := range pids {
|
||||||
|
pidStrs[i] = fmt.Sprintf("%d", pid)
|
||||||
|
}
|
||||||
|
sql := fmt.Sprintf("SELECT * FROM posts WHERE postid IN (%s)", strings.Join(pidStrs, ", "))
|
||||||
|
|
||||||
|
// Use the SQL to read in all the post headers using a single database query.
|
||||||
|
var data []PostHeader
|
||||||
|
if err = amdb.SelectContext(ctx, &data, sql); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if len(data) < len(pids) {
|
||||||
|
return nil, errors.New("internal error reading post headers")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build the return array by making sure we point to the post headers in the same order the post IDs were returned.
|
||||||
|
rc := make([]*PostHeader, len(pids))
|
||||||
|
q := 0
|
||||||
|
for i := range data {
|
||||||
|
for j := range pids {
|
||||||
|
if data[i].PostId == pids[j] {
|
||||||
|
rc[j] = &(data[i])
|
||||||
|
q++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if q < len(pids) {
|
||||||
|
return nil, errors.New("internal error generating output")
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc, nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user