refactor before merging conversations / messages pkg.

This commit is contained in:
Abhinav Raut
2024-07-29 02:00:10 +05:30
parent 7ac9a2fe67
commit 79db632c3a
48 changed files with 1317 additions and 888 deletions

View File

@@ -8,18 +8,17 @@ import (
"syscall"
"time"
"github.com/abhinavxd/artemis/internal/attachment"
"github.com/abhinavxd/artemis/internal/automation"
"github.com/abhinavxd/artemis/internal/cannedresp"
"github.com/abhinavxd/artemis/internal/contact"
"github.com/abhinavxd/artemis/internal/conversation"
"github.com/abhinavxd/artemis/internal/inbox"
"github.com/abhinavxd/artemis/internal/media"
"github.com/abhinavxd/artemis/internal/message"
"github.com/abhinavxd/artemis/internal/role"
"github.com/abhinavxd/artemis/internal/setting"
"github.com/abhinavxd/artemis/internal/tag"
"github.com/abhinavxd/artemis/internal/team"
"github.com/abhinavxd/artemis/internal/upload"
"github.com/abhinavxd/artemis/internal/user"
"github.com/abhinavxd/artemis/internal/ws"
"github.com/knadh/go-i18n"
@@ -44,25 +43,24 @@ const (
// App is the global app context which is passed and injected in the http handlers.
type App struct {
constants consts
fs stuffbin.FileSystem
rdb *redis.Client
i18n *i18n.I18n
lo *logf.Logger
settingsManager *setting.Manager
roleManager *role.Manager
contactManager *contact.Manager
userManager *user.Manager
teamManager *team.Manager
sessManager *simplesessions.Manager
tagManager *tag.Manager
messageManager *message.Manager
inboxManager *inbox.Manager
uploadManager *upload.Manager
attachmentManager *attachment.Manager
cannedRespManager *cannedresp.Manager
conversationManager *conversation.Manager
automationEngine *automation.Engine
constant constants
fs stuffbin.FileSystem
rdb *redis.Client
i18n *i18n.I18n
lo *logf.Logger
media *media.Manager
setting *setting.Manager
role *role.Manager
contact *contact.Manager
user *user.Manager
team *team.Manager
sess *simplesessions.Manager
tag *tag.Manager
message *message.Manager
inbox *inbox.Manager
cannedResp *cannedresp.Manager
conversation *conversation.Manager
automation *automation.Engine
}
func main() {
@@ -74,71 +72,68 @@ func main() {
// Load app settings into Koanf.
db := initDB()
settingManager := initSettingsManager(db)
loadSettings(settingManager)
setting := initSettingsManager(db)
loadSettings(setting)
var (
shutdownCh = make(chan struct{})
ctx, stop = signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
wsHub = ws.NewHub()
fs = initFS()
i18n = initI18n(fs)
lo = initLogger("artemis")
rdb = initRedis()
templateManager = initTemplateManager(db)
attachmentManager = initAttachmentsManager(db)
contactManager = initContactManager(db)
inboxManager = initInboxManager(db)
teamManager = initTeamManager(db)
userManager = initUserManager(i18n, db)
notifier = initNotifier(userManager, templateManager)
conversationManager = initConversations(i18n, wsHub, notifier, db)
automationEngine = initAutomationEngine(db, userManager)
messageManager = initMessages(db, wsHub, userManager, teamManager, contactManager, attachmentManager, conversationManager, inboxManager, automationEngine, templateManager)
autoassigner = initAutoAssigner(teamManager, userManager, conversationManager)
shutdownCh = make(chan struct{})
ctx, stop = signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
wsHub = ws.NewHub()
fs = initFS()
i18n = initI18n(fs)
lo = initLogger("artemis")
rdb = initRedis()
template = initTemplate(db)
media = initMedia(db)
contact = initContact(db)
inbox = initInbox(db)
team = initTeam(db)
user = initUser(i18n, db)
notifier = initNotifier(user, template)
conversation = initConversations(i18n, wsHub, notifier, db)
automation = initAutomationEngine(db, user)
message = initMessages(db, wsHub, user, team, contact, media, conversation, inbox, automation, template)
autoassigner = initAutoAssigner(team, user, conversation)
)
// Set message store for conversation manager.
conversationManager.SetMessageStore(messageManager)
// Set required stores.
conversation.SetMessageStore(message)
wsHub.SetConversationStore(conversation)
automation.SetConversationStore(conversation)
// Register all inboxes with inbox manager & start receiving messages.
registerInboxes(inboxManager, messageManager)
inboxManager.Receive(ctx)
// Register all active inboxes with inbox manager & start receiving messages.
registerInboxes(inbox, message)
inbox.Receive(ctx)
// Set conversation store for websocket hub.
wsHub.SetConversationStore(conversationManager)
// Set stores for automation engine & start the evaluating rules.
automationEngine.SetConversationStore(conversationManager)
go automationEngine.Serve(ctx)
// Start evaluation automation rules.
go automation.Run(ctx)
// Start conversation auto assigner.
go autoassigner.Serve(ctx, ko.MustDuration("autoassigner.assign_interval"))
go autoassigner.Run(ctx, ko.MustDuration("autoassigner.assign_interval"))
// Start inserting incoming messages from all active inboxes and dispatch pending outgoing messages.
go messageManager.StartDBInserts(ctx, ko.MustInt("message.reader_concurrency"))
go messageManager.StartDispatcher(ctx, ko.MustInt("message.dispatch_concurrency"), ko.MustDuration("message.dispatch_read_interval"))
// Start processing incoming and outgoing messages.
go message.Run(ctx, ko.MustInt("message.dispatch_concurrency"), ko.MustInt("message.reader_concurrency"), ko.MustDuration("message.dispatch_read_interval"))
// Init the app
var app = &App{
lo: lo,
rdb: rdb,
fs: fs,
i18n: i18n,
settingsManager: settingManager,
contactManager: contactManager,
inboxManager: inboxManager,
userManager: userManager,
teamManager: teamManager,
attachmentManager: attachmentManager,
conversationManager: conversationManager,
messageManager: messageManager,
automationEngine: automationEngine,
roleManager: initRoleManager(db),
constants: initConstants(),
tagManager: initTags(db),
sessManager: initSessionManager(rdb),
cannedRespManager: initCannedResponse(db),
lo: lo,
rdb: rdb,
fs: fs,
i18n: i18n,
media: media,
setting: setting,
contact: contact,
inbox: inbox,
user: user,
team: team,
conversation: conversation,
message: message,
automation: automation,
role: initRole(db),
constant: initConstants(),
tag: initTags(db),
sess: initSessionManager(rdb),
cannedResp: initCannedResponse(db),
}
// Init fastglue http server.