125 lines
4.8 KiB
Go
125 lines
4.8 KiB
Go
package accountapiimp
|
|
|
|
import (
|
|
"context"
|
|
|
|
api "github.com/tech/sendico/pkg/api/http"
|
|
"github.com/tech/sendico/pkg/auth"
|
|
"github.com/tech/sendico/pkg/db/account"
|
|
"github.com/tech/sendico/pkg/db/organization"
|
|
"github.com/tech/sendico/pkg/db/policy"
|
|
"github.com/tech/sendico/pkg/db/refreshtokens"
|
|
"github.com/tech/sendico/pkg/db/transaction"
|
|
"github.com/tech/sendico/pkg/domainprovider"
|
|
"github.com/tech/sendico/pkg/messaging"
|
|
"github.com/tech/sendico/pkg/mlogger"
|
|
"github.com/tech/sendico/pkg/mservice"
|
|
"github.com/tech/sendico/server/interface/accountservice"
|
|
eapi "github.com/tech/sendico/server/interface/api"
|
|
"github.com/tech/sendico/server/interface/services/fileservice"
|
|
mutil "github.com/tech/sendico/server/internal/mutil/param"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type AccountAPI struct {
|
|
logger mlogger.Logger
|
|
db account.DB
|
|
odb organization.DB
|
|
tf transaction.Factory
|
|
rtdb refreshtokens.DB
|
|
plcdb policy.DB
|
|
domain domainprovider.DomainProvider
|
|
avatars mservice.MicroService
|
|
producer messaging.Producer
|
|
pmanager auth.Manager
|
|
enf auth.Enforcer
|
|
oph mutil.ParamHelper
|
|
aph mutil.ParamHelper
|
|
tph mutil.ParamHelper
|
|
accountsPermissionRef primitive.ObjectID
|
|
accService accountservice.AccountService
|
|
}
|
|
|
|
func (a *AccountAPI) Name() mservice.Type {
|
|
return mservice.Accounts
|
|
}
|
|
|
|
func (a *AccountAPI) Finish(ctx context.Context) error {
|
|
return a.avatars.Finish(ctx)
|
|
}
|
|
|
|
func CreateAPI(a eapi.API) (*AccountAPI, error) {
|
|
p := new(AccountAPI)
|
|
p.logger = a.Logger().Named(p.Name())
|
|
var err error
|
|
if p.db, err = a.DBFactory().NewAccountDB(); err != nil {
|
|
p.logger.Error("Failed to create accounts database", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
if p.rtdb, err = a.DBFactory().NewRefreshTokensDB(); err != nil {
|
|
p.logger.Error("Failed to create refresh tokens database", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
if p.odb, err = a.DBFactory().NewOrganizationDB(); err != nil {
|
|
p.logger.Error("Failed to create organizations database", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
if p.plcdb, err = a.DBFactory().NewPoliciesDB(); err != nil {
|
|
p.logger.Error("Failed to create policies database", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
|
|
p.domain = a.DomainProvider()
|
|
p.producer = a.Register().Messaging().Producer()
|
|
p.tf = a.DBFactory().TransactionFactory()
|
|
p.pmanager = a.Permissions().Manager()
|
|
p.enf = a.Permissions().Enforcer()
|
|
p.oph = mutil.CreatePH(mservice.Organizations)
|
|
p.aph = mutil.CreatePH(mservice.Accounts)
|
|
p.tph = mutil.CreatePH("token")
|
|
|
|
if p.accService, err = accountservice.NewAccountService(p.logger, a.DBFactory(), p.enf, p.pmanager.Role(), &a.Config().Mw.Password); err != nil {
|
|
p.logger.Error("Failed to create account manager", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
|
|
// Account related api endpoints
|
|
a.Register().Handler(mservice.Accounts, "/signup", api.Post, p.signup)
|
|
|
|
a.Register().AccountHandler(mservice.Accounts, "", api.Put, p.updateProfile)
|
|
a.Register().AccountHandler(mservice.Accounts, "", api.Get, p.getProfile)
|
|
|
|
a.Register().AccountHandler(mservice.Accounts, p.oph.AddRef("/employee"), api.Put, p.updateEmployee)
|
|
|
|
a.Register().AccountHandler(mservice.Accounts, "/dzone", api.Get, p.dzone)
|
|
a.Register().AccountHandler(mservice.Accounts, p.oph.AddRef("/profile"), api.Delete, p.deleteProfile)
|
|
a.Register().AccountHandler(mservice.Accounts, p.oph.AddRef("/organization"), api.Delete, p.deleteOrganization)
|
|
a.Register().AccountHandler(mservice.Accounts, p.oph.AddRef("/all"), api.Delete, p.deleteAll)
|
|
|
|
a.Register().AccountHandler(mservice.Accounts, p.oph.AddRef("/list"), api.Get, p.getEmployees)
|
|
|
|
a.Register().AccountHandler(mservice.Accounts, "/password", api.Post, p.checkPassword)
|
|
a.Register().AccountHandler(mservice.Accounts, "/password", api.Patch, p.changePassword)
|
|
a.Register().Handler(mservice.Accounts, "/password", api.Put, p.forgotPassword)
|
|
a.Register().Handler(mservice.Accounts, p.tph.AddRef(p.aph.AddRef("/password/reset")), api.Post, p.resetPassword)
|
|
|
|
a.Register().Handler(mservice.Accounts, mutil.AddToken("/verify"), api.Get, p.verify)
|
|
a.Register().Handler(mservice.Accounts, "/email", api.Post, p.resendVerificationMail)
|
|
a.Register().Handler(mservice.Accounts, "/email", api.Put, p.resendVerification)
|
|
|
|
if p.avatars, err = fileservice.CreateAPI(a, p.Name()); err != nil {
|
|
p.logger.Error("Failed to create image server", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
|
|
accountsPolicy, err := a.Permissions().GetPolicyDescription(context.Background(), mservice.Accounts)
|
|
if err != nil {
|
|
p.logger.Warn("Failed to fetch account permission policy description", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
p.accountsPermissionRef = accountsPolicy.ID
|
|
|
|
return p, nil
|
|
}
|