Documentation
¶
Index ¶
- Constants
- Variables
- func BroadcastTicketUpdate(eventType string, ticketData interface{})
- func BuildRoutesManifest() ([]byte, error)
- func ExtractToken(c *gin.Context) string
- func GenerateRoutesManifest() error
- func GetArticleAttachments(articleID int) ([]map[string]interface{}, error)
- func GetAuthService() *service.AuthService
- func GetDynamicHandler() *dynamic.DynamicModuleHandler
- func GetHandler(name string) (gin.HandlerFunc, bool)
- func GetLookupRepository() repository.LookupRepository
- func GetLookupService() *service.LookupService
- func GetPriorityRepository() *repository.PriorityRepository
- func GetQueueRepository() *repository.QueueRepository
- func GetStorageService() service.StorageService
- func GetTemplateService() *service.TicketTemplateService
- func GetTicketAttachments(ticketID int) (map[int][]map[string]interface{}, error)
- func GetTicketRepository() repository.ITicketRepository
- func GetTicketService() *service.SimpleTicketService
- func GetUserMapForTemplate(c *gin.Context) gin.H
- func GetUserRepository() *repository.UserRepository
- func HandleAPIQueueDetails(c *gin.Context)
- func HandleAPIQueueGet(c *gin.Context)
- func HandleAPIQueueStatus(c *gin.Context)
- func HandleAddTicketTime(c *gin.Context)
- func HandleAddUserToGroupAPI(c *gin.Context)
- func HandleAdminCustomerUsersBulkAction(c *gin.Context)
- func HandleAdminCustomerUsersCreate(c *gin.Context)
- func HandleAdminCustomerUsersDelete(c *gin.Context)
- func HandleAdminCustomerUsersExport(c *gin.Context)
- func HandleAdminCustomerUsersGet(c *gin.Context)
- func HandleAdminCustomerUsersImport(c *gin.Context)
- func HandleAdminCustomerUsersImportForm(c *gin.Context)
- func HandleAdminCustomerUsersList(c *gin.Context)
- func HandleAdminCustomerUsersTickets(c *gin.Context)
- func HandleAdminCustomerUsersUpdate(c *gin.Context)
- func HandleAdminGroupsAddUser(c *gin.Context)
- func HandleAdminGroupsCreate(c *gin.Context)
- func HandleAdminGroupsDelete(c *gin.Context)
- func HandleAdminGroupsRemoveUser(c *gin.Context)
- func HandleAdminGroupsUpdate(c *gin.Context)
- func HandleAdminGroupsUsers(c *gin.Context)
- func HandleAdminTickets(c *gin.Context)
- func HandleAdminUserCreate(c *gin.Context)
- func HandleAdminUserDelete(c *gin.Context)
- func HandleAdminUserGet(c *gin.Context)
- func HandleAdminUserGroups(c *gin.Context)
- func HandleAdminUserResetPassword(c *gin.Context)
- func HandleAdminUserUpdate(c *gin.Context)
- func HandleAdminUsers(c *gin.Context)
- func HandleAdminUsersCreate(c *gin.Context)
- func HandleAdminUsersDelete(c *gin.Context)
- func HandleAdminUsersList(c *gin.Context)
- func HandleAdminUsersStatus(c *gin.Context)
- func HandleAdminUsersUpdate(c *gin.Context)
- func HandleAgentCreateTicket(db *sql.DB) gin.HandlerFunc
- func HandleAgentNewTicket(db *sql.DB) gin.HandlerFunc
- func HandleAgentPerformanceAPI(c *gin.Context)
- func HandleAssignQueueGroupAPI(c *gin.Context)
- func HandleAssignTicketAPI(c *gin.Context)
- func HandleClaudeFeedback(c *gin.Context)
- func HandleClaudeTicketStatus(c *gin.Context)
- func HandleCloseTicketAPI(c *gin.Context)
- func HandleCreateArticleAPI(c *gin.Context)
- func HandleCreateInternalNote(c *gin.Context)
- func HandleCreatePriorityAPI(c *gin.Context)
- func HandleCreateQueueAPI(c *gin.Context)
- func HandleCreateSLAAPI(c *gin.Context)
- func HandleCreateTicketAPI(c *gin.Context)
- func HandleCreateTicketStateAPI(c *gin.Context)
- func HandleCreateUserAPI(c *gin.Context)
- func HandleCustomerStatisticsAPI(c *gin.Context)
- func HandleDashboardStatisticsAPI(c *gin.Context)
- func HandleDeleteArticleAPI(c *gin.Context)
- func HandleDeleteInternalNote(c *gin.Context)
- func HandleDeletePriorityAPI(c *gin.Context)
- func HandleDeleteQueueAPI(c *gin.Context)
- func HandleDeleteSLAAPI(c *gin.Context)
- func HandleDeleteTicketAPI(c *gin.Context)
- func HandleDeleteTicketStateAPI(c *gin.Context)
- func HandleDeleteUserAPI(c *gin.Context)
- func HandleDeleteWebhookAPI(c *gin.Context)
- func HandleExportStatisticsAPI(c *gin.Context)
- func HandleGetArticleAPI(c *gin.Context)
- func HandleGetFormData(c *gin.Context)
- func HandleGetInternalNotes(c *gin.Context)
- func HandleGetPriorities(c *gin.Context)
- func HandleGetPriorityAPI(c *gin.Context)
- func HandleGetQueueAPI(c *gin.Context)
- func HandleGetQueueAgentsAPI(c *gin.Context)
- func HandleGetQueueStatsAPI(c *gin.Context)
- func HandleGetQueues(c *gin.Context)
- func HandleGetSLAAPI(c *gin.Context)
- func HandleGetSessionTimeout(c *gin.Context)
- func HandleGetStatuses(c *gin.Context)
- func HandleGetTicketAPI(c *gin.Context)
- func HandleGetTicketStateAPI(c *gin.Context)
- func HandleGetTypes(c *gin.Context)
- func HandleGetUserAPI(c *gin.Context)
- func HandleGetUserGroupsAPI(c *gin.Context)
- func HandleGetWebhookAPI(c *gin.Context)
- func HandleInvalidateLookupCache(c *gin.Context)
- func HandleLegacyAgentTicketViewRedirect(c *gin.Context)
- func HandleLegacyTicketsViewRedirect(c *gin.Context)
- func HandleListArticlesAPI(c *gin.Context)
- func HandleListPrioritiesAPI(c *gin.Context)
- func HandleListQueuesAPI(c *gin.Context)
- func HandleListSLAsAPI(c *gin.Context)
- func HandleListStatesAPI(c *gin.Context)
- func HandleListTicketStatesAPI(c *gin.Context)
- func HandleListTicketsAPI(c *gin.Context)
- func HandleListTypesAPI(c *gin.Context)
- func HandleListUsersAPI(c *gin.Context)
- func HandleListWebhooksAPI(c *gin.Context)
- func HandleLoginAPI(c *gin.Context)
- func HandleLogoutAPI(c *gin.Context)
- func HandlePasswordPolicy(c *gin.Context)
- func HandleProfile(c *gin.Context)
- func HandleQueueMetricsAPI(c *gin.Context)
- func HandleRedirect(c *gin.Context)
- func HandleRedirectProfile(c *gin.Context)
- func HandleRedirectQueues(c *gin.Context)
- func HandleRedirectSettings(c *gin.Context)
- func HandleRedirectTickets(c *gin.Context)
- func HandleRedirectTicketsNew(c *gin.Context)
- func HandleRefreshTokenAPI(c *gin.Context)
- func HandleRegisterAPI(c *gin.Context)
- func HandleRegisterWebhookAPI(c *gin.Context)
- func HandleReindexAPI(c *gin.Context)
- func HandleRemoveQueueGroupAPI(c *gin.Context)
- func HandleRemoveUserFromGroupAPI(c *gin.Context)
- func HandleReopenTicketAPI(c *gin.Context)
- func HandleRetryWebhookDeliveryAPI(c *gin.Context)
- func HandleSLAMetricsAPI(c *gin.Context)
- func HandleSearchAPI(c *gin.Context)
- func HandleSearchHealthAPI(c *gin.Context)
- func HandleSearchSuggestionsAPI(c *gin.Context)
- func HandleSetSessionTimeout(c *gin.Context)
- func HandleStaticFiles(c *gin.Context)
- func HandleTemplate(c *gin.Context)
- func HandleTestWebhookAPI(c *gin.Context)
- func HandleTicketStateStatisticsAPI(c *gin.Context)
- func HandleTicketTrendsAPI(c *gin.Context)
- func HandleTimeBasedAnalyticsAPI(c *gin.Context)
- func HandleUpdateArticleAPI(c *gin.Context)
- func HandleUpdateInternalNote(c *gin.Context)
- func HandleUpdatePriorityAPI(c *gin.Context)
- func HandleUpdateQueueAPI(c *gin.Context)
- func HandleUpdateSLAAPI(c *gin.Context)
- func HandleUpdateTicketAPI(c *gin.Context)
- func HandleUpdateTicketStateAPI(c *gin.Context)
- func HandleUpdateUserAPI(c *gin.Context)
- func HandleUpdateWebhookAPI(c *gin.Context)
- func HandleUserMeAPI(c *gin.Context)
- func HandleWebhookDeliveriesAPI(c *gin.Context)
- func ImprovedHandleAdminUserGet(c *gin.Context)
- func ImprovedHandleAdminUserUpdate(c *gin.Context)
- func InitPongo2Renderer(templateDir string)
- func InitializeLDAPService()
- func InitializeServices()
- func JWTAuthMiddleware() gin.HandlerFunc
- func ListHandlers() []string
- func LoadTicketStatesForForm(db *sql.DB) ([]gin.H, map[string]gin.H, error)
- func NewHTMXRouter(jwtManager *auth.JWTManager, ldapProvider *ldap.Provider) *gin.Engine
- func NewSimpleRouter() *gin.Engine
- func RegisterAdminCustomerCompanyRoutes(r *gin.RouterGroup, db *sql.DB)
- func RegisterAgentHandlers()
- func RegisterAgentHandlersForRouting()
- func RegisterAgentRoutes(r *gin.RouterGroup, db *sql.DB)
- func RegisterCustomerRoutes(r *gin.RouterGroup, db *sql.DB)
- func RegisterDevRoutes(r *gin.RouterGroup)
- func RegisterHandler(name string, h gin.HandlerFunc)
- func RegisterWithRouting(registry interface{}) error
- func RenderMarkdown(content string) string
- func SetupAPIv1Routes(r *gin.Engine, jwtManager *auth.JWTManager, ldapProvider *ldap.Provider, ...)
- func SetupBasicRoutes(r *gin.Engine)
- func SetupDynamicModules(router *gin.RouterGroup, db *sql.DB) error
- func SetupHTMXRoutes(r *gin.Engine)
- func SetupLDAPRoutes(r *gin.Engine)
- func ValidateAllTemplates(templatesDir string) ([]string, error)
- func ValidateTemplatesReferencedInRoutes(routesDir, templatesDir string) ([]string, error)
- func ValidateUploadedFile(header *multipart.FileHeader) error
- type AgentHandlerRegistry
- type Attachment
- type AuthHandler
- type CannedResponse
- type CannedResponseHandlers
- func (h *CannedResponseHandlers) ApplyResponse(c *gin.Context)
- func (h *CannedResponseHandlers) CreateResponse(c *gin.Context)
- func (h *CannedResponseHandlers) DeleteResponse(c *gin.Context)
- func (h *CannedResponseHandlers) ExportResponses(c *gin.Context)
- func (h *CannedResponseHandlers) GetCategories(c *gin.Context)
- func (h *CannedResponseHandlers) GetPopularResponses(c *gin.Context)
- func (h *CannedResponseHandlers) GetQuickResponses(c *gin.Context)
- func (h *CannedResponseHandlers) GetResponseByID(c *gin.Context)
- func (h *CannedResponseHandlers) GetResponses(c *gin.Context)
- func (h *CannedResponseHandlers) GetResponsesByCategory(c *gin.Context)
- func (h *CannedResponseHandlers) GetResponsesForUser(c *gin.Context)
- func (h *CannedResponseHandlers) ImportResponses(c *gin.Context)
- func (h *CannedResponseHandlers) SearchResponses(c *gin.Context)
- func (h *CannedResponseHandlers) UpdateResponse(c *gin.Context)
- type ChatClient
- type ChatHub
- type ChatMessage
- type CoverageResponse
- type CreateUserRequest
- type EscalationResult
- type I18nHandlers
- func (h *I18nHandlers) ExportTranslations(c *gin.Context)
- func (h *I18nHandlers) GetCurrentTranslations(c *gin.Context)
- func (h *I18nHandlers) GetLanguageStats(c *gin.Context)
- func (h *I18nHandlers) GetMissingTranslations(c *gin.Context)
- func (h *I18nHandlers) GetSupportedLanguages(c *gin.Context)
- func (h *I18nHandlers) GetTranslationCoverage(c *gin.Context)
- func (h *I18nHandlers) GetTranslations(c *gin.Context)
- func (h *I18nHandlers) RegisterRoutes(router *gin.RouterGroup)
- func (h *I18nHandlers) SetLanguage(c *gin.Context)
- func (h *I18nHandlers) Translate(c *gin.Context)
- func (h *I18nHandlers) ValidateTranslations(c *gin.Context)
- type InternalNote
- type InternalNoteHandlers
- func (h *InternalNoteHandlers) CreateNote(c *gin.Context)
- func (h *InternalNoteHandlers) CreateNoteFromTemplate(c *gin.Context)
- func (h *InternalNoteHandlers) CreateTemplate(c *gin.Context)
- func (h *InternalNoteHandlers) DeleteNote(c *gin.Context)
- func (h *InternalNoteHandlers) DeleteTemplate(c *gin.Context)
- func (h *InternalNoteHandlers) ExportNotes(c *gin.Context)
- func (h *InternalNoteHandlers) GetCategories(c *gin.Context)
- func (h *InternalNoteHandlers) GetEditHistory(c *gin.Context)
- func (h *InternalNoteHandlers) GetImportantNotes(c *gin.Context)
- func (h *InternalNoteHandlers) GetNoteByID(c *gin.Context)
- func (h *InternalNoteHandlers) GetNoteStatistics(c *gin.Context)
- func (h *InternalNoteHandlers) GetNotes(c *gin.Context)
- func (h *InternalNoteHandlers) GetPinnedNotes(c *gin.Context)
- func (h *InternalNoteHandlers) GetRecentActivity(c *gin.Context)
- func (h *InternalNoteHandlers) GetTemplates(c *gin.Context)
- func (h *InternalNoteHandlers) MarkImportant(c *gin.Context)
- func (h *InternalNoteHandlers) PinNote(c *gin.Context)
- func (h *InternalNoteHandlers) SearchNotes(c *gin.Context)
- func (h *InternalNoteHandlers) UpdateNote(c *gin.Context)
- func (h *InternalNoteHandlers) UpdateTemplate(c *gin.Context)
- type LanguageCoverage
- type LanguageInfo
- type LanguageStats
- type LanguageStatsResponse
- type LanguagesResponse
- type MergeHistory
- type MergeRequest
- type MissingKey
- type MissingKeysResponse
- type NoteHistory
- type PaginationInfo
- type Pongo2Renderer
- type Role
- type RoleGroupPermission
- type RoleUser
- type SLA
- type SLADefinition
- type SLAWithStats
- type SavedSearch
- type SearchHandlers
- func (h *SearchHandlers) AdvancedSearch(c *gin.Context)
- func (h *SearchHandlers) DeleteTicketFromIndex(c *gin.Context)
- func (h *SearchHandlers) ExecuteSavedSearch(c *gin.Context)
- func (h *SearchHandlers) GetSavedSearch(c *gin.Context)
- func (h *SearchHandlers) GetSavedSearches(c *gin.Context)
- func (h *SearchHandlers) GetSearchAnalytics(c *gin.Context)
- func (h *SearchHandlers) GetSearchHistory(c *gin.Context)
- func (h *SearchHandlers) GetSearchSuggestions(c *gin.Context)
- func (h *SearchHandlers) IndexTicket(c *gin.Context)
- func (h *SearchHandlers) ReindexTickets(c *gin.Context)
- func (h *SearchHandlers) SaveSearch(c *gin.Context)
- func (h *SearchHandlers) SearchTickets(c *gin.Context)
- func (h *SearchHandlers) UpdateTicketIndex(c *gin.Context)
- type SearchHistory
- type SearchResult
- type Service
- type ServiceWithStats
- type SetLanguageRequest
- type StandardAttachment
- type State
- type StateType
- type StateWithType
- type TestConfig
- type TicketDisplay
- type TicketListResponse
- type TicketTemplate
- type TicketType
- type TranslateRequest
- type TranslateResponse
- type TranslationsResponse
- type UnmergeRequest
- type UpdateUserRequest
- type ValidationResponse
Constants ¶
const ( MaxFileSize = 10 * 1024 * 1024 // 10MB per file MaxTotalSize = 50 * 1024 * 1024 // 50MB total per ticket MaxAttachments = 20 // Max 20 attachments per ticket )
File upload limits
Variables ¶
var ( HandleLoginPage = handleLoginPage HandleLogout = handleLogout HandleDashboard = handleDashboard HandleDashboardStats = handleDashboardStats HandleRecentTickets = handleRecentTickets DashboardQueueStatus = dashboard_queue_status HandleActivityStream = handleActivityStream HandlePendingReminderFeed = handlePendingReminderFeed HandleUpdateTicketStatus = handleUpdateTicketStatus )
Core handlers
var ( HandleAdminDashboard = handleAdminDashboard // Users are handled by dynamic modules and admin_users_handlers.go HandleAdminUserEdit = HandleAdminUserGet // Same handler for edit form HandleAdminPasswordPolicy = HandlePasswordPolicy HandleAdminGroups = handleAdminGroups HandleGetGroup = handleGetGroup HandleCreateGroup = handleCreateGroup HandleUpdateGroup = handleUpdateGroup HandleDeleteGroup = handleDeleteGroup HandleGroupMembers = handleGetGroupMembers HandleAddUserToGroup = handleAddUserToGroup HandleRemoveUserFromGroup = handleRemoveUserFromGroup HandleAdminQueues = handleAdminQueues HandleAdminPriorities = handleAdminPriorities HandleAdminPermissions = handleAdminPermissions // Renamed from roles HandleGetUserPermissionMatrix = handleGetUserPermissionMatrix HandleUpdateUserPermissions = handleUpdateUserPermissions HandleAdminStates = handleAdminStates HandleAdminTypes = handleAdminTypes HandleAdminServices = handleAdminServices HandleAdminSLA = handleAdminSLA HandleAdminLookups = handleAdminLookups // Customer company handlers - wrapped to get database from adapter HandleAdminCustomerCompanies = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminCustomerCompanies(dbService.GetDB())(c) } HandleAdminCustomerCompanyUsers = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminCustomerCompanyUsers(dbService.GetDB())(c) } HandleAdminCustomerCompanyTickets = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminCustomerCompanyTickets(dbService.GetDB())(c) } HandleAdminCustomerCompanyServices = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminCustomerCompanyServices(dbService.GetDB())(c) } HandleAdminCustomerPortalSettings = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminCustomerPortalSettings(dbService.GetDB())(c) } )
Admin handlers
var ( HandleTicketDetail = handleTicketDetail HandleQueueDetail = handleQueueDetail )
Ticket handlers
var ( HandleGetAttachments = handleGetAttachments HandleUploadAttachment = handleUploadAttachment HandleDownloadAttachment = handleDownloadAttachment HandleDeleteAttachment = handleDeleteAttachment HandleGetThumbnail = handleGetThumbnail HandleViewAttachment = handleViewAttachment )
Attachment handlers (exported for routing)
var ( HandleDevDashboard = handleDevDashboard HandleClaudeTickets = handleClaudeTickets HandleDevAction = handleDevAction HandleDevLogs = handleDevLogs HandleDevDatabase = handleDevDatabase )
Dev handlers
var ( HandleAgentTickets = AgentHandlerExports.HandleAgentTickets HandleAgentTicketReply = AgentHandlerExports.HandleAgentTicketReply HandleAgentTicketNote = AgentHandlerExports.HandleAgentTicketNote HandleAgentTicketPhone = AgentHandlerExports.HandleAgentTicketPhone HandleAgentTicketStatus = AgentHandlerExports.HandleAgentTicketStatus HandleAgentTicketAssign = AgentHandlerExports.HandleAgentTicketAssign HandleAgentTicketPriority = AgentHandlerExports.HandleAgentTicketPriority HandleAgentTicketQueue = AgentHandlerExports.HandleAgentTicketQueue HandleAgentTicketMerge = AgentHandlerExports.HandleAgentTicketMerge HandleAgentTicketDraft = AgentHandlerExports.HandleAgentTicketDraft )
Provide package-level handler variables for tests and direct routing
var ( HandleCustomerDashboard = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerDashboard(db)(c) } HandleCustomerTickets = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerTickets(db)(c) } HandleCustomerNewTicket = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerNewTicket(db)(c) } HandleCustomerCreateTicket = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerCreateTicket(db)(c) } HandleCustomerTicketView = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerTicketView(db)(c) } HandleCustomerTicketReply = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerTicketReply(db)(c) } HandleCustomerCloseTicket = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerCloseTicket(db)(c) } HandleCustomerProfile = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerProfile(db)(c) } HandleCustomerUpdateProfile = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerUpdateProfile(db)(c) } HandleCustomerPasswordForm = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerPasswordForm(db)(c) } HandleCustomerChangePassword = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerChangePassword(db)(c) } HandleCustomerKnowledgeBase = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerKnowledgeBase(db)(c) } HandleCustomerKBSearch = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerKBSearch(db)(c) } HandleCustomerKBArticle = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerKBArticle(db)(c) } HandleCustomerCompanyInfo = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerCompanyInfo(db)(c) } HandleCustomerCompanyUsers = func(c *gin.Context) { db, _ := adapter.GetDB() handleCustomerCompanyUsers(db)(c) } )
Customer handler exports that get database from connection pool
var AgentHandlerExports = struct { HandleAgentTickets gin.HandlerFunc HandleAgentTicketReply gin.HandlerFunc HandleAgentTicketNote gin.HandlerFunc HandleAgentTicketPhone gin.HandlerFunc HandleAgentTicketStatus gin.HandlerFunc HandleAgentTicketAssign gin.HandlerFunc HandleAgentTicketPriority gin.HandlerFunc HandleAgentTicketQueue gin.HandlerFunc HandleAgentTicketMerge gin.HandlerFunc HandleAgentTicketDraft gin.HandlerFunc HandleAgentCustomerTickets gin.HandlerFunc HandleAgentCustomerView gin.HandlerFunc HandleAgentSearch gin.HandlerFunc HandleAgentSearchResults gin.HandlerFunc HandleAgentNewTicket gin.HandlerFunc HandleAgentCreateTicket gin.HandlerFunc HandleAgentQueues gin.HandlerFunc HandleAgentQueueView gin.HandlerFunc HandleAgentQueueLock gin.HandlerFunc HandleAgentCustomers gin.HandlerFunc }{ HandleAgentTickets: func(c *gin.Context) { db, _ := database.GetDB() handleAgentTickets(db)(c) }, HandleAgentTicketReply: func(c *gin.Context) { db, _ := database.GetDB() handleAgentTicketReply(db)(c) }, HandleAgentTicketNote: func(c *gin.Context) { db, _ := database.GetDB() handleAgentTicketNote(db)(c) }, HandleAgentTicketPhone: func(c *gin.Context) { db, _ := database.GetDB() handleAgentTicketPhone(db)(c) }, HandleAgentTicketStatus: func(c *gin.Context) { db, _ := database.GetDB() handleAgentTicketStatus(db)(c) }, HandleAgentTicketAssign: func(c *gin.Context) { db, _ := database.GetDB() handleAgentTicketAssign(db)(c) }, HandleAgentTicketPriority: func(c *gin.Context) { db, _ := database.GetDB() handleAgentTicketPriority(db)(c) }, HandleAgentTicketQueue: func(c *gin.Context) { db, _ := database.GetDB() handleAgentTicketQueue(db)(c) }, HandleAgentTicketMerge: func(c *gin.Context) { db, _ := database.GetDB() handleAgentTicketMerge(db)(c) }, HandleAgentTicketDraft: func(c *gin.Context) { db, _ := database.GetDB() handleAgentTicketDraft(db)(c) }, HandleAgentCustomerTickets: func(c *gin.Context) { db, _ := database.GetDB() handleAgentCustomerTickets(db)(c) }, HandleAgentCustomerView: func(c *gin.Context) { db, _ := database.GetDB() handleAgentCustomerView(db)(c) }, HandleAgentSearch: func(c *gin.Context) { db, _ := database.GetDB() handleAgentSearch(db)(c) }, HandleAgentSearchResults: func(c *gin.Context) { db, _ := database.GetDB() handleAgentSearchResults(db)(c) }, HandleAgentNewTicket: func(c *gin.Context) { db, _ := database.GetDB() HandleAgentNewTicket(db)(c) }, HandleAgentCreateTicket: func(c *gin.Context) { db, _ := database.GetDB() HandleAgentCreateTicket(db)(c) }, HandleAgentQueues: func(c *gin.Context) { db, _ := database.GetDB() handleAgentQueues(db)(c) }, HandleAgentQueueView: func(c *gin.Context) { db, _ := database.GetDB() handleAgentQueueView(db)(c) }, HandleAgentQueueLock: func(c *gin.Context) { db, _ := database.GetDB() handleAgentQueueLock(db)(c) }, HandleAgentCustomers: func(c *gin.Context) { db, _ := database.GetDB() handleAgentCustomers(db)(c) }, }
AgentHandlerExports provides exported handler functions for agent routes
var GlobalAgentHandlers = &AgentHandlerRegistry{}
GlobalAgentHandlers is the global registry for agent handlers
var HandleAPIv1AddArticle = HandleCreateArticleAPI
Articles API handlers
var HandleAPIv1AuthLogin = HandleLoginAPI
Auth handlers
var HandleAPIv1AuthLogout = HandleLogoutAPI
var HandleAPIv1AuthRefresh = HandleRefreshTokenAPI
var HandleAPIv1AuthRegister = HandleRegisterAPI
var HandleAPIv1GetTicketArticle = func(c *gin.Context) { ticketID := c.Param("id") articleID := c.Param("article_id") c.JSON(http.StatusOK, gin.H{ "success": true, "message": "Get ticket article endpoint - under construction", "data": gin.H{"ticket_id": ticketID, "article_id": articleID}, }) }
var HandleAPIv1GetTicketArticles = func(c *gin.Context) { ticketID := c.Param("id") c.JSON(http.StatusOK, gin.H{ "success": true, "message": "Get ticket articles endpoint - under construction", "data": gin.H{"ticket_id": ticketID}, }) }
var HandleAPIv1PrioritiesList = func(c *gin.Context) { priorityRepo := GetPriorityRepository() if priorityRepo == nil { c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "error": "Priority repository not initialized", }) return } priorities, err := priorityRepo.List() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "error": err.Error(), }) return } priorityList := make([]gin.H, 0, len(priorities)) for _, p := range priorities { priorityList = append(priorityList, gin.H{ "id": p.ID, "name": p.Name, }) } c.JSON(http.StatusOK, gin.H{ "success": true, "data": priorityList, }) }
Priorities API handlers
var HandleAPIv1PriorityGet = func(c *gin.Context) { id := c.Param("id") priorityRepo := GetPriorityRepository() if priorityRepo == nil { c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "error": "Priority repository not initialized", }) return } priorityID, err := strconv.ParseUint(id, 10, 32) if err != nil { c.JSON(http.StatusBadRequest, gin.H{ "success": false, "error": "Invalid priority ID", }) return } priority, err := priorityRepo.GetByID(uint(priorityID)) if err != nil { c.JSON(http.StatusNotFound, gin.H{ "success": false, "error": "Priority not found", }) return } c.JSON(http.StatusOK, gin.H{ "success": true, "data": priority, }) }
var HandleAPIv1QueueCreate = func(c *gin.Context) { c.JSON(http.StatusCreated, gin.H{ "success": true, "message": "Endpoint /api/v1/queues (POST) is under construction", "data": nil, }) }
var HandleAPIv1QueueDelete = func(c *gin.Context) { c.JSON(http.StatusNoContent, gin.H{}) }
var HandleAPIv1QueueGet = func(c *gin.Context) { id := c.Param("id") queueRepo := GetQueueRepository() if queueRepo == nil { c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "error": "Queue repository not initialized", }) return } queueID, err := strconv.ParseUint(id, 10, 32) if err != nil { c.JSON(http.StatusBadRequest, gin.H{ "success": false, "error": "Invalid queue ID", }) return } queue, err := queueRepo.GetByID(uint(queueID)) if err != nil { c.JSON(http.StatusNotFound, gin.H{ "success": false, "error": "Queue not found", }) return } c.JSON(http.StatusOK, gin.H{ "success": true, "data": queue, }) }
var HandleAPIv1QueueUpdate = func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "success": true, "message": "Endpoint /api/v1/queues/:id (PUT) is under construction", "data": nil, }) }
var HandleAPIv1QueuesList = func(c *gin.Context) { queueRepo := GetQueueRepository() if queueRepo == nil { c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "error": "Queue repository not initialized", }) return } queues, err := queueRepo.List() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "error": err.Error(), }) return } queueList := make([]gin.H, 0, len(queues)) for _, q := range queues { queueList = append(queueList, gin.H{ "id": q.ID, "name": q.Name, }) } c.JSON(http.StatusOK, gin.H{ "success": true, "data": queueList, }) }
Queues API handlers
var HandleAPIv1TicketAssign = HandleAssignTicketAPI
var HandleAPIv1TicketClose = HandleCloseTicketAPI
Ticket action handlers
var HandleAPIv1TicketCreate = HandleCreateTicketAPI
var HandleAPIv1TicketDelete = HandleDeleteTicketAPI
var HandleAPIv1TicketGet = func(c *gin.Context) { id := c.Param("id") ticketRepo := GetTicketRepository() if ticketRepo == nil { c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "error": "Ticket repository not initialized", }) return } ticketID, err := strconv.ParseUint(id, 10, 32) if err != nil { c.JSON(http.StatusBadRequest, gin.H{ "success": false, "error": "Invalid ticket ID", }) return } ticket, err := ticketRepo.GetByID(uint(ticketID)) if err != nil { c.JSON(http.StatusNotFound, gin.H{ "success": false, "error": "Ticket not found", }) return } c.JSON(http.StatusOK, gin.H{ "success": true, "data": ticket, }) }
var HandleAPIv1TicketReopen = HandleReopenTicketAPI
var HandleAPIv1TicketUpdate = HandleUpdateTicketAPI
var HandleAPIv1TicketsList = HandleListTicketsAPI
Tickets API handlers
var HandleAPIv1UserCreate = func(c *gin.Context) { c.JSON(http.StatusCreated, gin.H{ "success": true, "message": "Endpoint /api/v1/users (POST) is under construction", "data": nil, }) }
var HandleAPIv1UserDelete = func(c *gin.Context) { c.JSON(http.StatusNoContent, gin.H{}) }
var HandleAPIv1UserGet = func(c *gin.Context) { id := c.Param("id") userRepo := GetUserRepository() if userRepo == nil { c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "error": "User repository not initialized", }) return } // Convert string ID to uint var userID uint if _, err := fmt.Sscanf(id, "%d", &userID); err != nil { c.JSON(http.StatusBadRequest, gin.H{ "success": false, "error": "Invalid user ID", }) return } user, err := userRepo.GetByID(userID) if err != nil { c.JSON(http.StatusNotFound, gin.H{ "success": false, "error": "User not found", }) return } c.JSON(http.StatusOK, gin.H{ "success": true, "data": user, }) }
var HandleAPIv1UserMe = HandleUserMeAPI
Users API handlers
var HandleAPIv1UserUpdate = func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "success": true, "message": "Endpoint /api/v1/users/:id (PUT) is under construction", "data": nil, }) }
var HandleAPIv1UsersList = func(c *gin.Context) { userRepo := GetUserRepository() if userRepo == nil { c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "error": "User repository not initialized", }) return } users, err := userRepo.List() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "error": err.Error(), }) return } c.JSON(http.StatusOK, gin.H{ "success": true, "data": users, }) }
var HandleAuthCheck = func(c *gin.Context) { userID, exists := c.Get("user_id") if !exists { c.JSON(http.StatusUnauthorized, gin.H{ "authenticated": false, }) return } c.JSON(http.StatusOK, gin.H{ "authenticated": true, "userID": userID, }) }
HandleAuthCheck checks if user is authenticated
var HandleAuthLogin = func(c *gin.Context) { contentType := c.GetHeader("Content-Type") var username, password string if strings.Contains(contentType, "application/json") { var payload struct { Login string `json:"login"` Username string `json:"username"` Email string `json:"email"` Password string `json:"password"` } if err := c.ShouldBindJSON(&payload); err == nil { username = payload.Login if username == "" { username = payload.Username } if username == "" { username = payload.Email } password = payload.Password } } else { username = c.PostForm("username") password = c.PostForm("password") if username == "" { username = c.PostForm("login") } if username == "" { username = c.PostForm("email") } if username == "" { username = c.PostForm("user") } } provider := c.PostForm("provider") if provider == "" { provider = c.Query("provider") } provider = strings.ToLower(provider) if username == "" || password == "" { if strings.Contains(contentType, "application/json") { c.JSON(http.StatusBadRequest, gin.H{"success": false, "error": "username and password required"}) } else { pongo2Renderer.HTML(c, http.StatusBadRequest, "components/error.pongo2", pongo2.Context{"error": "Username and password are required"}) } return } authService := GetAuthService() if authService == nil { pongo2Renderer.HTML(c, http.StatusInternalServerError, "components/error.pongo2", pongo2.Context{ "error": "Authentication service unavailable", }) return } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() user, accessToken, refreshToken, err := authService.Login(ctx, username, password) if err != nil { if strings.Contains(contentType, "application/json") { adminUser := strings.TrimSpace(getEnvDefault("ADMIN_USER", "admin@example.com")) adminPass := strings.TrimSpace(getEnvDefault("ADMIN_PASSWORD", "admin123")) if (username == adminUser || (adminUser == "admin@example.com" && username == "root@localhost")) && password == adminPass { jwtm := shared.GetJWTManager() if jwtm == nil { c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": "jwt manager unavailable"}) return } tok, err2 := jwtm.GenerateToken(1, username, "Admin", 0) if err2 != nil { c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": "token generation failed"}) return } c.JSON(http.StatusOK, gin.H{"success": true, "access_token": tok, "token_type": "Bearer", "user": gin.H{"id": 1, "login": username, "role": "Admin"}}) return } } if strings.Contains(contentType, "application/json") { c.JSON(http.StatusUnauthorized, gin.H{"success": false, "error": "invalid credentials"}) return } if c.GetHeader("HX-Request") == "true" { c.Data(http.StatusUnauthorized, "text/html; charset=utf-8", []byte(`<div class="rounded-md bg-red-50 dark:bg-red-900/20 p-4 mt-4"><div class="text-sm text-red-800 dark:text-red-200">Invalid username or password</div></div>`)) } else { c.Redirect(http.StatusSeeOther, "/login?error=Invalid+username+or+password") } return } sessionTimeout := constants.DefaultSessionTimeout if db, err := database.GetDB(); err == nil && db != nil { prefService := service.NewUserPreferencesService(db) if userTimeout := prefService.GetSessionTimeout(int(user.ID)); userTimeout > 0 { sessionTimeout = userTimeout } } c.SetCookie( "auth_token", accessToken, sessionTimeout, "/", "", false, true, ) c.SetCookie( "access_token", accessToken, sessionTimeout, "/", "", false, true, ) c.SetCookie( "refresh_token", refreshToken, constants.RefreshTokenTimeout, "/", "", false, true, ) c.Set("user", user) c.Set("user_id", user.ID) if provider != "" { c.Set("auth_provider", provider) } if strings.Contains(contentType, "application/json") { c.JSON(http.StatusOK, gin.H{"success": true, "access_token": accessToken, "refresh_token": refreshToken, "token_type": "Bearer"}) return } if c.GetHeader("HX-Request") == "true" { c.Header("HX-Redirect", "/dashboard") c.String(http.StatusOK, "Login successful, redirecting...") return } c.Redirect(http.StatusSeeOther, "/dashboard") }
HandleAuthLogin handles the login form submission
var HandleAuthLogout = func(c *gin.Context) { c.SetCookie("auth_token", "", -1, "/", "", false, true) c.SetCookie("access_token", "", -1, "/", "", false, true) c.SetCookie("refresh_token", "", -1, "/", "", false, true) c.Redirect(http.StatusSeeOther, "/login") }
HandleAuthLogout handles user logout
var HandleWebSocketChat = func(c *gin.Context) { conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { log.Printf("WebSocket upgrade failed: %v", err) return } sessionID := c.Query("session") if sessionID == "" { sessionID = generateMessageID() } page := c.Query("page") userID := "" if user := getUserFromContext(c); user != nil { userID = fmt.Sprintf("%d", user.ID) } client := &ChatClient{ conn: conn, send: make(chan ChatMessage, 256), sessionID: sessionID, userID: userID, page: page, } chatHub.register <- client go client.writePump() go client.readPump() }
HandleWebSocketChat handles WebSocket connections for real-time chat
Functions ¶
func BroadcastTicketUpdate ¶
func BroadcastTicketUpdate(eventType string, ticketData interface{})
BroadcastTicketUpdate sends an update to all connected clients
func BuildRoutesManifest ¶
BuildRoutesManifest constructs the manifest JSON without registering routes (for tooling)
func ExtractToken ¶
ExtractToken extracts the JWT token from the Authorization header
func GenerateRoutesManifest ¶
func GenerateRoutesManifest() error
GenerateRoutesManifest creates a temporary gin engine, registers YAML routes and ensures the manifest file exists. Used by tooling (make routes-generate) without starting full server.
func GetArticleAttachments ¶
GetArticleAttachments retrieves attachments for a specific article from the database
func GetAuthService ¶
func GetAuthService() *service.AuthService
GetAuthService returns the singleton auth service instance
func GetDynamicHandler ¶
func GetDynamicHandler() *dynamic.DynamicModuleHandler
GetDynamicHandler returns the initialized dynamic handler
func GetHandler ¶
func GetHandler(name string) (gin.HandlerFunc, bool)
GetHandler retrieves a registered handler.
func GetLookupRepository ¶
func GetLookupRepository() repository.LookupRepository
func GetLookupService ¶
func GetLookupService() *service.LookupService
GetLookupService returns the singleton lookup service instance
func GetPriorityRepository ¶
func GetPriorityRepository() *repository.PriorityRepository
GetPriorityRepository returns the singleton priority repository instance
func GetQueueRepository ¶
func GetQueueRepository() *repository.QueueRepository
GetQueueRepository returns the singleton queue repository instance
func GetStorageService ¶
func GetStorageService() service.StorageService
GetStorageService returns the singleton storage service instance
func GetTemplateService ¶
func GetTemplateService() *service.TicketTemplateService
func GetTicketAttachments ¶
GetTicketAttachments retrieves all attachments for all articles in a ticket
func GetTicketRepository ¶
func GetTicketRepository() repository.ITicketRepository
GetTicketRepository returns the singleton ticket repository instance
func GetTicketService ¶
func GetTicketService() *service.SimpleTicketService
GetTicketService returns the singleton simple ticket service instance
func GetUserMapForTemplate ¶
GetUserMapForTemplate exposes the internal user-context builder for reuse across packages without duplicating logic.
func GetUserRepository ¶
func GetUserRepository() *repository.UserRepository
GetUserRepository returns the singleton user repository instance
func HandleAPIQueueDetails ¶
HandleAPIQueueDetails handles GET /api/queues/:id/details
func HandleAPIQueueGet ¶
HandleAPIQueueGet handles GET /api/queues/:id
func HandleAPIQueueStatus ¶
HandleAPIQueueStatus handles PUT /api/queues/:id/status
func HandleAddTicketTime ¶
HandleAddTicketTime is the exported wrapper for YAML routing in the routing package It delegates to handleAddTicketTime to keep the implementation in one place.
func HandleAddUserToGroupAPI ¶
HandleAddUserToGroupAPI handles POST /api/v1/users/:id/groups
func HandleAdminCustomerUsersBulkAction ¶
HandleAdminCustomerUsersBulkAction handles POST /admin/customer-users/bulk-action
func HandleAdminCustomerUsersCreate ¶
HandleAdminCustomerUsersCreate handles POST /admin/customer-users
func HandleAdminCustomerUsersDelete ¶
HandleAdminCustomerUsersDelete handles DELETE /admin/customer-users/:id (soft delete)
func HandleAdminCustomerUsersExport ¶
HandleAdminCustomerUsersExport handles GET /admin/customer-users/export
func HandleAdminCustomerUsersGet ¶
HandleAdminCustomerUsersGet handles GET /admin/customer-users/:id
func HandleAdminCustomerUsersImport ¶
HandleAdminCustomerUsersImport handles POST /admin/customer-users/import
func HandleAdminCustomerUsersImportForm ¶
HandleAdminCustomerUsersImportForm handles GET /admin/customer-users/import
func HandleAdminCustomerUsersList ¶
HandleAdminCustomerUsersList handles GET /admin/customer-users
func HandleAdminCustomerUsersTickets ¶
HandleAdminCustomerUsersTickets handles GET /admin/customer-users/:id/tickets
func HandleAdminCustomerUsersUpdate ¶
HandleAdminCustomerUsersUpdate handles PUT /admin/customer-users/:id
func HandleAdminGroupsAddUser ¶
HandleAdminGroupsAddUser handles POST /admin/groups/:id/users
func HandleAdminGroupsCreate ¶
HandleAdminGroupsCreate handles POST /admin/groups
func HandleAdminGroupsDelete ¶
HandleAdminGroupsDelete handles DELETE /admin/groups/:id
func HandleAdminGroupsRemoveUser ¶
HandleAdminGroupsRemoveUser handles DELETE /admin/groups/:id/users/:userId
func HandleAdminGroupsUpdate ¶
HandleAdminGroupsUpdate handles PUT /admin/groups/:id
func HandleAdminGroupsUsers ¶
HandleAdminGroupsUsers handles GET /admin/groups/:id/users
func HandleAdminTickets ¶
HandleAdminTickets displays all tickets for admin management
func HandleAdminUserCreate ¶
HandleAdminUserCreate handles POST /admin/users
func HandleAdminUserDelete ¶
HandleAdminUserDelete handles DELETE /admin/users/:id
func HandleAdminUserGet ¶
HandleAdminUserGet handles GET /admin/users/:id
func HandleAdminUserGroups ¶
HandleAdminUserGroups handles GET /admin/users/:id/groups
func HandleAdminUserResetPassword ¶
HandleAdminUserResetPassword handles password reset for a user by admin
func HandleAdminUserUpdate ¶
HandleAdminUserUpdate handles PUT /admin/users/:id
func HandleAdminUsers ¶
HandleAdminUsers renders the admin users management page
func HandleAdminUsersCreate ¶
HandleAdminUsersCreate handles POST /admin/users
func HandleAdminUsersDelete ¶
HandleAdminUsersDelete handles DELETE /admin/users/:id
func HandleAdminUsersList ¶
HandleAdminUsersList handles GET /admin/users (JSON API)
func HandleAdminUsersStatus ¶
HandleAdminUsersStatus handles PUT /admin/users/:id/status to toggle user valid status
func HandleAdminUsersUpdate ¶
HandleAdminUsersUpdate handles PUT /admin/users/:id
func HandleAgentCreateTicket ¶
func HandleAgentCreateTicket(db *sql.DB) gin.HandlerFunc
HandleAgentCreateTicket creates a new ticket from the agent interface
func HandleAgentNewTicket ¶
func HandleAgentNewTicket(db *sql.DB) gin.HandlerFunc
HandleAgentNewTicket displays the agent ticket creation form with necessary data
func HandleAgentPerformanceAPI ¶
HandleAgentPerformanceAPI handles GET /api/v1/statistics/agents
func HandleAssignQueueGroupAPI ¶
HandleAssignQueueGroupAPI handles POST /api/v1/queues/:id/groups
func HandleAssignTicketAPI ¶
HandleAssignTicketAPI handles ticket assignment via API
func HandleClaudeFeedback ¶
HandleClaudeFeedback processes feedback from the Claude chat widget
func HandleClaudeTicketStatus ¶
HandleClaudeTicketStatus checks the status of Claude tickets
func HandleCloseTicketAPI ¶
HandleCloseTicketAPI handles ticket closure via API
func HandleCreateArticleAPI ¶
HandleCreateArticleAPI handles POST /api/v1/tickets/:ticket_id/articles
func HandleCreateInternalNote ¶
HandleCreateInternalNote creates a new internal note
func HandleCreatePriorityAPI ¶
HandleCreatePriorityAPI handles POST /api/v1/priorities
func HandleCreateQueueAPI ¶
HandleCreateQueueAPI handles POST /api/v1/queues
func HandleCreateSLAAPI ¶
HandleCreateSLAAPI handles POST /api/v1/slas
func HandleCreateTicketAPI ¶
HandleCreateTicketAPI handles ticket creation via API
func HandleCreateTicketStateAPI ¶
HandleCreateTicketStateAPI handles POST /api/v1/ticket-states
func HandleCreateUserAPI ¶
HandleCreateUserAPI handles POST /api/v1/users
func HandleCustomerStatisticsAPI ¶
HandleCustomerStatisticsAPI handles GET /api/v1/statistics/customers
func HandleDashboardStatisticsAPI ¶
HandleDashboardStatisticsAPI handles GET /api/v1/statistics/dashboard
func HandleDeleteArticleAPI ¶
HandleDeleteArticleAPI handles DELETE /api/v1/tickets/:ticket_id/articles/:id
func HandleDeleteInternalNote ¶
HandleDeleteInternalNote deletes an internal note
func HandleDeletePriorityAPI ¶
HandleDeletePriorityAPI handles DELETE /api/v1/priorities/:id
func HandleDeleteQueueAPI ¶
HandleDeleteQueueAPI handles DELETE /api/v1/queues/:id
func HandleDeleteSLAAPI ¶
HandleDeleteSLAAPI handles DELETE /api/v1/slas/:id
func HandleDeleteTicketAPI ¶
HandleDeleteTicketAPI handles ticket deletion/archiving via API In OTRS, tickets are never hard deleted, only archived
func HandleDeleteTicketStateAPI ¶
HandleDeleteTicketStateAPI handles DELETE /api/v1/ticket-states/:id
func HandleDeleteUserAPI ¶
HandleDeleteUserAPI handles DELETE /api/v1/users/:id This performs a soft delete by setting valid_id = 2 (OTRS pattern)
func HandleDeleteWebhookAPI ¶
HandleDeleteWebhookAPI handles DELETE /api/v1/webhooks/:id
func HandleExportStatisticsAPI ¶
HandleExportStatisticsAPI handles GET /api/v1/statistics/export
func HandleGetArticleAPI ¶
HandleGetArticleAPI handles GET /api/v1/tickets/:ticket_id/articles/:id
func HandleGetFormData ¶
HandleGetFormData returns form data for ticket creation as JSON
func HandleGetInternalNotes ¶
HandleGetInternalNotes returns internal notes for a ticket
func HandleGetPriorities ¶
HandleGetPriorities returns list of priorities as JSON or HTML options for HTMX
func HandleGetPriorityAPI ¶
HandleGetPriorityAPI handles GET /api/v1/priorities/:id
func HandleGetQueueAPI ¶
HandleGetQueueAPI handles GET /api/v1/queues/:id
func HandleGetQueueAgentsAPI ¶
HandleGetQueueAgentsAPI handles GET /api/v1/queues/:id/agents
func HandleGetQueueStatsAPI ¶
HandleGetQueueStatsAPI handles GET /api/v1/queues/:id/stats
func HandleGetQueues ¶
HandleGetQueues returns list of queues as JSON or HTML options for HTMX
func HandleGetSLAAPI ¶
HandleGetSLAAPI handles GET /api/v1/slas/:id
func HandleGetSessionTimeout ¶
HandleGetSessionTimeout retrieves the user's session timeout preference
func HandleGetStatuses ¶
HandleGetStatuses returns list of ticket statuses as JSON
func HandleGetTicketAPI ¶
HandleGetTicketAPI handles GET /api/v1/tickets/:id
func HandleGetTicketStateAPI ¶
HandleGetTicketStateAPI handles GET /api/v1/ticket-states/:id
func HandleGetTypes ¶
HandleGetTypes returns list of ticket types as JSON or HTML options for HTMX Behavior:
- If a DB connection is available (including sqlmock in tests), return SQL-backed shape: [{id, name, comments, valid_id}]
- If no DB is available, return in-memory lookup shape from service (value/label/order/active)
- If a DB query fails, return 500 with an error (matches unit test expectations)
- For HTMX requests, returns HTML <option> elements instead of JSON
func HandleGetUserAPI ¶
HandleGetUserAPI handles GET /api/v1/users/:id
func HandleGetUserGroupsAPI ¶
HandleGetUserGroupsAPI handles GET /api/v1/users/:id/groups
func HandleGetWebhookAPI ¶
HandleGetWebhookAPI handles GET /api/v1/webhooks/:id
func HandleInvalidateLookupCache ¶
HandleInvalidateLookupCache forces a refresh of the lookup cache
func HandleLegacyAgentTicketViewRedirect ¶
handleLegacyAgentTicketViewRedirect redirects legacy agent ticket URLs to the unified ticket detail route Example: /agent/tickets/123 -> /ticket/202510131000003 HandleLegacyAgentTicketViewRedirect exported for YAML routing
func HandleLegacyTicketsViewRedirect ¶
handleLegacyTicketsViewRedirect supports old /tickets/:id URLs and redirects to /ticket/:tn HandleLegacyTicketsViewRedirect exported for YAML routing
func HandleListArticlesAPI ¶
HandleListArticlesAPI handles GET /api/v1/tickets/:ticket_id/articles
func HandleListPrioritiesAPI ¶
HandleListPrioritiesAPI handles GET /api/v1/priorities
func HandleListQueuesAPI ¶
HandleListQueuesAPI handles GET /api/v1/queues
func HandleListSLAsAPI ¶
HandleListSLAsAPI handles GET /api/v1/slas
func HandleListStatesAPI ¶
HandleListStatesAPI handles GET /api/v1/states
func HandleListTicketStatesAPI ¶
HandleListTicketStatesAPI handles GET /api/v1/ticket-states
func HandleListTicketsAPI ¶
HandleListTicketsAPI handles GET /api/v1/tickets
func HandleListTypesAPI ¶
HandleListTypesAPI handles GET /api/v1/types
func HandleListUsersAPI ¶
HandleListUsersAPI handles GET /api/v1/users
func HandleListWebhooksAPI ¶
HandleListWebhooksAPI handles GET /api/v1/webhooks
func HandleLoginAPI ¶
HandleLoginAPI authenticates a user and returns JWT tokens
func HandleLogoutAPI ¶
HandleLogoutAPI logs out a user (client-side token removal)
func HandlePasswordPolicy ¶
HandlePasswordPolicy returns the current password policy settings
func HandleProfile ¶
HandleProfile is the exported version of handleProfile
func HandleQueueMetricsAPI ¶
HandleQueueMetricsAPI handles GET /api/v1/statistics/queues
func HandleRedirectProfile ¶
HandleRedirectProfile is the exported version of redirect handler
func HandleRedirectQueues ¶
HandleRedirectQueues is the exported version
func HandleRedirectSettings ¶
HandleRedirectSettings is the exported version
func HandleRedirectTickets ¶
HandleRedirectTickets is the exported version
func HandleRedirectTicketsNew ¶
HandleRedirectTicketsNew is the exported version
func HandleRefreshTokenAPI ¶
HandleRefreshTokenAPI refreshes an expired JWT token
func HandleRegisterAPI ¶
HandleRegisterAPI registers a new user (if enabled)
func HandleRegisterWebhookAPI ¶
HandleRegisterWebhookAPI handles POST /api/v1/webhooks
func HandleReindexAPI ¶
HandleReindexAPI handles POST /api/v1/search/reindex
func HandleRemoveQueueGroupAPI ¶
HandleRemoveQueueGroupAPI handles DELETE /api/v1/queues/:id/groups/:group_id
func HandleRemoveUserFromGroupAPI ¶
HandleRemoveUserFromGroupAPI handles DELETE /api/v1/users/:id/groups/:group_id
func HandleReopenTicketAPI ¶
HandleReopenTicketAPI handles ticket reopening via API
func HandleRetryWebhookDeliveryAPI ¶
HandleRetryWebhookDeliveryAPI handles POST /api/v1/webhooks/deliveries/:id/retry
func HandleSLAMetricsAPI ¶
HandleSLAMetricsAPI handles GET /api/v1/slas/:id/metrics
func HandleSearchAPI ¶
HandleSearchAPI handles POST /api/v1/search
func HandleSearchHealthAPI ¶
HandleSearchHealthAPI handles GET /api/v1/search/health
func HandleSearchSuggestionsAPI ¶
HandleSearchSuggestionsAPI handles GET /api/v1/search/suggestions
func HandleSetSessionTimeout ¶
HandleSetSessionTimeout sets the user's session timeout preference
func HandleStaticFiles ¶
HandleStaticFiles serves static files from the static directory
func HandleTemplate ¶
HandleTemplate handles template rendering routes
func HandleTestWebhookAPI ¶
HandleTestWebhookAPI handles POST /api/v1/webhooks/:id/test
func HandleTicketStateStatisticsAPI ¶
HandleTicketStateStatisticsAPI handles GET /api/v1/ticket-states/statistics
func HandleTicketTrendsAPI ¶
HandleTicketTrendsAPI handles GET /api/v1/statistics/trends
func HandleTimeBasedAnalyticsAPI ¶
HandleTimeBasedAnalyticsAPI handles GET /api/v1/statistics/analytics
func HandleUpdateArticleAPI ¶
HandleUpdateArticleAPI handles PUT /api/v1/tickets/:ticket_id/articles/:id
func HandleUpdateInternalNote ¶
HandleUpdateInternalNote updates an existing internal note
func HandleUpdatePriorityAPI ¶
HandleUpdatePriorityAPI handles PUT /api/v1/priorities/:id
func HandleUpdateQueueAPI ¶
HandleUpdateQueueAPI handles PUT /api/v1/queues/:id
func HandleUpdateSLAAPI ¶
HandleUpdateSLAAPI handles PUT /api/v1/slas/:id
func HandleUpdateTicketAPI ¶
HandleUpdateTicketAPI handles PUT /api/v1/tickets/:id
func HandleUpdateTicketStateAPI ¶
HandleUpdateTicketStateAPI handles PUT /api/v1/ticket-states/:id
func HandleUpdateUserAPI ¶
HandleUpdateUserAPI handles PUT /api/v1/users/:id
func HandleUpdateWebhookAPI ¶
HandleUpdateWebhookAPI handles PUT /api/v1/webhooks/:id
func HandleUserMeAPI ¶
HandleUserMeAPI returns the current authenticated user's information
func HandleWebhookDeliveriesAPI ¶
HandleWebhookDeliveriesAPI handles GET /api/v1/webhooks/:id/deliveries
func ImprovedHandleAdminUserGet ¶
ImprovedHandleAdminUserGet handles GET /admin/users/:id with enhanced error handling and logging
func ImprovedHandleAdminUserUpdate ¶
ImprovedHandleAdminUserUpdate handles PUT /admin/users/:id with enhanced group handling
func InitPongo2Renderer ¶
func InitPongo2Renderer(templateDir string)
InitPongo2Renderer initializes the global pongo2 renderer
func InitializeLDAPService ¶
func InitializeLDAPService()
InitializeLDAPService initializes the LDAP service with repositories
func InitializeServices ¶
func InitializeServices()
InitializeServices initializes singleton service instances
func JWTAuthMiddleware ¶
func JWTAuthMiddleware() gin.HandlerFunc
JWTAuthMiddleware is a middleware that requires JWT authentication
func ListHandlers ¶
func ListHandlers() []string
ListHandlers returns sorted handler names (for diagnostics / tests).
func LoadTicketStatesForForm ¶
LoadTicketStatesForForm fetches valid ticket states and builds alias lookup data for forms.
func NewHTMXRouter ¶
NewHTMXRouter creates all routes for the HTMX UI
func NewSimpleRouter ¶
NewSimpleRouter creates a router with basic routes
func RegisterAdminCustomerCompanyRoutes ¶
func RegisterAdminCustomerCompanyRoutes(r *gin.RouterGroup, db *sql.DB)
RegisterAdminCustomerCompanyRoutes registers customer company management routes
func RegisterAgentHandlers ¶
func RegisterAgentHandlers()
RegisterAgentHandlers registers agent handlers for YAML routing
func RegisterAgentHandlersForRouting ¶
func RegisterAgentHandlersForRouting()
RegisterAgentHandlersForRouting registers agent handlers for YAML routing
func RegisterAgentRoutes ¶
func RegisterAgentRoutes(r *gin.RouterGroup, db *sql.DB)
RegisterAgentRoutes registers all agent interface routes
func RegisterCustomerRoutes ¶
func RegisterCustomerRoutes(r *gin.RouterGroup, db *sql.DB)
RegisterCustomerRoutes registers all customer portal routes
func RegisterDevRoutes ¶
func RegisterDevRoutes(r *gin.RouterGroup)
RegisterDevRoutes registers all developer routes
func RegisterHandler ¶
func RegisterHandler(name string, h gin.HandlerFunc)
RegisterHandler adds/overwrites a handler under a given name.
func RegisterWithRouting ¶
func RegisterWithRouting(registry interface{}) error
RegisterWithRouting registers all API handlers with the routing system NOTE: This function is disabled to avoid circular dependency The routing registration should be handled at the application level
func RenderMarkdown ¶
RenderMarkdown converts markdown content to HTML with Tailwind styling
func SetupAPIv1Routes ¶
func SetupAPIv1Routes(r *gin.Engine, jwtManager *auth.JWTManager, ldapProvider *ldap.Provider, i18nSvc interface{})
SetupAPIv1Routes configures the v1 API routes
func SetupBasicRoutes ¶
SetupBasicRoutes adds basic routes to an existing router
func SetupDynamicModules ¶
func SetupDynamicModules(router *gin.RouterGroup, db *sql.DB) error
SetupDynamicModules initializes and registers the dynamic module system alongside existing static modules for side-by-side testing
func SetupHTMXRoutes ¶
SetupHTMXRoutes sets up all HTMX routes on the given router
func SetupLDAPRoutes ¶
SetupLDAPRoutes configures LDAP API routes
func ValidateAllTemplates ¶
ValidateAllTemplates walks templatesDir, parses every .pongo2 file, and returns a list of failures
func ValidateTemplatesReferencedInRoutes ¶
ValidateTemplatesReferencedInRoutes loads YAML route groups from routesDir and attempts to parse each route's Template against templatesDir. Returns a list of failures (missing/unparsable).
func ValidateUploadedFile ¶
func ValidateUploadedFile(header *multipart.FileHeader) error
ValidateUploadedFile is a small exported wrapper around validateFile to enable focused unit tests from an external test package without importing all api tests.
Types ¶
type AgentHandlerRegistry ¶
type AgentHandlerRegistry struct {
NewTicket gin.HandlerFunc
CreateTicket gin.HandlerFunc
}
AgentHandlerRegistry holds references to agent handlers for external registration
type Attachment ¶
type Attachment struct {
ID int `json:"id"`
TicketID int `json:"ticket_id"`
Filename string `json:"filename"`
ContentType string `json:"content_type"`
Size int64 `json:"size"`
StoragePath string `json:"-"` // Hidden from JSON
Description string `json:"description"`
Tags []string `json:"tags"`
Internal bool `json:"internal"`
UploadedBy int `json:"uploaded_by"`
UploadedAt time.Time `json:"uploaded_at"`
Downloaded int `json:"download_count"`
}
Attachment represents a file attached to a ticket
type AuthHandler ¶
type AuthHandler struct {
// contains filtered or unexported fields
}
func NewAuthHandler ¶
func NewAuthHandler(authService *service.AuthService) *AuthHandler
func (*AuthHandler) ChangePassword ¶
func (h *AuthHandler) ChangePassword(c *gin.Context)
func (*AuthHandler) GetCurrentUser ¶
func (h *AuthHandler) GetCurrentUser(c *gin.Context)
func (*AuthHandler) Login ¶
func (h *AuthHandler) Login(c *gin.Context)
func (*AuthHandler) Logout ¶
func (h *AuthHandler) Logout(c *gin.Context)
func (*AuthHandler) RefreshToken ¶
func (h *AuthHandler) RefreshToken(c *gin.Context)
type CannedResponse ¶
type CannedResponse struct {
ID int `json:"id"`
Name string `json:"name"`
Category string `json:"category"`
Content string `json:"content"`
ContentType string `json:"content_type"` // text or html
Tags []string `json:"tags"`
Scope string `json:"scope"` // personal, team, global
OwnerID int `json:"owner_id"`
TeamID int `json:"team_id,omitempty"`
Placeholders []string `json:"placeholders"`
UsageCount int `json:"usage_count"`
LastUsed *time.Time `json:"last_used,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
CannedResponse represents a pre-written response
type CannedResponseHandlers ¶
type CannedResponseHandlers struct {
// contains filtered or unexported fields
}
CannedResponseHandlers manages canned response API endpoints
func NewCannedResponseHandlers ¶
func NewCannedResponseHandlers() *CannedResponseHandlers
NewCannedResponseHandlers creates a new canned response handlers instance
func (*CannedResponseHandlers) ApplyResponse ¶
func (h *CannedResponseHandlers) ApplyResponse(c *gin.Context)
ApplyResponse applies a canned response to a ticket
func (*CannedResponseHandlers) CreateResponse ¶
func (h *CannedResponseHandlers) CreateResponse(c *gin.Context)
CreateResponse creates a new canned response
func (*CannedResponseHandlers) DeleteResponse ¶
func (h *CannedResponseHandlers) DeleteResponse(c *gin.Context)
DeleteResponse deletes a canned response
func (*CannedResponseHandlers) ExportResponses ¶
func (h *CannedResponseHandlers) ExportResponses(c *gin.Context)
ExportResponses exports all canned responses as JSON
func (*CannedResponseHandlers) GetCategories ¶
func (h *CannedResponseHandlers) GetCategories(c *gin.Context)
GetCategories retrieves all canned response categories
func (*CannedResponseHandlers) GetPopularResponses ¶
func (h *CannedResponseHandlers) GetPopularResponses(c *gin.Context)
GetPopularResponses retrieves the most used responses
func (*CannedResponseHandlers) GetQuickResponses ¶
func (h *CannedResponseHandlers) GetQuickResponses(c *gin.Context)
GetQuickResponses retrieves responses with shortcuts
func (*CannedResponseHandlers) GetResponseByID ¶
func (h *CannedResponseHandlers) GetResponseByID(c *gin.Context)
GetResponseByID retrieves a specific canned response
func (*CannedResponseHandlers) GetResponses ¶
func (h *CannedResponseHandlers) GetResponses(c *gin.Context)
GetResponses retrieves all active canned responses
func (*CannedResponseHandlers) GetResponsesByCategory ¶
func (h *CannedResponseHandlers) GetResponsesByCategory(c *gin.Context)
GetResponsesByCategory retrieves responses by category
func (*CannedResponseHandlers) GetResponsesForUser ¶
func (h *CannedResponseHandlers) GetResponsesForUser(c *gin.Context)
GetResponsesForUser retrieves responses accessible to the current user
func (*CannedResponseHandlers) ImportResponses ¶
func (h *CannedResponseHandlers) ImportResponses(c *gin.Context)
ImportResponses imports canned responses from JSON
func (*CannedResponseHandlers) SearchResponses ¶
func (h *CannedResponseHandlers) SearchResponses(c *gin.Context)
SearchResponses searches for canned responses
func (*CannedResponseHandlers) UpdateResponse ¶
func (h *CannedResponseHandlers) UpdateResponse(c *gin.Context)
UpdateResponse updates an existing canned response
type ChatClient ¶
type ChatClient struct {
// contains filtered or unexported fields
}
ChatClient represents a connected chat client
type ChatHub ¶
type ChatHub struct {
// contains filtered or unexported fields
}
ChatHub manages all active chat connections
type ChatMessage ¶
type ChatMessage struct {
ID string `json:"id"`
Type string `json:"type"` // user, claude, system
Message string `json:"message"`
Timestamp time.Time `json:"timestamp"`
Context interface{} `json:"context,omitempty"`
UserID string `json:"userId,omitempty"`
SessionID string `json:"sessionId,omitempty"`
}
ChatMessage represents a message in the chat
type CoverageResponse ¶
type CoverageResponse struct {
Languages []LanguageCoverage `json:"languages"`
Summary struct {
TotalKeys int `json:"total_keys"`
AverageCoverage float64 `json:"average_coverage"`
} `json:"summary"`
}
CoverageResponse represents the coverage statistics response
type CreateUserRequest ¶
type CreateUserRequest struct {
Login string `json:"login" binding:"required"`
Email string `json:"email" binding:"required,email"`
Password string `json:"password" binding:"required,min=8"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
ValidID int `json:"valid_id"`
Groups []int `json:"groups"` // Optional group IDs to assign
}
CreateUserRequest represents the request to create a new user
type EscalationResult ¶
type EscalationResult struct {
ShouldEscalate bool `json:"should_escalate"`
EscalationLevel string `json:"escalation_level"`
NotifyList []string `json:"notify_list"`
Level string `json:"level"`
}
EscalationResult represents the result of escalation check
type I18nHandlers ¶
type I18nHandlers struct {
// contains filtered or unexported fields
}
I18nHandlers handles internationalization-related requests
func NewI18nHandlers ¶
func NewI18nHandlers() *I18nHandlers
NewI18nHandlers creates new i18n handlers
func (*I18nHandlers) ExportTranslations ¶
func (h *I18nHandlers) ExportTranslations(c *gin.Context)
ExportTranslations exports translations in various formats @Summary Export translations @Description Export translations for a language in JSON or CSV format @Tags I18n @Produce json,text/csv @Param lang path string true "Language code" @Param format query string false "Export format (json or csv)" default(json) @Success 200 {object} map[string]interface{} "JSON translations" @Success 200 {string} string "CSV translations" @Failure 404 {object} ErrorResponse @Router /api/v1/i18n/export/{lang} [get]
func (*I18nHandlers) GetCurrentTranslations ¶
func (h *I18nHandlers) GetCurrentTranslations(c *gin.Context)
GetCurrentTranslations returns translations for the current language @Summary Get current translations @Description Get all translations for the current user's language @Tags I18n @Produce json @Success 200 {object} TranslationsResponse @Router /api/v1/i18n/translations [get]
func (*I18nHandlers) GetLanguageStats ¶
func (h *I18nHandlers) GetLanguageStats(c *gin.Context)
GetLanguageStats returns language usage statistics @Summary Get language statistics @Description Get usage statistics for all languages @Tags I18n @Produce json @Success 200 {object} LanguageStatsResponse @Router /api/v1/i18n/stats [get]
func (*I18nHandlers) GetMissingTranslations ¶
func (h *I18nHandlers) GetMissingTranslations(c *gin.Context)
GetMissingTranslations returns missing translation keys for a language @Summary Get missing translations @Description Get list of missing translation keys for a specific language @Tags I18n @Produce json @Param lang path string true "Language code" @Success 200 {object} MissingKeysResponse @Failure 404 {object} ErrorResponse @Router /api/v1/i18n/missing/{lang} [get]
func (*I18nHandlers) GetSupportedLanguages ¶
func (h *I18nHandlers) GetSupportedLanguages(c *gin.Context)
GetSupportedLanguages returns the list of supported languages @Summary Get supported languages @Description Get list of all supported languages @Tags I18n @Produce json @Success 200 {object} LanguagesResponse @Router /api/v1/i18n/languages [get]
func (*I18nHandlers) GetTranslationCoverage ¶
func (h *I18nHandlers) GetTranslationCoverage(c *gin.Context)
GetTranslationCoverage returns translation coverage statistics @Summary Get translation coverage @Description Get translation coverage statistics for all languages @Tags I18n @Produce json @Success 200 {object} CoverageResponse @Router /api/v1/i18n/coverage [get]
func (*I18nHandlers) GetTranslations ¶
func (h *I18nHandlers) GetTranslations(c *gin.Context)
GetTranslations returns translations for a specific language @Summary Get translations @Description Get all translations for a specific language @Tags I18n @Produce json @Param lang path string true "Language code" @Success 200 {object} TranslationsResponse @Failure 404 {object} ErrorResponse @Router /api/v1/i18n/translations/{lang} [get]
func (*I18nHandlers) RegisterRoutes ¶
func (h *I18nHandlers) RegisterRoutes(router *gin.RouterGroup)
RegisterRoutes registers i18n routes
func (*I18nHandlers) SetLanguage ¶
func (h *I18nHandlers) SetLanguage(c *gin.Context)
SetLanguage sets the user's preferred language @Summary Set user language @Description Set the preferred language for the user @Tags I18n @Accept json @Produce json @Param request body SetLanguageRequest true "Language selection" @Success 200 {object} SuccessResponse @Failure 400 {object} ErrorResponse @Router /api/v1/i18n/language [post]
func (*I18nHandlers) Translate ¶
func (h *I18nHandlers) Translate(c *gin.Context)
Translate translates a specific key @Summary Translate key @Description Translate a specific key to the current language @Tags I18n @Accept json @Produce json @Param request body TranslateRequest true "Translation request" @Success 200 {object} TranslateResponse @Router /api/v1/i18n/translate [post]
func (*I18nHandlers) ValidateTranslations ¶
func (h *I18nHandlers) ValidateTranslations(c *gin.Context)
ValidateTranslations validates translations for completeness and correctness @Summary Validate translations @Description Validate translations for a language @Tags I18n @Produce json @Param lang path string true "Language code" @Success 200 {object} ValidationResponse @Failure 404 {object} ErrorResponse @Router /api/v1/i18n/validate/{lang} [get]
type InternalNote ¶
type InternalNote struct {
ID int `json:"id"`
TicketID int `json:"ticket_id"`
Content string `json:"content"`
FormattedContent string `json:"formatted_content"`
AuthorID int `json:"author_id"`
AuthorName string `json:"author_name"`
Visibility string `json:"visibility"` // always "internal"
CustomerVisible bool `json:"customer_visible"` // always false
IsPriority bool `json:"is_priority"`
Category string `json:"category"`
Mentions []string `json:"mentions"`
HasMentions bool `json:"has_mentions"`
HasTeamMention bool `json:"has_team_mention"`
Attachments []int `json:"attachments"`
IsEdited bool `json:"is_edited"`
EditedAt *time.Time `json:"edited_at,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
InternalNote represents an internal note on a ticket
type InternalNoteHandlers ¶
type InternalNoteHandlers struct {
// contains filtered or unexported fields
}
InternalNoteHandlers manages internal note API endpoints
func NewInternalNoteHandlers ¶
func NewInternalNoteHandlers() *InternalNoteHandlers
NewInternalNoteHandlers creates a new internal note handlers instance
func (*InternalNoteHandlers) CreateNote ¶
func (h *InternalNoteHandlers) CreateNote(c *gin.Context)
CreateNote creates a new internal note
func (*InternalNoteHandlers) CreateNoteFromTemplate ¶
func (h *InternalNoteHandlers) CreateNoteFromTemplate(c *gin.Context)
CreateNoteFromTemplate creates a note from a template
func (*InternalNoteHandlers) CreateTemplate ¶
func (h *InternalNoteHandlers) CreateTemplate(c *gin.Context)
CreateTemplate creates a new template
func (*InternalNoteHandlers) DeleteNote ¶
func (h *InternalNoteHandlers) DeleteNote(c *gin.Context)
DeleteNote deletes a note
func (*InternalNoteHandlers) DeleteTemplate ¶
func (h *InternalNoteHandlers) DeleteTemplate(c *gin.Context)
DeleteTemplate deletes a template
func (*InternalNoteHandlers) ExportNotes ¶
func (h *InternalNoteHandlers) ExportNotes(c *gin.Context)
ExportNotes exports notes in various formats
func (*InternalNoteHandlers) GetCategories ¶
func (h *InternalNoteHandlers) GetCategories(c *gin.Context)
GetCategories retrieves all note categories
func (*InternalNoteHandlers) GetEditHistory ¶
func (h *InternalNoteHandlers) GetEditHistory(c *gin.Context)
GetEditHistory retrieves edit history for a note
func (*InternalNoteHandlers) GetImportantNotes ¶
func (h *InternalNoteHandlers) GetImportantNotes(c *gin.Context)
GetImportantNotes retrieves important notes for a ticket
func (*InternalNoteHandlers) GetNoteByID ¶
func (h *InternalNoteHandlers) GetNoteByID(c *gin.Context)
GetNoteByID retrieves a specific note
func (*InternalNoteHandlers) GetNoteStatistics ¶
func (h *InternalNoteHandlers) GetNoteStatistics(c *gin.Context)
GetNoteStatistics retrieves statistics for notes
func (*InternalNoteHandlers) GetNotes ¶
func (h *InternalNoteHandlers) GetNotes(c *gin.Context)
GetNotes retrieves all notes for a ticket
func (*InternalNoteHandlers) GetPinnedNotes ¶
func (h *InternalNoteHandlers) GetPinnedNotes(c *gin.Context)
GetPinnedNotes retrieves pinned notes for a ticket
func (*InternalNoteHandlers) GetRecentActivity ¶
func (h *InternalNoteHandlers) GetRecentActivity(c *gin.Context)
GetRecentActivity retrieves recent activity
func (*InternalNoteHandlers) GetTemplates ¶
func (h *InternalNoteHandlers) GetTemplates(c *gin.Context)
GetTemplates retrieves all note templates
func (*InternalNoteHandlers) MarkImportant ¶
func (h *InternalNoteHandlers) MarkImportant(c *gin.Context)
MarkImportant marks or unmarks a note as important
func (*InternalNoteHandlers) PinNote ¶
func (h *InternalNoteHandlers) PinNote(c *gin.Context)
PinNote pins or unpins a note
func (*InternalNoteHandlers) SearchNotes ¶
func (h *InternalNoteHandlers) SearchNotes(c *gin.Context)
SearchNotes searches for notes
func (*InternalNoteHandlers) UpdateNote ¶
func (h *InternalNoteHandlers) UpdateNote(c *gin.Context)
UpdateNote updates an existing note
func (*InternalNoteHandlers) UpdateTemplate ¶
func (h *InternalNoteHandlers) UpdateTemplate(c *gin.Context)
UpdateTemplate updates a template
type LanguageCoverage ¶
type LanguageCoverage struct {
Code string `json:"code"`
Name string `json:"name"`
TotalKeys int `json:"total_keys"`
TranslatedKeys int `json:"translated_keys"`
MissingCount int `json:"missing_count"`
Coverage float64 `json:"coverage"`
}
LanguageCoverage represents coverage data for a language
type LanguageInfo ¶
type LanguageInfo struct {
Code string `json:"code"`
Name string `json:"name"`
NativeName string `json:"native_name"`
Active bool `json:"active"`
}
LanguageInfo represents information about a language
type LanguageStats ¶
type LanguageStats struct {
Code string `json:"code"`
Users int `json:"users"`
Percentage float64 `json:"percentage"`
}
LanguageStats represents language usage statistics
type LanguageStatsResponse ¶
type LanguageStatsResponse struct {
TotalUsers int `json:"total_users"`
Languages []LanguageStats `json:"languages"`
DefaultLanguage string `json:"default_language"`
}
LanguageStatsResponse represents language statistics response
type LanguagesResponse ¶
type LanguagesResponse struct {
Languages []LanguageInfo `json:"languages"`
Current string `json:"current"`
Default string `json:"default"`
}
LanguagesResponse represents the response for supported languages
type MergeHistory ¶
type MergeHistory struct {
Action string `json:"action"` // "merged" or "unmerged"
Tickets []int `json:"tickets"` // Ticket IDs involved
Reason string `json:"reason"` // Reason for action
PerformedBy string `json:"performed_by"` // User who performed action
PerformedAt time.Time `json:"performed_at"` // When action was performed
}
MergeHistory represents merge/unmerge history
type MergeRequest ¶
MergeRequest represents a ticket merge request
type MissingKey ¶
type MissingKey struct {
Key string `json:"key"`
EnglishValue string `json:"english_value"`
Category string `json:"category"`
}
MissingKey represents a missing translation key
type MissingKeysResponse ¶
type MissingKeysResponse struct {
Language string `json:"language"`
MissingKeys []MissingKey `json:"missing_keys"`
Count int `json:"count"`
}
MissingKeysResponse represents missing keys response
type NoteHistory ¶
type NoteHistory struct {
ID int `json:"id"`
NoteID int `json:"note_id"`
Content string `json:"content"`
EditedBy int `json:"edited_by"`
EditedAt time.Time `json:"edited_at"`
Version int `json:"version"`
}
NoteHistory represents edit history for a note
type PaginationInfo ¶
type PaginationInfo struct {
Page int `json:"page"`
PerPage int `json:"per_page"`
Total int `json:"total"`
TotalPages int `json:"total_pages"`
HasNext bool `json:"has_next"`
HasPrev bool `json:"has_prev"`
}
PaginationInfo contains pagination metadata
type Pongo2Renderer ¶
type Pongo2Renderer struct {
// contains filtered or unexported fields
}
func GetPongo2Renderer ¶
func GetPongo2Renderer() *Pongo2Renderer
GetPongo2Renderer returns the pongo2 renderer for template rendering
func NewPongo2Renderer ¶
func NewPongo2Renderer(templateDir string) *Pongo2Renderer
NewPongo2Renderer creates a new Pongo2Renderer with the given template directory
type Role ¶
type Role struct {
ID int `json:"id"`
Name string `json:"name"`
Comments *string `json:"comments"`
ValidID int `json:"valid_id"`
CreateTime time.Time `json:"create_time"`
CreateBy int `json:"create_by"`
ChangeTime time.Time `json:"change_time"`
ChangeBy int `json:"change_by"`
UserCount int `json:"user_count"`
GroupCount int `json:"group_count"`
IsActive bool `json:"is_active"` // Computed from ValidID
IsSystem bool `json:"is_system"` // True for built-in roles
Permissions []string `json:"permissions"` // Simple permissions list
}
Role represents a role in the system
type RoleGroupPermission ¶
type RoleGroupPermission struct {
GroupID int `json:"group_id"`
GroupName string `json:"group_name"`
Permissions map[string]bool `json:"permissions"`
}
RoleGroup represents group permissions for a role
type RoleUser ¶
type RoleUser struct {
UserID int `json:"user_id"`
Login string `json:"login"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Email string `json:"email"`
}
RoleUser represents a user assigned to a role
type SLA ¶
type SLA struct {
Status string `json:"status"` // within, warning, overdue
Deadline time.Time `json:"deadline"`
PercentUsed float64 `json:"percent_used"`
TimeRemaining string `json:"time_remaining"`
}
SLA represents Service Level Agreement status
type SLADefinition ¶
type SLADefinition struct {
ID int `json:"id"`
Name string `json:"name"`
CalendarName *string `json:"calendar_name,omitempty"`
FirstResponseTime *int `json:"first_response_time,omitempty"`
FirstResponseNotify *int `json:"first_response_notify,omitempty"`
UpdateTime *int `json:"update_time,omitempty"`
UpdateNotify *int `json:"update_notify,omitempty"`
SolutionTime *int `json:"solution_time,omitempty"`
SolutionNotify *int `json:"solution_notify,omitempty"`
Comments *string `json:"comments,omitempty"`
ValidID int `json:"valid_id"`
CreateTime time.Time `json:"create_time"`
CreateBy int `json:"create_by"`
ChangeTime time.Time `json:"change_time"`
ChangeBy int `json:"change_by"`
}
SLADefinition represents a Service Level Agreement configuration
type SLAWithStats ¶
type SLAWithStats struct {
SLADefinition
TicketCount int `json:"ticket_count"`
}
SLAWithStats includes additional statistics
type SavedSearch ¶
type SavedSearch struct {
ID int `json:"id"`
UserID int `json:"user_id"`
Name string `json:"name"`
Query string `json:"query"`
Filters string `json:"filters"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
SavedSearch represents a user's saved search
type SearchHandlers ¶
type SearchHandlers struct {
// contains filtered or unexported fields
}
SearchHandlers handles search-related API endpoints
func NewSearchHandlers ¶
func NewSearchHandlers() *SearchHandlers
NewSearchHandlers creates new search handlers
func (*SearchHandlers) AdvancedSearch ¶
func (h *SearchHandlers) AdvancedSearch(c *gin.Context)
AdvancedSearch performs an advanced search with filters
func (*SearchHandlers) DeleteTicketFromIndex ¶
func (h *SearchHandlers) DeleteTicketFromIndex(c *gin.Context)
DeleteTicketFromIndex removes a ticket from the search index
func (*SearchHandlers) ExecuteSavedSearch ¶
func (h *SearchHandlers) ExecuteSavedSearch(c *gin.Context)
ExecuteSavedSearch executes a saved search
func (*SearchHandlers) GetSavedSearch ¶
func (h *SearchHandlers) GetSavedSearch(c *gin.Context)
GetSavedSearch retrieves a specific saved search
func (*SearchHandlers) GetSavedSearches ¶
func (h *SearchHandlers) GetSavedSearches(c *gin.Context)
GetSavedSearches retrieves saved searches for a user
func (*SearchHandlers) GetSearchAnalytics ¶
func (h *SearchHandlers) GetSearchAnalytics(c *gin.Context)
GetSearchAnalytics retrieves search analytics
func (*SearchHandlers) GetSearchHistory ¶
func (h *SearchHandlers) GetSearchHistory(c *gin.Context)
GetSearchHistory retrieves search history for a user
func (*SearchHandlers) GetSearchSuggestions ¶
func (h *SearchHandlers) GetSearchSuggestions(c *gin.Context)
GetSearchSuggestions provides search suggestions
func (*SearchHandlers) IndexTicket ¶
func (h *SearchHandlers) IndexTicket(c *gin.Context)
IndexTicket indexes a single ticket
func (*SearchHandlers) ReindexTickets ¶
func (h *SearchHandlers) ReindexTickets(c *gin.Context)
ReindexTickets triggers reindexing of all tickets
func (*SearchHandlers) SaveSearch ¶
func (h *SearchHandlers) SaveSearch(c *gin.Context)
SaveSearch saves a search query
func (*SearchHandlers) SearchTickets ¶
func (h *SearchHandlers) SearchTickets(c *gin.Context)
SearchTickets performs a ticket search
func (*SearchHandlers) UpdateTicketIndex ¶
func (h *SearchHandlers) UpdateTicketIndex(c *gin.Context)
UpdateTicketIndex updates a ticket in the search index
type SearchHistory ¶
type SearchHistory struct {
ID int `json:"id"`
UserID int `json:"user_id"`
Query string `json:"query"`
Name string `json:"name,omitempty"`
Results int `json:"results"`
CreatedAt time.Time `json:"created_at"`
}
SearchHistory represents a user's search history entry
type SearchResult ¶
type SearchResult struct {
ID int `json:"id"`
Subject string `json:"subject"`
Body string `json:"body"`
Status string `json:"status"`
Priority string `json:"priority"`
QueueID int `json:"queue_id"`
QueueName string `json:"queue_name"`
AssigneeID int `json:"assignee_id"`
AssigneeName string `json:"assignee_name"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Score float64 `json:"score"`
Highlights map[string]string `json:"highlights,omitempty"`
}
SearchResult represents a search result item
type Service ¶
type Service struct {
ID int `json:"id"`
Name string `json:"name"`
Comments *string `json:"comments,omitempty"`
ValidID int `json:"valid_id"`
CreateTime time.Time `json:"create_time"`
CreateBy int `json:"create_by"`
ChangeTime time.Time `json:"change_time"`
ChangeBy int `json:"change_by"`
}
Service represents a service in OTRS
type ServiceWithStats ¶
type ServiceWithStats struct {
Service
TicketCount int `json:"ticket_count"`
SLACount int `json:"sla_count"`
}
ServiceWithStats includes additional statistics
type SetLanguageRequest ¶
type SetLanguageRequest struct {
Language string `json:"language" binding:"required"`
}
SetLanguageRequest represents a request to set language
type StandardAttachment ¶
type StandardAttachment struct {
ID int `json:"id"`
Name string `json:"name"`
Filename string `json:"filename"`
ContentType string `json:"content_type"`
Content []byte `json:"-"` // Don't send raw content in JSON
ContentSize int64 `json:"content_size"`
ContentSizeFormatted string `json:"content_size_formatted"`
Comments *string `json:"comments"`
ValidID int `json:"valid_id"`
CreateTime time.Time `json:"create_time"`
CreateBy int `json:"create_by"`
ChangeTime time.Time `json:"change_time"`
ChangeBy int `json:"change_by"`
}
StandardAttachment represents a standard attachment in OTRS
type State ¶
type State struct {
ID int `json:"id"`
Name string `json:"name"`
TypeID *int `json:"type_id,omitempty"`
Comments *string `json:"comments,omitempty"`
ValidID *int `json:"valid_id,omitempty"`
}
State represents a ticket state
type StateType ¶
type StateType struct {
ID int `json:"id"`
Name string `json:"name"`
Comments *string `json:"comments,omitempty"`
}
StateType represents a ticket state type
type StateWithType ¶
type StateWithType struct {
ID int `json:"id"`
Name string `json:"name"`
TypeID int `json:"type_id"`
TypeName string `json:"type_name"`
Comments *string `json:"comments,omitempty"`
ValidID int `json:"valid_id"`
TicketCount int `json:"ticket_count"`
}
StateWithType includes type information
type TestConfig ¶
type TestConfig struct {
UserLogin string
UserFirstName string
UserLastName string
UserEmail string
UserGroups []string
QueueName string
GroupName string
CompanyName string
}
GetTestConfig returns test configuration from environment variables with safe defaults
func GetTestConfig ¶
func GetTestConfig() TestConfig
GetTestConfig retrieves parameterized test configuration
type TicketDisplay ¶
type TicketDisplay struct {
models.Ticket
QueueName string
PriorityName string
StateName string
OwnerName string
CustomerName string
}
TicketDisplay represents ticket data for display purposes
type TicketListResponse ¶
type TicketListResponse struct {
Success bool `json:"success"`
Data []map[string]interface{} `json:"data"`
Pagination PaginationInfo `json:"pagination"`
Error string `json:"error,omitempty"`
}
TicketListResponse represents the response for ticket list API
type TicketTemplate ¶
type TicketTemplate struct {
ID int `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Subject string `json:"subject"`
Body string `json:"body"`
Priority string `json:"priority"`
QueueID int `json:"queue_id"`
TypeID int `json:"type_id"`
Tags []string `json:"tags"`
Placeholders []string `json:"placeholders"`
IsSystem bool `json:"is_system"`
CreatedBy int `json:"created_by"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
TicketTemplate represents a reusable ticket template
type TicketType ¶
type TicketType struct {
ID int `json:"id"`
Name string `json:"name"`
ValidID int `json:"valid_id"`
CreateBy int `json:"create_by"`
ChangeBy int `json:"change_by"`
TicketCount int `json:"ticket_count"`
}
TicketType represents a ticket type
type TranslateRequest ¶
type TranslateRequest struct {
Key string `json:"key" binding:"required"`
Language string `json:"language"`
Args []interface{} `json:"args"`
}
TranslateRequest represents a request to translate a key
type TranslateResponse ¶
type TranslateResponse struct {
Key string `json:"key"`
Translation string `json:"translation"`
Language string `json:"language"`
}
TranslateResponse represents the response for translation
type TranslationsResponse ¶
type TranslationsResponse struct {
Language string `json:"language"`
Translations map[string]interface{} `json:"translations"`
}
TranslationsResponse represents the response for translations
type UnmergeRequest ¶
type UnmergeRequest struct {
Reason string `form:"reason"`
}
UnmergeRequest represents a ticket unmerge request
type UpdateUserRequest ¶
type UpdateUserRequest struct {
Email *string `json:"email"`
FirstName *string `json:"first_name"`
LastName *string `json:"last_name"`
Password *string `json:"password"`
ValidID *int `json:"valid_id"`
}
UpdateUserRequest represents the request to update a user
type ValidationResponse ¶
type ValidationResponse struct {
Language string `json:"language"`
IsValid bool `json:"is_valid"`
IsComplete bool `json:"is_complete"`
Coverage float64 `json:"coverage"`
Errors []string `json:"errors"`
Warnings []string `json:"warnings"`
}
ValidationResponse represents translation validation response
Source Files
¶
- admin_attachment_handler.go
- admin_crud_handlers.go
- admin_customer_company.go
- admin_customer_users_handlers.go
- admin_roadmap_handler.go
- admin_roles_handler.go
- admin_service_handlers.go
- admin_sla_handlers.go
- admin_state_handlers.go
- admin_tickets_handler.go
- admin_type_handlers.go
- admin_user_password_handler.go
- admin_users_handlers.go
- admin_users_handlers_improved.go
- agent_handlers_init.go
- agent_routes.go
- agent_ticket_create_handler.go
- agent_ticket_handlers.go
- agent_ticket_new_handler.go
- article_create_handler.go
- article_delete_handler.go
- article_get_handler.go
- article_list_handler.go
- article_update_handler.go
- attachment_display_fix.go
- auth_api.go
- auth_handler.go
- auth_handlers.go
- basic_handlers.go
- canned_response_handler.go
- canned_response_handlers.go
- claude_feedback_handler.go
- customer_routes.go
- dev_handlers.go
- dynamic_integration.go
- dynamic_router.go
- exports.go
- exports_agent.go
- exports_api_v1.go
- exports_customer.go
- file_handler.go
- handler_registry.go
- helpers.go
- htmx_routes.go
- i18n_handlers.go
- internal_note_handlers.go
- ldap_handlers.go
- lookup_crud_handlers.go
- lookup_handlers.go
- preferences_handler.go
- priority_create_handler.go
- priority_delete_handler.go
- priority_get_handler.go
- priority_list_handler.go
- priority_update_handler.go
- profile_exports.go
- queue_api_handlers.go
- queue_create_handler.go
- queue_delete_handler.go
- queue_frontend_handlers.go
- queue_get_handler.go
- queue_groups_handler.go
- queue_handlers_api.go
- queue_list_handler.go
- queue_stats_handler.go
- queue_test_helpers.go
- queue_update_handler.go
- redirect_handlers.go
- register_handlers.go
- repository_instances.go
- routes_simplified.go
- routes_watcher.go
- search_handler.go
- search_handlers.go
- sla_handlers.go
- state_handlers_api.go
- state_list_handler.go
- statistics_handlers.go
- template_validation.go
- test_helpers.go
- ticket_actions_api.go
- ticket_advanced_search_handler.go
- ticket_attachment_handler.go
- ticket_create_handler.go
- ticket_create_with_attachments.go
- ticket_delete_api.go
- ticket_edit_handler.go
- ticket_events.go
- ticket_get_handler.go
- ticket_internal_note_handler.go
- ticket_list_handler.go
- ticket_merge_handler.go
- ticket_messages_handler.go
- ticket_sla_handler.go
- ticket_state_handlers.go
- ticket_state_helper.go
- ticket_state_list_handler.go
- ticket_template_handler.go
- ticket_template_handlers.go
- ticket_test_helpers.go
- ticket_update_handler.go
- time_helpers.go
- type_list_handler.go
- user_api.go
- user_create_handler.go
- user_delete_handler.go
- user_get_handler.go
- user_list_handler.go
- user_update_handler.go
- webhook_handlers.go
- websocket_chat.go
- yaml_router_loader.go