This commit is contained in:
@@ -121,7 +121,6 @@ func ListResources(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
q := strings.TrimSpace(r.URL.Query().Get("q"))
|
||||
typ := strings.TrimSpace(r.URL.Query().Get("type"))
|
||||
lang := strings.TrimSpace(r.URL.Query().Get("language"))
|
||||
catSlug := strings.TrimSpace(r.URL.Query().Get("category"))
|
||||
sort := strings.TrimSpace(r.URL.Query().Get("sort"))
|
||||
if sort == "" {
|
||||
@@ -139,8 +138,8 @@ func ListResources(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
base := `
|
||||
SELECT r.id, r.title, COALESCE(r.description,''), r.type, r.language, r.category_id, c.slug, c.name_zh_tw, c.name_zh_cn, c.name_en,
|
||||
COALESCE(r.cover_image,''), COALESCE(r.file_url,''), COALESCE(r.preview_url,''), COALESCE(r.external_url,''), COALESCE(r.body_text,''), COALESCE(r.badge_label,''),
|
||||
SELECT r.id, ` + resourceI18nColsSQL + `, r.type, COALESCE(r.language,'zh-TW'), r.category_id, c.slug, c.name_zh_tw, c.name_zh_cn, c.name_en,
|
||||
COALESCE(r.cover_image,''), COALESCE(r.file_url,''), COALESCE(r.preview_url,''), COALESCE(r.external_url,''), COALESCE(r.badge_label,''),
|
||||
r.is_downloadable, r.is_recommended, r.published_at, r.updated_at
|
||||
FROM resources r JOIN categories c ON c.id = r.category_id
|
||||
WHERE r.status = 'published' AND r.is_public = TRUE`
|
||||
@@ -155,17 +154,15 @@ func ListResources(w http.ResponseWriter, r *http.Request) {
|
||||
args = append(args, typ)
|
||||
cond += " AND r.type = $" + strconv.Itoa(len(args))
|
||||
}
|
||||
if lang != "" {
|
||||
args = append(args, lang)
|
||||
cond += " AND r.language = $" + strconv.Itoa(len(args))
|
||||
}
|
||||
if q != "" {
|
||||
pat := "%" + q + "%"
|
||||
start := len(args) + 1
|
||||
args = append(args, pat, pat, pat)
|
||||
cond += fmt.Sprintf(` AND (r.title ILIKE $%d OR r.description ILIKE $%d OR EXISTS (
|
||||
SELECT 1 FROM resource_tags rt JOIN tags t ON t.id = rt.tag_id WHERE rt.resource_id = r.id AND t.name ILIKE $%d))`,
|
||||
start, start+1, start+2)
|
||||
args = append(args, pat)
|
||||
cond += fmt.Sprintf(` AND (
|
||||
r.title_zh_tw ILIKE $%d OR r.title_zh_cn ILIKE $%d OR r.title_en ILIKE $%d OR
|
||||
r.description_zh_tw ILIKE $%d OR r.description_zh_cn ILIKE $%d OR r.description_en ILIKE $%d OR
|
||||
EXISTS (SELECT 1 FROM resource_tags rt JOIN tags t ON t.id = rt.tag_id WHERE rt.resource_id = r.id AND t.name ILIKE $%d))`,
|
||||
start, start, start, start, start, start, start)
|
||||
}
|
||||
tag := strings.TrimSpace(r.URL.Query().Get("tag"))
|
||||
if tag != "" {
|
||||
@@ -220,8 +217,8 @@ func listFeatured(w http.ResponseWriter, r *http.Request, extra string, order st
|
||||
limit = 50
|
||||
}
|
||||
sqlStr := `
|
||||
SELECT r.id, r.title, COALESCE(r.description,''), r.type, r.language, r.category_id, c.slug, c.name_zh_tw, c.name_zh_cn, c.name_en,
|
||||
COALESCE(r.cover_image,''), COALESCE(r.file_url,''), COALESCE(r.preview_url,''), COALESCE(r.external_url,''), COALESCE(r.body_text,''), COALESCE(r.badge_label,''),
|
||||
SELECT r.id, ` + resourceI18nColsSQL + `, r.type, COALESCE(r.language,'zh-TW'), r.category_id, c.slug, c.name_zh_tw, c.name_zh_cn, c.name_en,
|
||||
COALESCE(r.cover_image,''), COALESCE(r.file_url,''), COALESCE(r.preview_url,''), COALESCE(r.external_url,''), COALESCE(r.badge_label,''),
|
||||
r.is_downloadable, r.is_recommended, r.published_at, r.updated_at
|
||||
FROM resources r JOIN categories c ON c.id = r.category_id
|
||||
WHERE r.status = 'published' AND r.is_public = TRUE AND (` + extra + `)
|
||||
@@ -250,8 +247,8 @@ func GetResource(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
row := pool.QueryRow(r.Context(), `
|
||||
SELECT r.id, r.title, COALESCE(r.description,''), r.type, r.language, r.category_id, c.slug, c.name_zh_tw, c.name_zh_cn, c.name_en,
|
||||
COALESCE(r.cover_image,''), COALESCE(r.file_url,''), COALESCE(r.preview_url,''), COALESCE(r.external_url,''), COALESCE(r.body_text,''), COALESCE(r.badge_label,''),
|
||||
SELECT r.id, `+resourceI18nColsSQL+`, r.type, COALESCE(r.language,'zh-TW'), r.category_id, c.slug, c.name_zh_tw, c.name_zh_cn, c.name_en,
|
||||
COALESCE(r.cover_image,''), COALESCE(r.file_url,''), COALESCE(r.preview_url,''), COALESCE(r.external_url,''), COALESCE(r.badge_label,''),
|
||||
r.is_downloadable, r.is_recommended, r.published_at, r.updated_at
|
||||
FROM resources r JOIN categories c ON c.id = r.category_id
|
||||
WHERE r.id = $1 AND r.status = 'published' AND r.is_public = TRUE`, id)
|
||||
@@ -281,8 +278,8 @@ func RelatedResources(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
rows, err := pool.Query(r.Context(), `
|
||||
SELECT r.id, r.title, COALESCE(r.description,''), r.type, r.language, r.category_id, c.slug, c.name_zh_tw, c.name_zh_cn, c.name_en,
|
||||
COALESCE(r.cover_image,''), COALESCE(r.file_url,''), COALESCE(r.preview_url,''), COALESCE(r.external_url,''), COALESCE(r.body_text,''), COALESCE(r.badge_label,''),
|
||||
SELECT r.id, `+resourceI18nColsSQL+`, r.type, COALESCE(r.language,'zh-TW'), r.category_id, c.slug, c.name_zh_tw, c.name_zh_cn, c.name_en,
|
||||
COALESCE(r.cover_image,''), COALESCE(r.file_url,''), COALESCE(r.preview_url,''), COALESCE(r.external_url,''), COALESCE(r.badge_label,''),
|
||||
r.is_downloadable, r.is_recommended, r.published_at, r.updated_at
|
||||
FROM resources r JOIN categories c ON c.id = r.category_id
|
||||
WHERE r.status = 'published' AND r.is_public = TRUE AND r.category_id = $1 AND r.id <> $2
|
||||
@@ -409,15 +406,21 @@ func scanResourceRow(scanner interface {
|
||||
var updated time.Time
|
||||
var zhTW, zhCN, en *string
|
||||
var id uuid.UUID
|
||||
var texts resourceTextI18n
|
||||
err := scanner.Scan(
|
||||
&id, &dto.Title, &dto.Description, &dto.Type, &dto.Language, &dto.CategoryID, &dto.CategorySlug, &zhTW, &zhCN, &en,
|
||||
&dto.CoverImage, &dto.FileURL, &dto.PreviewURL, &dto.ExternalURL, &dto.BodyText, &dto.BadgeLabel,
|
||||
&id,
|
||||
&texts.TitleZhTw, &texts.TitleZhCn, &texts.TitleEn,
|
||||
&texts.DescZhTw, &texts.DescZhCn, &texts.DescEn,
|
||||
&texts.BodyZhTw, &texts.BodyZhCn, &texts.BodyEn,
|
||||
&dto.Type, &dto.Language, &dto.CategoryID, &dto.CategorySlug, &zhTW, &zhCN, &en,
|
||||
&dto.CoverImage, &dto.FileURL, &dto.PreviewURL, &dto.ExternalURL, &dto.BadgeLabel,
|
||||
&dto.IsDownloadable, &dto.IsRecommended, &pubAt, &updated,
|
||||
)
|
||||
if err != nil {
|
||||
return dto, err
|
||||
}
|
||||
dto.ID = id.String()
|
||||
dto.Title, dto.Description, dto.BodyText = texts.pick(r)
|
||||
dto.CategoryName = pickLangName(r, deref(zhTW), deref(zhCN), deref(en))
|
||||
if pubAt != nil {
|
||||
s := pubAt.UTC().Format(time.RFC3339)
|
||||
|
||||
Reference in New Issue
Block a user