You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudreve/inventory/direct_link.go

80 lines
2.3 KiB

package inventory
import (
"context"
"github.com/cloudreve/Cloudreve/v4/ent"
"github.com/cloudreve/Cloudreve/v4/ent/directlink"
"github.com/cloudreve/Cloudreve/v4/ent/schema"
"github.com/cloudreve/Cloudreve/v4/pkg/conf"
"github.com/cloudreve/Cloudreve/v4/pkg/hashid"
)
type (
DirectLinkClient interface {
TxOperator
// GetByNameID get direct link by name and id
GetByNameID(ctx context.Context, id int, name string) (*ent.DirectLink, error)
// GetByID get direct link by id
GetByID(ctx context.Context, id int) (*ent.DirectLink, error)
// Delete delete direct link by id
Delete(ctx context.Context, id int) error
}
LoadDirectLinkFile struct{}
)
func NewDirectLinkClient(client *ent.Client, dbType conf.DBType, hasher hashid.Encoder) DirectLinkClient {
return &directLinkClient{
client: client,
hasher: hasher,
maxSQlParam: sqlParamLimit(dbType),
}
}
type directLinkClient struct {
maxSQlParam int
client *ent.Client
hasher hashid.Encoder
}
func (c *directLinkClient) SetClient(newClient *ent.Client) TxOperator {
return &directLinkClient{client: newClient, hasher: c.hasher, maxSQlParam: c.maxSQlParam}
}
func (c *directLinkClient) GetClient() *ent.Client {
return c.client
}
func (d *directLinkClient) GetByID(ctx context.Context, id int) (*ent.DirectLink, error) {
return withDirectLinkEagerLoading(ctx, d.client.DirectLink.Query().Where(directlink.ID(id))).
First(ctx)
}
func (d *directLinkClient) GetByNameID(ctx context.Context, id int, name string) (*ent.DirectLink, error) {
res, err := withDirectLinkEagerLoading(ctx, d.client.DirectLink.Query().Where(directlink.ID(id), directlink.Name(name))).
First(ctx)
if err != nil {
return nil, err
}
// Increase download counter
_, _ = d.client.DirectLink.Update().Where(directlink.ID(res.ID)).SetDownloads(res.Downloads + 1).Save(ctx)
return res, nil
}
func (d *directLinkClient) Delete(ctx context.Context, id int) error {
ctx = schema.SkipSoftDelete(ctx)
_, err := d.client.DirectLink.Delete().Where(directlink.ID(id)).Exec(ctx)
return err
}
func withDirectLinkEagerLoading(ctx context.Context, q *ent.DirectLinkQuery) *ent.DirectLinkQuery {
if v, ok := ctx.Value(LoadDirectLinkFile{}).(bool); ok && v {
q.WithFile(func(m *ent.FileQuery) {
withFileEagerLoading(ctx, m)
})
}
return q
}