feat: update find resource with linked memo amount (#1354)

* feat: update find resource with linked memo amount

* chore: remove unused test
pull/1355/head
boojack 2 years ago committed by GitHub
parent 28242d3268
commit 29f784cc20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,21 +0,0 @@
package getter
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestGetImage(t *testing.T) {
tests := []struct {
urlStr string
}{
{
urlStr: "https://star-history.com/bytebase.webp",
},
}
for _, test := range tests {
_, err := GetImage(test.urlStr)
require.NoError(t, err)
}
}

@ -244,16 +244,6 @@ func (s *Server) registerResourceRoutes(g *echo.Group) {
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to fetch resource list").SetInternal(err) return echo.NewHTTPError(http.StatusInternalServerError, "Failed to fetch resource list").SetInternal(err)
} }
for _, resource := range list {
memoResourceList, err := s.Store.FindMemoResourceList(ctx, &api.MemoResourceFind{
ResourceID: &resource.ID,
})
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find memo resource list").SetInternal(err)
}
resource.LinkedMemoAmount = len(memoResourceList)
}
return c.JSON(http.StatusOK, composeResponse(list)) return c.JSON(http.StatusOK, composeResponse(list))
}) })

@ -22,12 +22,13 @@ type resourceRaw struct {
UpdatedTs int64 UpdatedTs int64
// Domain specific fields // Domain specific fields
Filename string Filename string
Blob []byte Blob []byte
ExternalLink string ExternalLink string
Type string Type string
Size int64 Size int64
Visibility api.Visibility Visibility api.Visibility
LinkedMemoAmount int
} }
func (raw *resourceRaw) toResource() *api.Resource { func (raw *resourceRaw) toResource() *api.Resource {
@ -40,12 +41,13 @@ func (raw *resourceRaw) toResource() *api.Resource {
UpdatedTs: raw.UpdatedTs, UpdatedTs: raw.UpdatedTs,
// Domain specific fields // Domain specific fields
Filename: raw.Filename, Filename: raw.Filename,
Blob: raw.Blob, Blob: raw.Blob,
ExternalLink: raw.ExternalLink, ExternalLink: raw.ExternalLink,
Type: raw.Type, Type: raw.Type,
Size: raw.Size, Size: raw.Size,
Visibility: raw.Visibility, Visibility: raw.Visibility,
LinkedMemoAmount: raw.LinkedMemoAmount,
} }
} }
@ -278,32 +280,35 @@ func (s *Store) findResourceListImpl(ctx context.Context, tx *sql.Tx, find *api.
where, args := []string{"1 = 1"}, []interface{}{} where, args := []string{"1 = 1"}, []interface{}{}
if v := find.ID; v != nil { if v := find.ID; v != nil {
where, args = append(where, "id = ?"), append(args, *v) where, args = append(where, "resource.id = ?"), append(args, *v)
} }
if v := find.CreatorID; v != nil { if v := find.CreatorID; v != nil {
where, args = append(where, "creator_id = ?"), append(args, *v) where, args = append(where, "resource.creator_id = ?"), append(args, *v)
} }
if v := find.Filename; v != nil { if v := find.Filename; v != nil {
where, args = append(where, "filename = ?"), append(args, *v) where, args = append(where, "resource.filename = ?"), append(args, *v)
} }
if v := find.MemoID; v != nil { if v := find.MemoID; v != nil {
where, args = append(where, "id in (SELECT resource_id FROM memo_resource WHERE memo_id = ?)"), append(args, *v) where, args = append(where, "resource.id in (SELECT resource_id FROM memo_resource WHERE memo_id = ?)"), append(args, *v)
} }
fields := []string{"id", "filename", "external_link", "type", "size", "creator_id", "created_ts", "updated_ts"} fields := []string{"resource.id", "resource.filename", "resource.external_link", "resource.type", "resource.size", "resource.creator_id", "resource.created_ts", "resource.updated_ts"}
if find.GetBlob { if find.GetBlob {
fields = append(fields, "blob") fields = append(fields, "resource.blob")
} }
if s.profile.IsDev() { if s.profile.IsDev() {
fields = append(fields, "visibility") fields = append(fields, "resource.visibility")
} }
query := fmt.Sprintf(` query := fmt.Sprintf(`
SELECT SELECT
COUNT(DISTINCT memo_resource.memo_id) AS linked_memo_amount,
%s %s
FROM resource FROM resource
LEFT JOIN memo_resource ON resource.id = memo_resource.resource_id
WHERE %s WHERE %s
ORDER BY id DESC GROUP BY resource.id
ORDER BY resource.id DESC
`, strings.Join(fields, ", "), strings.Join(where, " AND ")) `, strings.Join(fields, ", "), strings.Join(where, " AND "))
rows, err := tx.QueryContext(ctx, query, args...) rows, err := tx.QueryContext(ctx, query, args...)
if err != nil { if err != nil {
@ -315,6 +320,7 @@ func (s *Store) findResourceListImpl(ctx context.Context, tx *sql.Tx, find *api.
for rows.Next() { for rows.Next() {
var resourceRaw resourceRaw var resourceRaw resourceRaw
dests := []interface{}{ dests := []interface{}{
&resourceRaw.LinkedMemoAmount,
&resourceRaw.ID, &resourceRaw.ID,
&resourceRaw.Filename, &resourceRaw.Filename,
&resourceRaw.ExternalLink, &resourceRaw.ExternalLink,
@ -333,7 +339,6 @@ func (s *Store) findResourceListImpl(ctx context.Context, tx *sql.Tx, find *api.
if err := rows.Scan(dests...); err != nil { if err := rows.Scan(dests...); err != nil {
return nil, FormatError(err) return nil, FormatError(err)
} }
resourceRawList = append(resourceRawList, &resourceRaw) resourceRawList = append(resourceRawList, &resourceRaw)
} }

Loading…
Cancel
Save