init_database_logic.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package base
  2. import (
  3. "context"
  4. "errors"
  5. "time"
  6. "github.com/suyuan32/simple-admin-common/enum/errorcode"
  7. "github.com/zeromicro/go-zero/core/errorx"
  8. "google.golang.org/grpc/codes"
  9. "google.golang.org/grpc/status"
  10. "github.com/suyuan32/simple-admin-common/i18n"
  11. "github.com/suyuan32/simple-admin-core/api/internal/svc"
  12. "github.com/suyuan32/simple-admin-core/api/internal/types"
  13. "github.com/suyuan32/simple-admin-core/rpc/types/core"
  14. "github.com/zeromicro/go-zero/core/logx"
  15. )
  16. type InitDatabaseLogic struct {
  17. logx.Logger
  18. ctx context.Context
  19. svcCtx *svc.ServiceContext
  20. }
  21. func NewInitDatabaseLogic(ctx context.Context, svcCtx *svc.ServiceContext) *InitDatabaseLogic {
  22. return &InitDatabaseLogic{
  23. Logger: logx.WithContext(ctx),
  24. ctx: ctx,
  25. svcCtx: svcCtx,
  26. }
  27. }
  28. func (l *InitDatabaseLogic) InitDatabase() (resp *types.BaseMsgResp, err error) {
  29. if !l.svcCtx.Config.ProjectConf.AllowInit {
  30. return nil, errorx.NewCodeInvalidArgumentError(i18n.PermissionDeny)
  31. }
  32. result, err := l.svcCtx.CoreRpc.InitDatabase(l.ctx, &core.Empty{})
  33. if err != nil && !errors.Is(err, status.Error(codes.DeadlineExceeded, "context deadline exceeded")) {
  34. return nil, err
  35. } else if errors.Is(err, status.Error(codes.DeadlineExceeded, "context deadline exceeded")) {
  36. for {
  37. // wait 10 second for initialization
  38. time.Sleep(time.Second * 5)
  39. if initState, err := l.svcCtx.Redis.Get(context.Background(), "INIT:DATABASE:STATE").Result(); err == nil {
  40. if initState == "1" {
  41. return nil, errorx.NewCodeError(errorcode.InvalidArgument,
  42. l.svcCtx.Trans.Trans(l.ctx, i18n.AlreadyInit))
  43. }
  44. } else {
  45. return nil, errorx.NewCodeError(errorcode.Internal,
  46. l.svcCtx.Trans.Trans(l.ctx, i18n.RedisError))
  47. }
  48. if errMsg, err := l.svcCtx.Redis.Get(context.Background(), "INIT:DATABASE:ERROR").Result(); err == nil {
  49. if errMsg != "" {
  50. return nil, errorx.NewCodeError(errorcode.Internal, errMsg)
  51. }
  52. } else {
  53. return nil, errorx.NewCodeError(errorcode.Internal,
  54. l.svcCtx.Trans.Trans(l.ctx, i18n.RedisError))
  55. }
  56. }
  57. }
  58. err = l.svcCtx.Casbin.LoadPolicy()
  59. if err != nil {
  60. logx.Errorw("failed to load Casbin Policy", logx.Field("detail", err))
  61. return nil, errorx.NewCodeInternalError(i18n.DatabaseError)
  62. }
  63. return &types.BaseMsgResp{Msg: l.svcCtx.Trans.Trans(l.ctx, result.Msg)}, nil
  64. }