feat: add tenant commands
This commit is contained in:
@@ -44,6 +44,10 @@ func (d *DiscoverMedias) RunE(from, to string) error {
|
||||
return errors.Wrapf(err, "glob videos: %s", from)
|
||||
}
|
||||
|
||||
if err := d.ensureDirectory(to); err != nil {
|
||||
return errors.Wrapf(err, "ensure directory: %s", to)
|
||||
}
|
||||
|
||||
store, err := media_store.NewStore(to)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "new store: %s", to)
|
||||
@@ -271,7 +275,7 @@ func (d *DiscoverMedias) ffmpegVideoToPoster(video string, output string) error
|
||||
// ffmpeg -i input_video.mp4 -ss N -vframes 1 -vf "scale=width:height" output_image.jpg
|
||||
args := []string{
|
||||
"-i", video,
|
||||
"-ss", "00:01:00",
|
||||
"-ss", "00:00:01",
|
||||
"-vframes", "1",
|
||||
"-vf", "scale=640:360",
|
||||
output,
|
||||
34
backend/modules/commands/tenant/create.go
Normal file
34
backend/modules/commands/tenant/create.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package tenant
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"backend/modules/users"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// @provider
|
||||
type Create struct {
|
||||
userSvc *users.Service
|
||||
log *log.Entry `inject:"false"`
|
||||
}
|
||||
|
||||
// Prepare
|
||||
func (d *Create) Prepare() error {
|
||||
d.log = log.WithField("module", "tenants.create")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Create) RunE(name, slug string) error {
|
||||
d.log.Infof("create tenant %s(%s)", name, slug)
|
||||
|
||||
err := d.userSvc.CreateTenant(context.Background(), name, slug)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "create tenant: %s(%s)", name, slug)
|
||||
}
|
||||
|
||||
d.log.Infof("create tenant success: %s(%s)", name, slug)
|
||||
return nil
|
||||
}
|
||||
35
backend/modules/commands/tenant/expire.go
Normal file
35
backend/modules/commands/tenant/expire.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package tenant
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"backend/modules/users"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// @provider
|
||||
type Expire struct {
|
||||
userSvc *users.Service
|
||||
log *log.Entry `inject:"false"`
|
||||
}
|
||||
|
||||
// Prepare
|
||||
func (d *Expire) Prepare() error {
|
||||
d.log = log.WithField("module", "tenants.create")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Expire) RunE(slug string, expire time.Time) error {
|
||||
d.log.Infof("renew tenant %s expire at s %s", slug, expire)
|
||||
|
||||
err := d.userSvc.SetTenantExpireAtBySlug(context.Background(), slug, expire)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "renew tenant: %s expire at %s", slug, expire)
|
||||
}
|
||||
|
||||
d.log.Infof("renew tenant success: %s expire at %s", slug, expire)
|
||||
return nil
|
||||
}
|
||||
40
backend/modules/commands/tenant/provider.gen.go
Executable file
40
backend/modules/commands/tenant/provider.gen.go
Executable file
@@ -0,0 +1,40 @@
|
||||
package tenant
|
||||
|
||||
import (
|
||||
"backend/modules/users"
|
||||
|
||||
"git.ipao.vip/rogeecn/atom/container"
|
||||
"git.ipao.vip/rogeecn/atom/utils/opt"
|
||||
)
|
||||
|
||||
func Provide(opts ...opt.Option) error {
|
||||
if err := container.Container.Provide(func(
|
||||
userSvc *users.Service,
|
||||
) (*Create, error) {
|
||||
obj := &Create{
|
||||
userSvc: userSvc,
|
||||
}
|
||||
if err := obj.Prepare(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return obj, nil
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := container.Container.Provide(func(
|
||||
userSvc *users.Service,
|
||||
) (*Expire, error) {
|
||||
obj := &Expire{
|
||||
userSvc: userSvc,
|
||||
}
|
||||
if err := obj.Prepare(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return obj, nil
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
package medias
|
||||
|
||||
import (
|
||||
"backend/common/consts"
|
||||
"backend/common/errorx"
|
||||
"backend/providers/jwt"
|
||||
|
||||
"github.com/gofiber/fiber/v3"
|
||||
. "github.com/spf13/cast"
|
||||
@@ -18,10 +20,9 @@ func (c *Controller) List(ctx fiber.Ctx) error {
|
||||
if err := ctx.Bind().Body(&filter); err != nil {
|
||||
return ctx.Status(fiber.StatusBadRequest).JSON(errorx.RequestParseError)
|
||||
}
|
||||
claim := ctx.Locals(consts.CtxKeyClaim).(*jwt.Claims)
|
||||
|
||||
tenantId, userId := ToInt64(ctx.Locals("tenantId")), ToInt64(ctx.Locals("userId"))
|
||||
|
||||
items, err := c.svc.List(ctx.Context(), tenantId, userId, &filter)
|
||||
items, err := c.svc.List(ctx.Context(), claim.TenantID, claim.UserID, &filter)
|
||||
if err != nil {
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.InternalError)
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ func (r *Router) Prepare() error {
|
||||
|
||||
func (r *Router) Register() any {
|
||||
r.group.Get("", r.controller.List)
|
||||
r.group.Get("{id}", r.controller.Show)
|
||||
|
||||
return r.app
|
||||
}
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
package middlewares
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"backend/common/consts"
|
||||
|
||||
"github.com/gofiber/fiber/v3"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func (f *Middlewares) JwtParse(c fiber.Ctx) error {
|
||||
func (f *Middlewares) ParseJWT(c fiber.Ctx) error {
|
||||
tokens := c.GetReqHeaders()["Authorization"]
|
||||
if len(tokens) == 0 {
|
||||
return c.Next()
|
||||
@@ -22,13 +20,20 @@ func (f *Middlewares) JwtParse(c fiber.Ctx) error {
|
||||
}
|
||||
|
||||
// query user
|
||||
user, err := f.userSvc.GetByOpenID(c.Context(), claim.ID)
|
||||
user, err := f.userSvc.GetByOpenID(c.Context(), claim.OpenID)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to get user")
|
||||
}
|
||||
claim.UserID = user.ID
|
||||
|
||||
c.SetUserContext(context.WithValue(c.UserContext(), consts.CtxKeyJwt, token))
|
||||
c.SetUserContext(context.WithValue(c.UserContext(), consts.CtxKeySession, user))
|
||||
tenantId, err := f.userSvc.GetTenantIDBySlug(c.Context(), claim.Tenant)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to get tenant")
|
||||
}
|
||||
claim.TenantID = tenantId
|
||||
|
||||
c.Locals(consts.CtxKeyJwt, token)
|
||||
c.Locals(consts.CtxKeyClaim, claim)
|
||||
|
||||
return c.Next()
|
||||
}
|
||||
|
||||
@@ -11,6 +11,10 @@ import (
|
||||
)
|
||||
|
||||
func (f *Middlewares) WeChatAuthUserInfo(c fiber.Ctx) error {
|
||||
if len(c.GetReqHeaders()["Authorization"]) != 0 {
|
||||
return c.Next()
|
||||
}
|
||||
|
||||
state := c.Query("state")
|
||||
code := c.Query("code")
|
||||
|
||||
@@ -40,13 +44,16 @@ func (f *Middlewares) WeChatAuthUserInfo(c fiber.Ctx) error {
|
||||
}
|
||||
|
||||
var oauthInfo pg.UserOAuth
|
||||
copier.Copy(&oauthInfo, token)
|
||||
if err := copier.Copy(&oauthInfo, token); err != nil {
|
||||
return errors.Wrap(err, "failed to copy oauth info")
|
||||
}
|
||||
|
||||
user, err := f.userSvc.GetOrNew(c.Context(), tenantId, token.Openid, oauthInfo)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to get user")
|
||||
}
|
||||
|
||||
claim := f.jwt.CreateClaims(jwt.BaseClaims{UID: uint64(user.ID)})
|
||||
claim := f.jwt.CreateClaims(jwt.BaseClaims{OpenID: user.OpenID})
|
||||
claim.ID = user.OpenID
|
||||
jwtToken, err := f.jwt.CreateToken(claim)
|
||||
if err != nil {
|
||||
|
||||
@@ -208,3 +208,44 @@ func (svc *Service) GetTenantIDBySlug(ctx context.Context, slug string) (int64,
|
||||
}
|
||||
return id, nil
|
||||
}
|
||||
|
||||
// CreateTenant
|
||||
func (svc *Service) CreateTenant(ctx context.Context, name, slug string) error {
|
||||
log := svc.log.WithField("method", "CreateTenant")
|
||||
|
||||
expireAt := time.Now().Add(time.Hour * 24 * 366)
|
||||
// 仅保留天数
|
||||
expireAt = time.Date(expireAt.Year(), expireAt.Month(), expireAt.Day(), 0, 0, 0, 0, expireAt.Location())
|
||||
|
||||
tbl := table.Tenants
|
||||
stmt := tbl.
|
||||
INSERT(tbl.Name, tbl.Slug, tbl.ExpireAt).
|
||||
VALUES(String(name), String(slug), TimestampT(expireAt)).
|
||||
ON_CONFLICT(tbl.Slug).
|
||||
DO_NOTHING()
|
||||
log.Debug(stmt.DebugSql())
|
||||
|
||||
if _, err := stmt.ExecContext(ctx, svc.db); err != nil {
|
||||
return errors.Wrapf(err, "create tenant: %s(%s)", name, slug)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetTenantExpireAtBySlug
|
||||
func (svc *Service) SetTenantExpireAtBySlug(ctx context.Context, slug string, expire time.Time) error {
|
||||
log := svc.log.WithField("method", "SetTenantExpireAtBySlug")
|
||||
|
||||
tbl := table.Tenants
|
||||
stmt := tbl.
|
||||
UPDATE(tbl.ExpireAt).
|
||||
SET(TimestampT(expire)).
|
||||
WHERE(tbl.Slug.EQ(String(slug)))
|
||||
log.Debug(stmt.DebugSql())
|
||||
|
||||
if _, err := stmt.ExecContext(ctx, svc.db); err != nil {
|
||||
return errors.Wrapf(err, "renew tenant: %s expire at %s", slug, expire)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user