service.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "go-micro.dev/v4/auth"
  7. "go-micro.dev/v4/metadata"
  8. "reflect"
  9. req "sghgogs.com/sghblog/authorization-service/domain/model/request"
  10. "sghgogs.com/sghblog/authorization-service/domain/repository"
  11. pb "sghgogs.com/sghblog/authorization-service/proto"
  12. "sghgogs.com/sghblog/authorization-service/utils/authutil"
  13. "sghgogs.com/sghblog/common/errorcode"
  14. "strconv"
  15. "strings"
  16. "time"
  17. )
  18. type IService interface {
  19. AdminLogin(string, string) (pb.AdminUser, error)
  20. GetAdminUser(int64) (*pb.AdminUser, error)
  21. ListAdminUsers(*pb.ListAdminUsersRequest) ([]*pb.AdminUser, int64, error)
  22. CreateAdminUser(*pb.CreateAdminUserRequest) error
  23. DeleteAdminUser(context.Context, int64) error
  24. UpdateAdminUser(*pb.UpdateAdminUserRequest) error
  25. ToggleAdminUser(*pb.ToggleAdminUserRequest) error
  26. RetrieveEnabledUsers() ([]*pb.AdminUser, error)
  27. // RevokeAdminUserWithRole(context.Context, *pb.RevokeAdminUserWithRoleRequest) error
  28. // GetUnassignedAdminRoles(int64) ([]*pb.AdminRole, int64, error)
  29. // GetAdminUserAssociatedRoles(string) ([]*pb.AdminBase, error)
  30. GetAdminRole(int64) (*pb.AdminRole, error)
  31. CreateAdminRole(context.Context, *pb.CreateAdminRoleRequest) error
  32. UpdateAdminRole(*pb.UpdateAdminRoleRequest) error
  33. ListAdminRoles(*pb.ListAdminRolesRequest) ([]*pb.AdminRole, int64, error)
  34. RetrieveEnabledRoles() ([]*pb.AdminRole, error)
  35. ToggleAdminRole(*pb.ToggleAdminRoleRequest) error
  36. DeleteAdminRole(int64) error
  37. GetAdminPermissionList(*pb.GetAdminPermissionListRequest) ([]*pb.AdminPermission, int64, error)
  38. GetAdminPermission(*pb.GetAdminPermissionRequest) (pb.AdminPermission, error)
  39. GetAdminPermissionAll() ([]req.AdminPermission, error)
  40. CreateAdminPermission(context.Context, *pb.CreateAdminPermissionRequest) error
  41. UpdateAdminPermission(context.Context, *pb.UpdateAdminPermissionRequest) error
  42. DeleteAdminPermission(*pb.DeleteAdminPermissionRequest) error
  43. ToggleAdminPermission(*pb.ToggleAdminPermissionRequest) error
  44. // AssociateUserWithRole(context.Context, *pb.AssociateAdminUserWithRoleRequest) error
  45. // UpdateAdminUserProfileInfoRequest(*pb.UpdateAdminUserProfileInfoRequest) error
  46. }
  47. func ConvertTimeToInt64(t time.Time) int64 {
  48. return t.Unix()
  49. }
  50. func ConvertInt64ToTime(seconds int64) time.Time {
  51. return time.Unix(seconds, 0)
  52. }
  53. func FindStructDiff(oldData, newData interface{}) (string, string) {
  54. // var diffs []Diff
  55. // Convert structs to JSON for easy comparison
  56. oldJSON, _ := json.Marshal(oldData)
  57. newJSON, _ := json.Marshal(newData)
  58. // Unmarshal JSON back to map for easier comparison
  59. var oldMap, newMap map[string]interface{}
  60. _ = json.Unmarshal(oldJSON, &oldMap)
  61. _ = json.Unmarshal(newJSON, &newMap)
  62. // Compare the fields
  63. old_data := make(map[string]interface{})
  64. new_data := make(map[string]interface{})
  65. for key, oldValue := range oldMap {
  66. if _, ok := newMap[key]; ok {
  67. newValue, exists := newMap[key]
  68. if !exists || !reflect.DeepEqual(oldValue, newValue) {
  69. old_data[key] = oldValue
  70. new_data[key] = newValue
  71. }
  72. }
  73. }
  74. oldStr, _ := json.Marshal(old_data)
  75. newStr, _ := json.Marshal(new_data)
  76. fmt.Println(string(oldStr), string(newStr))
  77. return string(oldStr), string(newStr)
  78. }
  79. func ParseMetadata(ctx context.Context) (int64, string, string, string) {
  80. md, b := metadata.FromContext(ctx)
  81. if !b {
  82. return 0, "", "", ""
  83. }
  84. authHeader, ok := md["Authorization"]
  85. if !ok || !strings.HasPrefix(authHeader, auth.BearerScheme) {
  86. }
  87. token := strings.TrimPrefix(authHeader, auth.BearerScheme)
  88. inspect, _ := authutil.JWTAuthService.Inspect(token)
  89. fmt.Println("inspect", inspect)
  90. var userId int64
  91. if id, isOk := inspect.Metadata["user_id"]; isOk {
  92. ID, _ := strconv.ParseInt(id, 0, 64)
  93. userId = ID
  94. }
  95. createdBy := ""
  96. if username, isOk := inspect.Metadata["username"]; isOk {
  97. createdBy = username
  98. }
  99. IPAddress := ""
  100. if len(md["Local"]) > 0 {
  101. IPAddress = md["Local"]
  102. } else {
  103. IPAddress = md["Remote"]
  104. }
  105. return userId, createdBy, IPAddress, md["Agent"]
  106. }
  107. func NewService(r repository.IRepository) IService {
  108. return &Service{
  109. Repository: r,
  110. }
  111. }
  112. type Service struct {
  113. Repository repository.IRepository
  114. }
  115. func (s *Service) CreatedAuditLog(ctx context.Context, action, tableName string, recordID int64, oldData, newData string) (string, error) {
  116. userId, createdBy, IPAddress, agent := ParseMetadata(ctx)
  117. log := req.AuditLog{
  118. UserID: userId,
  119. Action: action,
  120. TableName: tableName,
  121. RecordID: recordID,
  122. OldData: oldData,
  123. NewData: newData,
  124. IPAddress: IPAddress,
  125. UserAgent: agent,
  126. CreatedAt: time.Now(),
  127. }
  128. if err := s.Repository.CreateAuditLog(&log); err != nil {
  129. return createdBy, errorcode.New("authorization service", err.Error(), 500)
  130. }
  131. return createdBy, nil
  132. }