Documentation
¶
Overview ¶
Package api provides HTTP handlers for the GOTRS application.
Package api provides HTTP API handlers for GOTRS.
Package api provides HTTP handlers for the GOTRS application.
Package api provides HTTP handlers for the API.
Index ¶
- Constants
- Variables
- func AddTestAuthCookie(req *http.Request, token string)
- func BroadcastTicketUpdate(eventType string, ticketData interface{})
- func BuildDynamicFieldFilterSQL(filters []DynamicFieldFilter, startArgNum int) (string, []interface{}, error)
- func BuildRoutesManifest() ([]byte, error)
- func BulkSetScreenConfigForField(fieldID int, configs map[string]int, userID int) error
- func CheckDynamicFieldNameExists(name string, excludeID int) (bool, error)
- func CheckSignatureNameExists(name string, excludeID int) (bool, error)
- func CheckTemplateNameExists(name string, excludeID int) (bool, error)
- func CreateDynamicField(field *DynamicField, userID int) (int64, error)
- func CreateSignature(name, text, contentType, comments string, validID, userID int) (int, error)
- func CreateStandardTemplate(t *StandardTemplate, userID int) (int, error)
- func CustomerOnlyGuard(enabled bool) gin.HandlerFunc
- func DeleteDynamicField(id int) error
- func DeleteSignature(id int) error
- func DeleteStandardTemplate(id int) error
- func ExportAllSignatures() ([]byte, error)
- func ExportDynamicFieldsYAML(fieldNames []string, includeScreens bool) ([]byte, error)
- func ExportSignature(id int) ([]byte, error)
- func ExtractToken(c *gin.Context) string
- func GenerateRoutesManifest() error
- func GetArticleAttachments(articleID int) ([]map[string]interface{}, error)
- func GetAttachmentTemplateIDs(attachmentID int) ([]int, error)
- func GetAuthService() *service.AuthService
- func GetDistinctDynamicFieldValues(fieldID int, limit int) ([]string, error)
- func GetDynamicFieldsForScreenGeneric(screenKey, objectType string) ([]interface{}, error)
- func GetDynamicFieldsGroupedByObjectType() (map[string][]DynamicField, error)
- func GetDynamicHandler() *dynamic.DynamicModuleHandler
- func GetHandler(name string) (gin.HandlerFunc, bool)
- func GetLookupRepository() repository.LookupRepository
- func GetLookupService() *service.LookupService
- func GetPluginManager() *plugin.Manager
- func GetPluginMenuItems(location string) []plugin.PluginMenuItem
- func GetPriorityRepository() *repository.PriorityRepository
- func GetQueueRepository() *repository.QueueRepository
- func GetQueueTemplateIDs(queueID int) ([]int, error)
- func GetStorageService() service.StorageService
- func GetTemplateAttachments(templateID int) ([]int, error)
- func GetTemplateQueues(templateID int) ([]int, error)
- func GetTestAuthToken(t *testing.T) string
- func GetTicketAttachments(ticketID int) (map[int][]map[string]interface{}, error)
- func GetTicketRepository() repository.ITicketRepository
- func GetTicketService() *service.SimpleTicketService
- func GetTicketTemplateVariables(ticketID int) map[string]string
- func GetUserIDFromCtx(c *gin.Context, fallback int) int
- func GetUserIDFromCtxUint(c *gin.Context, fallback uint) uint
- 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 HandleAdminDynamicIndex(c *gin.Context)
- func HandleAdminDynamicModule(c *gin.Context)
- func HandleAdminDynamicModuleFor(module string) gin.HandlerFunc
- 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 HandleAdminNotificationEventEdit(c *gin.Context)
- func HandleAdminNotificationEventGet(c *gin.Context)
- func HandleAdminNotificationEventNew(c *gin.Context)
- func HandleAdminNotificationEvents(c *gin.Context)
- func HandleAdminPostmasterFilterEdit(c *gin.Context)
- func HandleAdminPostmasterFilterGet(c *gin.Context)
- func HandleAdminPostmasterFilterNew(c *gin.Context)
- func HandleAdminPostmasterFilters(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 HandleAgentChangePassword(c *gin.Context)
- func HandleAgentCreateTicket(db *sql.DB) gin.HandlerFunc
- func HandleAgentNewTicket(db *sql.DB) gin.HandlerFunc
- func HandleAgentPasswordForm(c *gin.Context)
- func HandleAgentPerformanceAPI(c *gin.Context)
- func HandleAssignQueueGroupAPI(c *gin.Context)
- func HandleAssignTicketAPI(c *gin.Context)
- func HandleCloseTicketAPI(c *gin.Context)
- func HandleCreateArticleAPI(c *gin.Context)
- func HandleCreateInternalNote(c *gin.Context)
- func HandleCreateNotificationEvent(c *gin.Context)
- func HandleCreatePostmasterFilter(c *gin.Context)
- func HandleCreatePriorityAPI(c *gin.Context)
- func HandleCreateQueueAPI(c *gin.Context)
- func HandleCreateSLAAPI(c *gin.Context)
- func HandleCreateSalutationAPI(c *gin.Context)
- func HandleCreateSignatureAPI(c *gin.Context)
- func HandleCreateSystemAddressAPI(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 HandleDebugConfigSources(c *gin.Context)
- func HandleDebugTicketNumber(c *gin.Context)
- func HandleDeleteArticleAPI(c *gin.Context)
- func HandleDeleteInternalNote(c *gin.Context)
- func HandleDeleteNotificationEvent(c *gin.Context)
- func HandleDeletePostmasterFilter(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 HandleGetAvailableLanguages(c *gin.Context)
- func HandleGetAvailableThemes(c *gin.Context)
- func HandleGetFormData(c *gin.Context)
- func HandleGetInternalNotes(c *gin.Context)
- func HandleGetLanguage(c *gin.Context)
- func HandleGetPriorities(c *gin.Context)
- func HandleGetPriorityAPI(c *gin.Context)
- func HandleGetProfile(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 HandleGetTheme(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 HandleListGroupsAPI(c *gin.Context)
- func HandleListPrioritiesAPI(c *gin.Context)
- func HandleListQueuesAPI(c *gin.Context)
- func HandleListSLAsAPI(c *gin.Context)
- func HandleListSalutationsAPI(c *gin.Context)
- func HandleListServicesAPI(c *gin.Context)
- func HandleListSignaturesAPI(c *gin.Context)
- func HandleListStatesAPI(c *gin.Context)
- func HandleListSystemAddressesAPI(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 HandleMailAccountPollStatus(c *gin.Context)
- func HandlePasswordPolicy(c *gin.Context)
- func HandlePluginCall(c *gin.Context)
- func HandlePluginDisable(c *gin.Context)
- func HandlePluginEnable(c *gin.Context)
- func HandlePluginList(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 HandleSetLanguage(c *gin.Context)
- func HandleSetPreLoginLanguage(c *gin.Context)
- func HandleSetPreLoginTheme(c *gin.Context)
- func HandleSetSessionTimeout(c *gin.Context)
- func HandleSetTheme(c *gin.Context)
- func HandleStaticFiles(c *gin.Context)
- func HandleTemplate(c *gin.Context)
- func HandleTestWebhookAPI(c *gin.Context)
- func HandleTicketHistoryFragment(c *gin.Context)
- func HandleTicketLinksFragment(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 HandleUpdateNotificationEvent(c *gin.Context)
- func HandleUpdatePostmasterFilter(c *gin.Context)
- func HandleUpdatePriorityAPI(c *gin.Context)
- func HandleUpdateProfile(c *gin.Context)
- func HandleUpdateQueueAPI(c *gin.Context)
- func HandleUpdateSLAAPI(c *gin.Context)
- func HandleUpdateSalutationAPI(c *gin.Context)
- func HandleUpdateSignatureAPI(c *gin.Context)
- func HandleUpdateSystemAddressAPI(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 ImportSignatures(data []byte, overwrite bool) (imported int, skipped int, err error)
- func ImportTemplates(data []byte, overwrite bool, userID int) (imported int, skipped int, errors []string)
- func ImprovedHandleAdminUserGet(c *gin.Context)
- func ImprovedHandleAdminUserUpdate(c *gin.Context)
- func InitializeLDAPService()
- func InitializeServices()
- func JWTAuthMiddleware() gin.HandlerFunc
- func JoinTemplateTypes(types []string) string
- 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 NewSimpleRouterWithDB(db *sql.DB) *gin.Engine
- func ParseTemplateTypes(typeStr string) []string
- func ProcessArticleDynamicFieldsFromForm(formValues map[string][]string, articleID int, screenKey string) error
- func ProcessDynamicFieldsFromForm(formValues map[string][]string, objectID int, objectType, screenKey string) error
- func RegisterAdminRoutes(group *gin.RouterGroup, routes []AdminRouteDefinition)
- func RegisterAgentHandlers()
- func RegisterAgentHandlersForRouting()
- func RegisterAgentRoutes(r *gin.RouterGroup, db *sql.DB)
- func RegisterCannedResponseHandlers(r *gin.RouterGroup)
- func RegisterCustomerRoutes(r *gin.RouterGroup, db *sql.DB)
- func RegisterDynamicFieldRoutes(router *gin.RouterGroup, adminRouter *gin.RouterGroup)
- func RegisterDynamicModuleHandlersIntoRegistry(reg *routing.HandlerRegistry)
- func RegisterHandler(name string, h gin.HandlerFunc)
- func RegisterWithRouting(registry interface{}) error
- func RenderMarkdown(content string) string
- func RootRedirectTarget() string
- func SetAttachmentTemplates(attachmentID int, templateIDs []int, userID int) error
- func SetDynamicFieldValue(value *DynamicFieldValue) error
- func SetPluginManager(mgr *plugin.Manager)
- func SetQueueTemplates(queueID int, templateIDs []int, userID int) error
- func SetScreenConfig(fieldID int, screenKey string, configValue int, userID int) error
- func SetTemplateAttachments(templateID int, attachmentIDs []int, userID int) error
- func SetTemplateQueues(templateID int, queueIDs []int, userID int) error
- func SetValkeyCache(c *cache.RedisCache)
- func SetupAPIv1Routes(r *gin.Engine, jwtManager *auth.JWTManager, ldapProvider *ldap.Provider, ...)
- func SetupBasicRoutes(r *gin.Engine)
- func SetupDynamicModules(db *sql.DB) error
- func SetupHTMXRoutes(r *gin.Engine)
- func SetupLDAPRoutes(r *gin.Engine)
- func SetupTestRouterWithRoutes(routes []AdminRouteDefinition) *gin.Engine
- func SetupTestTemplateRenderer(t *testing.T)
- func SubstituteSignatureVariables(text string, vars map[string]string) string
- func SubstituteTemplateVariables(text string, vars map[string]string) string
- func SupportsAutoConfig(fieldType string) bool
- func UpdateDynamicField(field *DynamicField, userID int) error
- func UpdateSignature(id int, name, text, contentType, comments string, validID, userID int) error
- func UpdateStandardTemplate(t *StandardTemplate, userID int) error
- func ValidFieldTypes() []string
- func ValidObjectTypes() []string
- func ValidateAllTemplates(templatesDir string) ([]string, error)
- func ValidateContractHeaders(contract *EndpointContract, headers map[string]string) []string
- func ValidateTemplatesReferencedInRoutes(routesDir, templatesDir string) ([]string, error)
- func ValidateUploadedFile(header *multipart.FileHeader) error
- type ACL
- type ACLConfigChange
- type ACLConfigMatch
- type ACLHelper
- func (h *ACLHelper) BuildACLContext(ticket *models.Ticket, userID int, action string) *models.ACLContext
- func (h *ACLHelper) FilterActions(ctx context.Context, aclCtx *models.ACLContext, actions []string) []string
- func (h *ACLHelper) FilterPriorities(ctx context.Context, aclCtx *models.ACLContext, ...) []map[string]interface{}
- func (h *ACLHelper) FilterQueues(ctx context.Context, aclCtx *models.ACLContext, ...) []map[string]interface{}
- func (h *ACLHelper) FilterSLAs(ctx context.Context, aclCtx *models.ACLContext, slas []map[string]interface{}) []map[string]interface{}
- func (h *ACLHelper) FilterServices(ctx context.Context, aclCtx *models.ACLContext, ...) []map[string]interface{}
- func (h *ACLHelper) FilterStates(ctx context.Context, aclCtx *models.ACLContext, ...) []map[string]interface{}
- func (h *ACLHelper) FilterTypes(ctx context.Context, aclCtx *models.ACLContext, types []map[string]interface{}) []map[string]interface{}
- func (h *ACLHelper) RefreshCache(ctx context.Context) error
- type AdditionalDFStorageConfig
- type AdminRouteDefinition
- type AgentHandlerRegistry
- type ArticleInsertParams
- type ArticleMimeParams
- type Attachment
- type AttachmentBasicInfo
- type AttachmentInfo
- type AttachmentWithTemplateCount
- type AuthHandler
- type BulkActionRequest
- type BulkActionResult
- type BulkAssignRequest
- type BulkLockRequest
- type BulkMergeRequest
- type BulkPriorityRequest
- type BulkQueueRequest
- type BulkStatusRequest
- type CannedResponse
- type CannedResponseDB
- type CannedResponseFilters
- 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 CannedResponseRepository
- func (r *CannedResponseRepository) CheckDuplicate(name, scope string, ownerID, teamID int) (bool, error)
- func (r *CannedResponseRepository) Create(cr *CannedResponse, userID int) (int, error)
- func (r *CannedResponseRepository) Delete(id, userID int) error
- func (r *CannedResponseRepository) GetByID(id int) (*CannedResponse, error)
- func (r *CannedResponseRepository) IncrementUsage(id int) error
- func (r *CannedResponseRepository) ListAccessible(userID, teamID int, filters CannedResponseFilters) ([]*CannedResponse, error)
- func (r *CannedResponseRepository) ListCategories() ([]string, error)
- func (r *CannedResponseRepository) Update(id int, cr *CannedResponse, userID int) error
- type CoverageResponse
- type CreateUserRequest
- type CustomerCompanyInfo
- type CustomerGroupAssignment
- type CustomerGroupPermission
- type CustomerUserInfo
- type CustomerUserWithPermissions
- type CustomerWithPermissions
- type DynamicField
- type DynamicFieldConfig
- type DynamicFieldDisplay
- type DynamicFieldExport
- type DynamicFieldExportItem
- type DynamicFieldFilter
- type DynamicFieldScreenConfig
- type DynamicFieldValue
- type EndpointContract
- type EscalationResult
- type FieldWithScreenConfig
- type GenericAgentJob
- type GroupCustomerAssignment
- type GroupInfo
- type GroupWithCustomerUserPermissions
- type GroupWithPermissions
- 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 ImportPreviewItem
- type ImportResult
- 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 LookupItem
- type MergeHistory
- type MergeRequest
- type MissingKey
- type MissingKeysResponse
- type NoteHistory
- type NotificationEvent
- type NotificationEventFull
- type NotificationEventInput
- type NotificationEventItem
- type NotificationEventMessage
- type PaginationInfo
- type PluginWidgetData
- type PostmasterFilterInput
- type QueueBasic
- type QueueInfo
- type QueueWithTemplateCount
- type RegEx
- type Role
- type RoleGroupPermission
- type RoleUser
- type SLA
- type SLADefinition
- type SLAWithStats
- type SavedSearch
- type ScreenConfigMatrix
- type ScreenDefinition
- 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 SearchableDynamicField
- type Service
- type ServiceWithStats
- type SetLanguageRequest
- type Signature
- type SignatureExportData
- type SignatureForAgent
- type SignatureWithStats
- type StandardAttachment
- type StandardTemplate
- type StandardTemplateWithStats
- type State
- type StateType
- type StateWithType
- type TemplateExport
- type TemplateExportFile
- type TemplateForAgent
- type TemplateOption
- type TemplateTypeOption
- type TemplateWithAttachmentCount
- type TemplateWithQueueCount
- type TestAuthConfig
- type TestConfig
- type TicketDisplay
- type TicketListResponse
- type TicketTemplate
- type TicketType
- type TranslateRequest
- type TranslateResponse
- type TranslationsResponse
- type UnmergeRequest
- type UpdateUserRequest
- type ValidationResponse
Constants ¶
const ( DFTypeText = "Text" DFTypeTextArea = "TextArea" DFTypeCheckbox = "Checkbox" DFTypeDropdown = "Dropdown" DFTypeMultiselect = "Multiselect" DFTypeDate = "Date" DFTypeDateTime = "DateTime" DFTypeWebserviceDropdown = "WebserviceDropdown" DFTypeWebserviceMultiselect = "WebserviceMultiselect" )
Field type constants matching OTRS.
const ( DFObjectTicket = "Ticket" DFObjectArticle = "Article" DFObjectCustomerUser = "CustomerUser" DFObjectCustomerCompany = "CustomerCompany" )
Object type constants matching OTRS.
const ( DFScreenDisabled = 0 DFScreenEnabled = 1 DFScreenRequired = 2 )
Screen config value 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 HandleCustomerLoginPage = handleCustomerLoginPage 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 HandleGroupPermissions = handleGroupPermissions HandleSaveGroupPermissions = handleSaveGroupPermissions HandleAdminQueues = handleAdminQueues HandleAdminEmailIdentities = handleAdminEmailIdentities HandleAdminPriorities = handleAdminPriorities HandleAdminPermissions = handleAdminPermissions // Renamed from roles HandleGetUserPermissionMatrix = handleGetUserPermissionMatrix HandleUpdateUserPermissions = handleUpdateUserPermissions HandleAdminEmailQueue = handleAdminEmailQueue HandleAdminEmailQueueRetry = handleAdminEmailQueueRetry HandleAdminEmailQueueDelete = handleAdminEmailQueueDelete HandleAdminEmailQueueRetryAll = handleAdminEmailQueueRetryAll HandleAdminStates = handleAdminStates HandleAdminTypes = handleAdminTypes HandleAdminServices = handleAdminServices HandleAdminServiceCreate = handleAdminServiceCreate HandleAdminServiceUpdate = handleAdminServiceUpdate HandleAdminServiceDelete = handleAdminServiceDelete HandleAdminSLA = handleAdminSLA HandleAdminSLACreate = handleAdminSLACreate HandleAdminSLAUpdate = handleAdminSLAUpdate HandleAdminSLADelete = handleAdminSLADelete HandleAdminLookups = handleAdminLookups // Roles management. HandleAdminRoles = handleAdminRoles HandleAdminRoleCreate = handleAdminRoleCreate HandleAdminRoleGet = handleAdminRoleGet HandleAdminRoleUpdate = handleAdminRoleUpdate HandleAdminRoleDelete = handleAdminRoleDelete HandleAdminRoleUsers = handleAdminRoleUsers HandleAdminRoleUsersSearch = handleAdminRoleUsersSearch HandleAdminRoleUserAdd = handleAdminRoleUserAdd HandleAdminRoleUserRemove = handleAdminRoleUserRemove HandleAdminRolePermissions = handleAdminRolePermissions HandleAdminRolePermissionsUpdate = handleAdminRolePermissionsUpdate // Customer company handlers - wrapped to get database from adapter. HandleAdminCustomerCompanies = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { handleAdminCustomerCompanies(nil)(c) 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) } HandleAdminNewCustomerCompany = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { handleAdminNewCustomerCompany(nil)(c) return } handleAdminNewCustomerCompany(dbService.GetDB())(c) } HandleAdminCreateCustomerCompany = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminCreateCustomerCompany(dbService.GetDB())(c) } HandleAdminEditCustomerCompany = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminEditCustomerCompany(dbService.GetDB())(c) } HandleAdminUpdateCustomerCompany = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminUpdateCustomerCompany(dbService.GetDB())(c) } HandleAdminDeleteCustomerCompany = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminDeleteCustomerCompany(dbService.GetDB())(c) } HandleAdminUpdateCustomerCompanyServices = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminUpdateCustomerCompanyServices(dbService.GetDB())(c) } HandleAdminUpdateCustomerPortalSettings = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminUpdateCustomerPortalSettings(dbService.GetDB())(c) } HandleAdminActivateCustomerCompany = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminActivateCustomerCompany(dbService.GetDB())(c) } HandleAdminUploadCustomerPortalLogo = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminUploadCustomerPortalLogo(dbService.GetDB())(c) } // Customer user ↔ services management. HandleAdminCustomerUserServices = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminCustomerUserServices(dbService.GetDB())(c) } HandleAdminCustomerUserServicesAllocate = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminCustomerUserServicesAllocate(dbService.GetDB())(c) } HandleAdminCustomerUserServicesUpdate = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminCustomerUserServicesUpdate(dbService.GetDB())(c) } HandleAdminServiceCustomerUsersAllocate = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminServiceCustomerUsersAllocate(dbService.GetDB())(c) } HandleAdminServiceCustomerUsersUpdate = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminServiceCustomerUsersUpdate(dbService.GetDB())(c) } HandleAdminDefaultServices = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminDefaultServices(dbService.GetDB())(c) } HandleAdminDefaultServicesUpdate = func(c *gin.Context) { dbService, err := adapter.GetDatabase() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } handleAdminDefaultServicesUpdate(dbService.GetDB())(c) } // Dynamic Fields management. HandleAdminDynamicFields = handleAdminDynamicFields HandleAdminDynamicFieldNew = handleAdminDynamicFieldNew HandleAdminDynamicFieldEdit = handleAdminDynamicFieldEdit HandleAdminDynamicFieldScreenConfig = handleAdminDynamicFieldScreenConfig HandleCreateDynamicField = handleCreateDynamicField HandleUpdateDynamicField = handleUpdateDynamicField HandleDeleteDynamicField = handleDeleteDynamicField HandleAdminDynamicFieldScreenConfigSave = handleAdminDynamicFieldScreenConfigSave HandleAdminDynamicFieldScreenConfigSingle = handleAdminDynamicFieldScreenConfigSingle )
Admin handlers.
var ( HandleTicketDetail = handleTicketDetail HandleQueueDetail = handleQueueDetail HandleNewTicket = handleNewTicket HandleNewEmailTicket = handleNewEmailTicket HandleNewPhoneTicket = handleNewPhoneTicket )
Ticket handlers.
var ( HandleGetAttachments = handleGetAttachments HandleUploadAttachment = handleUploadAttachment HandleDownloadAttachment = handleDownloadAttachment HandleDeleteAttachment = handleDeleteAttachment HandleGetThumbnail = handleGetThumbnail HandleViewAttachment = handleViewAttachment )
Attachment handlers (exported for routing).
var ( HandleAdminSettings gin.HandlerFunc = handleAdminSettings HandleAdminTemplates gin.HandlerFunc = handleAdminTemplates HandleAdminReports gin.HandlerFunc = handleAdminReports HandleAdminLogs gin.HandlerFunc = handleAdminLogs HandleAdminBackup gin.HandlerFunc = handleAdminBackup )
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 = wrapAdapterDBHandler(handleCustomerDashboard) HandleCustomerTickets = wrapAdapterDBHandler(handleCustomerTickets) HandleCustomerNewTicket = wrapAdapterDBHandler(handleCustomerNewTicket) HandleCustomerCreateTicket = wrapAdapterDBHandler(handleCustomerCreateTicket) HandleCustomerTicketView = wrapAdapterDBHandler(handleCustomerTicketView) HandleCustomerTicketReply = wrapAdapterDBHandler(handleCustomerTicketReply) HandleCustomerCloseTicket = wrapAdapterDBHandler(handleCustomerCloseTicket) HandleCustomerProfile = wrapAdapterDBHandler(handleCustomerProfile) HandleCustomerUpdateProfile = wrapAdapterDBHandler(handleCustomerUpdateProfile) HandleCustomerPasswordForm = wrapAdapterDBHandler(handleCustomerPasswordForm) HandleCustomerChangePassword = wrapAdapterDBHandler(handleCustomerChangePassword) HandleCustomerKnowledgeBase = wrapAdapterDBHandler(handleCustomerKnowledgeBase) HandleCustomerKBSearch = wrapAdapterDBHandler(handleCustomerKBSearch) HandleCustomerKBArticle = wrapAdapterDBHandler(handleCustomerKBArticle) HandleCustomerCompanyInfo = wrapAdapterDBHandler(handleCustomerCompanyInfo) HandleCustomerCompanyUsers = wrapAdapterDBHandler(handleCustomerCompanyUsers) HandleCustomerGetLanguage = wrapAdapterDBHandler(handleCustomerGetLanguage) HandleCustomerSetLanguage = wrapAdapterDBHandler(handleCustomerSetLanguage) HandleCustomerGetSessionTimeout = wrapAdapterDBHandler(handleCustomerGetSessionTimeout) HandleCustomerSetSessionTimeout = wrapAdapterDBHandler(handleCustomerSetSessionTimeout) // Customer attachment handlers HandleCustomerGetAttachments = wrapAdapterDBHandler(handleCustomerGetAttachments) HandleCustomerUploadAttachment = wrapAdapterDBHandler(handleCustomerUploadAttachment) HandleCustomerDownloadAttachment = wrapAdapterDBHandler(handleCustomerDownloadAttachment) HandleCustomerGetThumbnail = wrapAdapterDBHandler(handleCustomerGetThumbnail) HandleCustomerViewAttachment = wrapAdapterDBHandler(handleCustomerViewAttachment) )
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 // Bulk ticket actions HandleBulkTicketStatus gin.HandlerFunc HandleBulkTicketPriority gin.HandlerFunc HandleBulkTicketQueue gin.HandlerFunc HandleBulkTicketAssign gin.HandlerFunc HandleBulkTicketLock gin.HandlerFunc HandleBulkTicketMerge gin.HandlerFunc HandleGetBulkActionOptions gin.HandlerFunc HandleGetFilteredTicketIds gin.HandlerFunc }{ HandleAgentTickets: wrapDBHandler(handleAgentTickets), HandleAgentTicketReply: wrapDBHandler(handleAgentTicketReply), HandleAgentTicketNote: wrapDBHandler(handleAgentTicketNote), HandleAgentTicketPhone: wrapDBHandler(handleAgentTicketPhone), HandleAgentTicketStatus: wrapDBHandler(handleAgentTicketStatus), HandleAgentTicketAssign: wrapDBHandler(handleAgentTicketAssign), HandleAgentTicketPriority: wrapDBHandler(handleAgentTicketPriority), HandleAgentTicketQueue: wrapDBHandler(handleAgentTicketQueue), HandleAgentTicketMerge: wrapDBHandler(handleAgentTicketMerge), HandleAgentTicketDraft: wrapDBHandler(handleAgentTicketDraft), HandleAgentCustomerTickets: wrapDBHandler(handleAgentCustomerTickets), HandleAgentCustomerView: wrapDBHandler(handleAgentCustomerView), HandleAgentSearch: wrapDBHandler(handleAgentSearch), HandleAgentSearchResults: wrapDBHandler(handleAgentSearchResults), HandleAgentNewTicket: wrapDBHandler(HandleAgentNewTicket), HandleAgentCreateTicket: wrapDBHandler(HandleAgentCreateTicket), HandleAgentQueues: wrapDBHandler(handleAgentQueues), HandleAgentQueueView: wrapDBHandler(handleAgentQueueView), HandleAgentQueueLock: wrapDBHandler(handleAgentQueueLock), HandleAgentCustomers: wrapDBHandler(handleAgentCustomers), HandleBulkTicketStatus: wrapDBHandler(handleBulkTicketStatus), HandleBulkTicketPriority: wrapDBHandler(handleBulkTicketPriority), HandleBulkTicketQueue: wrapDBHandler(handleBulkTicketQueue), HandleBulkTicketAssign: wrapDBHandler(handleBulkTicketAssign), HandleBulkTicketLock: wrapDBHandler(handleBulkTicketLock), HandleBulkTicketMerge: wrapDBHandler(handleBulkTicketMerge), HandleGetBulkActionOptions: wrapDBHandler(handleGetBulkActionOptions), HandleGetFilteredTicketIds: wrapDBHandler(handleGetFilteredTicketIds), }
AgentHandlerExports provides exported handler functions for agent routes.
var ArticleEvents = []string{
"ArticleCreate",
"ArticleSend",
"ArticleBounce",
"ArticleAgentNotification",
"ArticleCustomerNotification",
}
Article events that can trigger notifications.
var CannedResponseHandlerExports = NewCannedResponseHandlers()
CannedResponseHandlerExports provides singleton access for YAML route registration.
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 { getPongo2Renderer().HTML(c, http.StatusBadRequest, "components/error.pongo2", pongo2.Context{"error": "Username and password are required"}) } return } authService := GetAuthService() if authService == nil { if strings.Contains(contentType, "application/json") { c.JSON(http.StatusUnauthorized, gin.H{"success": false, "error": "authentication unavailable"}) return } if c.GetHeader("HX-Request") == "true" { html := `<div class="rounded-md bg-yellow-50 dark:bg-yellow-900/20 p-4 mt-4">` + `<div class="text-sm text-yellow-800 dark:text-yellow-100">` + `Authentication temporarily unavailable</div></div>` c.Data(http.StatusUnauthorized, "text/html; charset=utf-8", []byte(html)) return } c.Redirect(http.StatusSeeOther, "/login?error=Authentication+temporarily+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") { c.JSON(http.StatusUnauthorized, gin.H{"success": false, "error": "invalid credentials"}) return } if c.GetHeader("HX-Request") == "true" { html := `<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>` c.Data(http.StatusUnauthorized, "text/html; charset=utf-8", []byte(html)) } else { c.Redirect(http.StatusSeeOther, "/login?error=Invalid+username+or+password") } return } sessionTimeout := shared.GetSystemSessionMaxTime() if db, err := database.GetDB(); err == nil && db != nil { prefService := service.NewUserPreferencesService(db) if userTimeout := prefService.GetSessionTimeout(int(user.ID)); userTimeout > 0 { sessionTimeout = shared.ResolveSessionTimeout(userTimeout) } if preLoginLang, err := c.Cookie("gotrs_lang"); err == nil && preLoginLang != "" { if setErr := prefService.SetLanguage(int(user.ID), preLoginLang); setErr != nil { log.Printf("Failed to save language preference: %v", setErr) } } } if sessionTimeout <= 0 { sessionTimeout = constants.DefaultSessionTimeout } 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 sessionSvc := shared.GetSessionService(); sessionSvc != nil { sessionID, err := sessionSvc.CreateSession( int(user.ID), username, user.Role, c.ClientIP(), c.Request.UserAgent(), ) if err != nil { log.Printf("Failed to create session record: %v", err) } else { c.SetCookie("session_id", sessionID, sessionTimeout, "/", "", false, true) } } c.SetCookie("gotrs_logged_in", "1", sessionTimeout, "/", "", false, false) redirectTarget := "/dashboard" if strings.EqualFold(user.Role, "customer") { redirectTarget = "/customer" } if strings.Contains(contentType, "application/json") { c.JSON(http.StatusOK, gin.H{ "success": true, "access_token": accessToken, "refresh_token": refreshToken, "token_type": "Bearer", "redirect": redirectTarget, }) return } if c.GetHeader("HX-Request") == "true" { c.Header("HX-Redirect", redirectTarget) c.String(http.StatusOK, "Login successful, redirecting...") return } c.Redirect(http.StatusSeeOther, redirectTarget) }
HandleAuthLogin handles the login form submission.
var HandleAuthLogout = func(c *gin.Context) { if sessionID, err := c.Cookie("session_id"); err == nil && sessionID != "" { if sessionSvc := shared.GetSessionService(); sessionSvc != nil { if err := sessionSvc.KillSession(sessionID); err != nil { log.Printf("Failed to delete session record: %v", err) } } } c.SetCookie("auth_token", "", -1, "/", "", false, true) c.SetCookie("access_token", "", -1, "/", "", false, true) c.SetCookie("refresh_token", "", -1, "/", "", false, true) c.SetCookie("session_id", "", -1, "/", "", false, true) c.SetCookie("gotrs_logged_in", "", -1, "/", "", false, false) c.Redirect(http.StatusSeeOther, "/login") }
HandleAuthLogout handles user logout.
var HandleCustomerLogin = func(c *gin.Context) { handleCustomerLogin(shared.GetJWTManager())(c) }
HandleCustomerLogin is the exported handler for customer login POST requests.
var HandleTicketCustomerUsersWrapper gin.HandlerFunc = func(c *gin.Context) { db, err := database.GetDB() if err != nil { c.JSON(500, gin.H{"error": "Database unavailable"}) return } handleTicketCustomerUsers(db)(c) }
HandleTicketCustomerUsersWrapper wraps handleTicketCustomerUsers with DB lookup.
var TicketEvents = []string{
"TicketCreate",
"TicketDelete",
"TicketTitleUpdate",
"TicketQueueUpdate",
"TicketTypeUpdate",
"TicketServiceUpdate",
"TicketSLAUpdate",
"TicketCustomerUpdate",
"TicketPendingTimeUpdate",
"TicketLockUpdate",
"TicketStateUpdate",
"TicketOwnerUpdate",
"TicketResponsibleUpdate",
"TicketPriorityUpdate",
"TicketSubscribe",
"TicketUnsubscribe",
"TicketFlagSet",
"TicketFlagDelete",
"TicketMerge",
"EscalationResponseTimeNotifyBefore",
"EscalationResponseTimeStart",
"EscalationResponseTimeStop",
"EscalationUpdateTimeNotifyBefore",
"EscalationUpdateTimeStart",
"EscalationUpdateTimeStop",
"EscalationSolutionTimeNotifyBefore",
"EscalationSolutionTimeStart",
"EscalationSolutionTimeStop",
}
Available ticket events that can trigger notifications.
Functions ¶
func AddTestAuthCookie ¶ added in v0.6.3
AddTestAuthCookie adds the authentication cookie to a request. This is the standard way to add auth to test requests.
func BroadcastTicketUpdate ¶
func BroadcastTicketUpdate(eventType string, ticketData interface{})
BroadcastTicketUpdate sends an update to all connected clients.
func BuildDynamicFieldFilterSQL ¶ added in v0.5.0
func BuildDynamicFieldFilterSQL(filters []DynamicFieldFilter, startArgNum int) (string, []interface{}, error)
Returns the WHERE clause fragment and arguments to append.
func BuildRoutesManifest ¶
BuildRoutesManifest constructs the manifest JSON without registering routes (for tooling).
func BulkSetScreenConfigForField ¶ added in v0.5.0
BulkSetScreenConfigForField replaces all screen configs for a field.
func CheckDynamicFieldNameExists ¶ added in v0.5.0
CheckDynamicFieldNameExists checks if a field name already exists.
func CheckSignatureNameExists ¶ added in v0.5.0
CheckSignatureNameExists checks if a signature name already exists.
func CheckTemplateNameExists ¶ added in v0.5.0
CheckTemplateNameExists checks if a template name already exists (excluding a specific ID).
func CreateDynamicField ¶ added in v0.5.0
func CreateDynamicField(field *DynamicField, userID int) (int64, error)
CreateDynamicField creates a new dynamic field.
func CreateSignature ¶ added in v0.5.0
CreateSignature creates a new signature.
func CreateStandardTemplate ¶ added in v0.5.0
func CreateStandardTemplate(t *StandardTemplate, userID int) (int, error)
CreateStandardTemplate creates a new template.
func CustomerOnlyGuard ¶ added in v0.5.0
func CustomerOnlyGuard(enabled bool) gin.HandlerFunc
CustomerOnlyGuard blocks non-customer paths when enabled, to keep admin/auth UIs off the customer FE.
func DeleteDynamicField ¶ added in v0.5.0
DeleteDynamicField deletes a dynamic field and its values.
func DeleteSignature ¶ added in v0.5.0
DeleteSignature deletes a signature by ID.
func DeleteStandardTemplate ¶ added in v0.5.0
DeleteStandardTemplate deletes a template and its relationships.
func ExportAllSignatures ¶ added in v0.5.0
ExportAllSignatures exports all signatures to YAML.
func ExportDynamicFieldsYAML ¶ added in v0.6.0
ExportDynamicFieldsYAML exports dynamic fields to YAML format.
func ExportSignature ¶ added in v0.5.0
ExportSignature exports a single signature to YAML.
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 GetAttachmentTemplateIDs ¶ added in v0.6.0
GetAttachmentTemplateIDs returns template IDs assigned to an attachment.
func GetAuthService ¶
func GetAuthService() *service.AuthService
GetAuthService returns the singleton auth service instance.
func GetDistinctDynamicFieldValues ¶ added in v0.5.0
Useful for populating filter dropdown options.
func GetDynamicFieldsForScreenGeneric ¶ added in v0.5.0
Returns []interface{} to avoid import cycles.
func GetDynamicFieldsGroupedByObjectType ¶ added in v0.5.0
func GetDynamicFieldsGroupedByObjectType() (map[string][]DynamicField, error)
GetDynamicFieldsGroupedByObjectType returns fields grouped by object type for admin display.
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 GetPluginManager ¶ added in v0.6.4
GetPluginManager returns the global plugin manager.
func GetPluginMenuItems ¶ added in v0.6.4
func GetPluginMenuItems(location string) []plugin.PluginMenuItem
GetPluginMenuItems returns menu items for a location.
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 GetQueueTemplateIDs ¶ added in v0.6.0
GetQueueTemplateIDs returns template IDs assigned to a queue.
func GetStorageService ¶
func GetStorageService() service.StorageService
GetStorageService returns the singleton storage service instance.
func GetTemplateAttachments ¶ added in v0.5.0
GetTemplateAttachments returns all attachment IDs assigned to a template.
func GetTemplateQueues ¶ added in v0.5.0
GetTemplateQueues returns all queues assigned to a template.
func GetTestAuthToken ¶ added in v0.6.3
GetTestAuthToken generates a valid JWT token for testing authenticated routes. Uses environment variables for configuration (see GetTestAuthConfig). This is the single source of truth for test authentication - all tests should use this.
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 GetTicketTemplateVariables ¶ added in v0.5.0
GetTicketTemplateVariables returns template variables for a ticket.
func GetUserIDFromCtx ¶ added in v0.6.2
GetUserIDFromCtx extracts the authenticated user's ID from gin context. Handles multiple types since different auth middleware may set different types. Returns the fallback value if user_id is not found or cannot be converted.
func GetUserIDFromCtxUint ¶ added in v0.6.2
GetUserIDFromCtxUint is like GetUserIDFromCtx but returns uint.
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 HandleAdminDynamicIndex ¶ added in v0.5.0
func HandleAdminDynamicModule ¶ added in v0.5.0
func HandleAdminDynamicModuleFor ¶ added in v0.5.0
func HandleAdminDynamicModuleFor(module string) gin.HandlerFunc
HandleAdminDynamicModuleFor returns a handler that forces the module param to a static value.
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 HandleAdminNotificationEventEdit ¶ added in v0.6.0
HandleAdminNotificationEventEdit renders the notification event edit form.
func HandleAdminNotificationEventGet ¶ added in v0.6.0
HandleAdminNotificationEventGet returns a notification event's details as JSON.
func HandleAdminNotificationEventNew ¶ added in v0.6.0
HandleAdminNotificationEventNew renders the new notification event form.
func HandleAdminNotificationEvents ¶ added in v0.6.0
HandleAdminNotificationEvents renders the notification events management page.
func HandleAdminPostmasterFilterEdit ¶ added in v0.6.0
handleAdminPostmasterFilterEdit renders the filter edit form.
func HandleAdminPostmasterFilterGet ¶ added in v0.6.0
handleAdminPostmasterFilterGet returns a filter's details as JSON.
func HandleAdminPostmasterFilterNew ¶ added in v0.6.0
handleAdminPostmasterFilterNew renders the new filter creation form.
func HandleAdminPostmasterFilters ¶ added in v0.6.0
handleAdminPostmasterFilters renders the postmaster filters management page.
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 HandleAgentChangePassword ¶ added in v0.6.2
HandleAgentChangePassword processes the agent password change request.
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 HandleAgentPasswordForm ¶ added in v0.6.2
HandleAgentPasswordForm renders the agent password change form.
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 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 HandleCreateNotificationEvent ¶ added in v0.6.0
HandleCreateNotificationEvent creates a new notification event.
func HandleCreatePostmasterFilter ¶ added in v0.6.0
handleCreatePostmasterFilter creates a new postmaster filter.
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 HandleCreateSalutationAPI ¶ added in v0.5.0
func HandleCreateSignatureAPI ¶ added in v0.5.0
func HandleCreateSystemAddressAPI ¶ added in v0.5.0
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 HandleDebugConfigSources ¶ added in v0.5.0
HandleDebugConfigSources lists configuration settings with their source.
func HandleDebugTicketNumber ¶ added in v0.5.0
HandleDebugTicketNumber returns current ticket number generator info.
func HandleDeleteArticleAPI ¶
HandleDeleteArticleAPI handles DELETE /api/v1/tickets/:ticket_id/articles/:id.
func HandleDeleteInternalNote ¶
HandleDeleteInternalNote deletes an internal note.
func HandleDeleteNotificationEvent ¶ added in v0.6.0
HandleDeleteNotificationEvent deletes a notification event.
func HandleDeletePostmasterFilter ¶ added in v0.6.0
handleDeletePostmasterFilter deletes a postmaster filter.
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 ¶
In OTRS, tickets are never hard deleted, only archived.
func HandleDeleteTicketStateAPI ¶
HandleDeleteTicketStateAPI handles DELETE /api/v1/ticket-states/:id.
func HandleDeleteUserAPI ¶
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 HandleGetAvailableLanguages ¶ added in v0.6.2
HandleGetAvailableLanguages returns the list of supported languages (public, no auth required). Used on login pages to allow language selection before authentication.
func HandleGetAvailableThemes ¶ added in v0.6.2
HandleGetAvailableThemes returns the list of available themes (public, no auth required). Used on login pages to allow theme selection before authentication.
func HandleGetFormData ¶
HandleGetFormData returns form data for ticket creation as JSON.
func HandleGetInternalNotes ¶
HandleGetInternalNotes returns internal notes for a ticket.
func HandleGetLanguage ¶ added in v0.6.0
HandleGetLanguage retrieves the user's language preference.
func HandleGetPriorities ¶
HandleGetPriorities returns list of priorities as JSON or HTML options for HTMX.
func HandleGetPriorityAPI ¶
HandleGetPriorityAPI handles GET /api/v1/priorities/:id.
func HandleGetProfile ¶ added in v0.6.0
HandleGetProfile retrieves the current user's profile information.
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 HandleGetTheme ¶ added in v0.6.2
HandleGetTheme retrieves the user's theme preferences. Uses UserPreferencesService for agents/admins, CustomerPreferencesService for customers.
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 and the query succeeds, return the SQL-backed shape: [{id, name, comments, valid_id}].
- Otherwise fall back to the lookup service shape (value/label/order/active).
- For HTMX requests, return 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 exported for YAML routing.
func HandleLegacyTicketsViewRedirect ¶
HandleLegacyTicketsViewRedirect exported for YAML routing.
func HandleListArticlesAPI ¶
HandleListArticlesAPI handles GET /api/v1/tickets/:ticket_id/articles.
func HandleListGroupsAPI ¶ added in v0.5.0
HandleListGroupsAPI handles GET /api/v1/groups.
func HandleListPrioritiesAPI ¶
HandleListPrioritiesAPI handles GET /api/v1/priorities. Supports optional filtering via ticket attribute relations:
- filter_attribute: The attribute to filter by (e.g., "Queue", "State")
- filter_value: The value of that attribute (e.g., "Sales", "new")
func HandleListQueuesAPI ¶
HandleListQueuesAPI handles GET /api/v1/queues.
func HandleListSLAsAPI ¶
HandleListSLAsAPI handles GET /api/v1/slas. Supports optional filtering via ticket attribute relations:
- filter_attribute: The attribute to filter by (e.g., "Queue", "Service")
- filter_value: The value of that attribute (e.g., "Sales", "Gold Support")
func HandleListSalutationsAPI ¶ added in v0.5.0
func HandleListServicesAPI ¶ added in v0.6.2
HandleListServicesAPI handles GET /api/v1/services. Supports optional filtering via ticket attribute relations:
- filter_attribute: The attribute to filter by (e.g., "Queue", "Type")
- filter_value: The value of that attribute (e.g., "Sales", "incident")
- valid: Filter by valid_id (1 = valid, 2 = invalid, "all" = no filter)
func HandleListSignaturesAPI ¶ added in v0.5.0
func HandleListStatesAPI ¶
HandleListStatesAPI handles GET /api/v1/states. Supports optional filtering via ticket attribute relations:
- filter_attribute: The attribute to filter by (e.g., "Queue", "Priority")
- filter_value: The value of that attribute (e.g., "Sales", "new")
func HandleListSystemAddressesAPI ¶ added in v0.5.0
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. Supports optional filtering via ticket attribute relations:
- filter_attribute: The attribute to filter by (e.g., "Queue", "Service")
- filter_value: The value of that attribute (e.g., "Sales", "Gold Support")
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 HandleMailAccountPollStatus ¶ added in v0.5.0
HandleMailAccountPollStatus returns the last poll status for a mail account from Valkey.
func HandlePasswordPolicy ¶
HandlePasswordPolicy returns the current password policy settings.
func HandlePluginCall ¶ added in v0.6.4
HandlePluginCall invokes a plugin function. POST /api/v1/plugins/:name/call/:fn
func HandlePluginDisable ¶ added in v0.6.4
HandlePluginDisable disables a plugin. POST /api/v1/plugins/:name/disable
func HandlePluginEnable ¶ added in v0.6.4
HandlePluginEnable enables a plugin. POST /api/v1/plugins/:name/enable
func HandlePluginList ¶ added in v0.6.4
HandlePluginList returns all registered plugins. GET /api/v1/plugins
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 HandleSetLanguage ¶ added in v0.6.0
HandleSetLanguage sets the user's language preference.
func HandleSetPreLoginLanguage ¶ added in v0.6.2
HandleSetPreLoginLanguage sets the language preference cookie (public, no auth required). This is used on login pages before the user authenticates.
func HandleSetPreLoginTheme ¶ added in v0.6.2
HandleSetPreLoginTheme sets the theme and mode preference cookies (public, no auth required). This is used on login pages before the user authenticates.
func HandleSetSessionTimeout ¶
HandleSetSessionTimeout sets the user's session timeout preference.
func HandleSetTheme ¶ added in v0.6.2
HandleSetTheme sets the user's theme preferences and persists to database. Uses UserPreferencesService for agents/admins, CustomerPreferencesService for customers.
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 HandleTicketHistoryFragment ¶ added in v0.5.0
HandleTicketHistoryFragment is an HTMX handler for ticket history fragment in tab panel.
func HandleTicketLinksFragment ¶ added in v0.5.0
HandleTicketLinksFragment is an HTMX handler for ticket links fragment in tab panel.
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 HandleUpdateNotificationEvent ¶ added in v0.6.0
HandleUpdateNotificationEvent updates an existing notification event.
func HandleUpdatePostmasterFilter ¶ added in v0.6.0
handleUpdatePostmasterFilter updates an existing postmaster filter.
func HandleUpdatePriorityAPI ¶
HandleUpdatePriorityAPI handles PUT /api/v1/priorities/:id.
func HandleUpdateProfile ¶ added in v0.6.0
HandleUpdateProfile updates the current user's profile information.
func HandleUpdateQueueAPI ¶
HandleUpdateQueueAPI handles PUT /api/v1/queues/:id.
func HandleUpdateSLAAPI ¶
HandleUpdateSLAAPI handles PUT /api/v1/slas/:id.
func HandleUpdateSalutationAPI ¶ added in v0.5.0
func HandleUpdateSignatureAPI ¶ added in v0.5.0
func HandleUpdateSystemAddressAPI ¶ added in v0.5.0
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 ImportSignatures ¶ added in v0.5.0
ImportSignatures imports signatures from YAML data.
func ImportTemplates ¶ added in v0.5.0
func ImportTemplates(data []byte, overwrite bool, userID int) (imported int, skipped int, errors []string)
ImportTemplates imports templates from YAML data.
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 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 JoinTemplateTypes ¶ added in v0.5.0
JoinTemplateTypes joins template types into a sorted comma-separated string.
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 NewSimpleRouterWithDB ¶ added in v0.5.0
NewSimpleRouterWithDB creates a router with basic routes and a specific database connection.
func ParseTemplateTypes ¶ added in v0.5.0
ParseTemplateTypes splits a comma-separated type string into a slice.
func ProcessArticleDynamicFieldsFromForm ¶ added in v0.5.0
func ProcessArticleDynamicFieldsFromForm(formValues map[string][]string, articleID int, screenKey string) error
ProcessArticleDynamicFieldsFromForm processes dynamic fields with "ArticleDynamicField_" prefix.
func ProcessDynamicFieldsFromForm ¶ added in v0.5.0
func ProcessDynamicFieldsFromForm(formValues map[string][]string, objectID int, objectType, screenKey string) error
ProcessDynamicFieldsFromForm processes dynamic fields with "DynamicField_" prefix. screenKey is the screen being used (e.g., "AgentTicketPhone").
func RegisterAdminRoutes ¶ added in v0.5.0
func RegisterAdminRoutes(group *gin.RouterGroup, routes []AdminRouteDefinition)
RegisterAdminRoutes registers routes from definitions onto a router group.
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 RegisterCannedResponseHandlers ¶ added in v0.5.0
func RegisterCannedResponseHandlers(r *gin.RouterGroup)
RegisterCannedResponseHandlers registers all canned response API routes.
func RegisterCustomerRoutes ¶
func RegisterCustomerRoutes(r *gin.RouterGroup, db *sql.DB)
RegisterCustomerRoutes registers all customer portal routes.
func RegisterDynamicFieldRoutes ¶ added in v0.5.0
func RegisterDynamicFieldRoutes(router *gin.RouterGroup, adminRouter *gin.RouterGroup)
RegisterDynamicFieldRoutes registers all dynamic field admin routes.
func RegisterDynamicModuleHandlersIntoRegistry ¶ added in v0.5.0
func RegisterDynamicModuleHandlersIntoRegistry(reg *routing.HandlerRegistry)
RegisterDynamicModuleHandlersIntoRegistry exposes the dynamic module handlers to the routing registry used by the main server.
func RegisterHandler ¶
func RegisterHandler(name string, h gin.HandlerFunc)
RegisterHandler adds/overwrites a handler under a given name. Registers to both the local handlerRegistry AND routing.GlobalHandlerMap so that YAML route loader can find all handlers regardless of where they're registered.
func RegisterWithRouting ¶
func RegisterWithRouting(registry interface{}) error
The routing registration should be handled at the application level.
func RenderMarkdown ¶
RenderMarkdown converts markdown content to HTML with Tailwind styling.
func RootRedirectTarget ¶ added in v0.5.0
func RootRedirectTarget() string
func SetAttachmentTemplates ¶ added in v0.6.0
SetAttachmentTemplates replaces all template assignments for an attachment.
func SetDynamicFieldValue ¶ added in v0.5.0
func SetDynamicFieldValue(value *DynamicFieldValue) error
SetDynamicFieldValue sets a value for a dynamic field on an object.
func SetPluginManager ¶ added in v0.6.4
SetPluginManager sets the global plugin manager.
func SetQueueTemplates ¶ added in v0.6.0
SetQueueTemplates replaces all template assignments for a queue.
func SetScreenConfig ¶ added in v0.5.0
SetScreenConfig sets a single field-screen config.
func SetTemplateAttachments ¶ added in v0.5.0
SetTemplateAttachments sets the attachment assignments for a template.
func SetTemplateQueues ¶ added in v0.5.0
SetTemplateQueues sets the queue assignments for a template.
func SetValkeyCache ¶ added in v0.5.0
func SetValkeyCache(c *cache.RedisCache)
SetValkeyCache allows main to provide the shared Redis/Valkey cache.
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 ¶
SetupDynamicModules initializes the dynamic module system. Route registration is handled via YAML; this ensures endpoints exist even before the handler is ready.
func SetupHTMXRoutes ¶
SetupHTMXRoutes sets up all HTMX routes on the given router.
func SetupLDAPRoutes ¶
SetupLDAPRoutes configures LDAP API routes.
func SetupTestRouterWithRoutes ¶ added in v0.5.0
func SetupTestRouterWithRoutes(routes []AdminRouteDefinition) *gin.Engine
SetupTestRouterWithRoutes creates a test router using canonical route definitions. Tests MUST use this instead of manually registering routes.
func SetupTestTemplateRenderer ¶ added in v0.5.0
SetupTestTemplateRenderer initializes the global template renderer for tests. This MUST be called by any test that exercises handlers calling shared.GetGlobalRenderer(). Safe to call multiple times - initialization happens only once.
func SubstituteSignatureVariables ¶ added in v0.5.0
Reuses the same variable substitution logic as templates.
func SubstituteTemplateVariables ¶ added in v0.5.0
SubstituteTemplateVariables replaces template variables with actual values. Like OTRS, any unmatched variables are replaced with "-" rather than left as raw tags. Handles both raw tags (<OTRS_*>) and HTML-encoded tags (<OTRS_*>).
func SupportsAutoConfig ¶ added in v0.6.0
SupportsAutoConfig returns true if the field type can use automatic configuration with sensible defaults, without requiring manual configuration input. Dropdown and Multiselect require PossibleValues and cannot use auto-config.
func UpdateDynamicField ¶ added in v0.5.0
func UpdateDynamicField(field *DynamicField, userID int) error
UpdateDynamicField updates an existing dynamic field.
func UpdateSignature ¶ added in v0.5.0
UpdateSignature updates an existing signature.
func UpdateStandardTemplate ¶ added in v0.5.0
func UpdateStandardTemplate(t *StandardTemplate, userID int) error
UpdateStandardTemplate updates an existing template.
func ValidFieldTypes ¶ added in v0.5.0
func ValidFieldTypes() []string
ValidFieldTypes returns all supported field types.
func ValidObjectTypes ¶ added in v0.5.0
func ValidObjectTypes() []string
ValidObjectTypes returns all supported object types.
func ValidateAllTemplates ¶
ValidateAllTemplates walks templatesDir, parses every .pongo2 file, and returns a list of failures.
func ValidateContractHeaders ¶ added in v0.5.0
func ValidateContractHeaders(contract *EndpointContract, headers map[string]string) []string
ValidateContractHeaders checks that a request includes all required headers per the endpoint contract. Returns a list of missing headers.
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 ACL ¶ added in v0.6.0
type ACL struct {
ID int `json:"id"`
Name string `json:"name"`
Comments *string `json:"comments,omitempty"`
Description *string `json:"description,omitempty"`
ValidID int `json:"valid_id"`
StopAfterMatch *int `json:"stop_after_match,omitempty"`
ConfigMatch *ACLConfigMatch `json:"config_match,omitempty"`
ConfigChange *ACLConfigChange `json:"config_change,omitempty"`
CreateTime time.Time `json:"create_time"`
CreateBy int `json:"create_by"`
ChangeTime time.Time `json:"change_time"`
ChangeBy int `json:"change_by"`
}
ACL represents an Access Control List entry.
type ACLConfigChange ¶ added in v0.6.0
type ACLConfigChange struct {
Possible map[string]interface{} `json:"Possible,omitempty"`
PossibleNot map[string]interface{} `json:"PossibleNot,omitempty"`
PossibleAdd map[string]interface{} `json:"PossibleAdd,omitempty"`
}
ACLConfigChange defines what changes the ACL makes.
type ACLConfigMatch ¶ added in v0.6.0
type ACLConfigMatch struct {
Properties map[string]interface{} `json:"Properties,omitempty"`
}
ACLConfigMatch defines the conditions for when an ACL applies.
type ACLHelper ¶ added in v0.6.0
type ACLHelper struct {
// contains filtered or unexported fields
}
ACLHelper provides ACL filtering for ticket-related data.
func NewACLHelper ¶ added in v0.6.0
NewACLHelper creates a new ACL helper with the given database connection.
func (*ACLHelper) BuildACLContext ¶ added in v0.6.0
func (h *ACLHelper) BuildACLContext(ticket *models.Ticket, userID int, action string) *models.ACLContext
BuildACLContext creates an ACL context from ticket and user information.
func (*ACLHelper) FilterActions ¶ added in v0.6.0
func (h *ACLHelper) FilterActions(ctx context.Context, aclCtx *models.ACLContext, actions []string) []string
FilterActions filters available actions (buttons) based on ACLs.
func (*ACLHelper) FilterPriorities ¶ added in v0.6.0
func (h *ACLHelper) FilterPriorities(ctx context.Context, aclCtx *models.ACLContext, priorities []map[string]interface{}) []map[string]interface{}
FilterPriorities filters available priorities based on ACLs.
func (*ACLHelper) FilterQueues ¶ added in v0.6.0
func (h *ACLHelper) FilterQueues(ctx context.Context, aclCtx *models.ACLContext, queues []map[string]interface{}) []map[string]interface{}
FilterQueues filters available queues based on ACLs.
func (*ACLHelper) FilterSLAs ¶ added in v0.6.0
func (h *ACLHelper) FilterSLAs(ctx context.Context, aclCtx *models.ACLContext, slas []map[string]interface{}) []map[string]interface{}
FilterSLAs filters available SLAs based on ACLs.
func (*ACLHelper) FilterServices ¶ added in v0.6.0
func (h *ACLHelper) FilterServices(ctx context.Context, aclCtx *models.ACLContext, services []map[string]interface{}) []map[string]interface{}
FilterServices filters available services based on ACLs.
func (*ACLHelper) FilterStates ¶ added in v0.6.0
func (h *ACLHelper) FilterStates(ctx context.Context, aclCtx *models.ACLContext, states []map[string]interface{}) []map[string]interface{}
FilterStates filters available ticket states based on ACLs. The states parameter is a slice of maps with "id" and "name" keys.
func (*ACLHelper) FilterTypes ¶ added in v0.6.0
func (h *ACLHelper) FilterTypes(ctx context.Context, aclCtx *models.ACLContext, types []map[string]interface{}) []map[string]interface{}
FilterTypes filters available ticket types based on ACLs.
type AdditionalDFStorageConfig ¶ added in v0.6.0
type AdditionalDFStorageConfig struct {
Type string `yaml:"Type"` // "Backend" (store in DB) or "Frontend" (display only)
DynamicField string `yaml:"DynamicField"` // Target field name (without DynamicField_ prefix)
Key string `yaml:"Key"` // Source key from webservice response
}
AdditionalDFStorageConfig defines auto-fill behavior for webservice fields. When a webservice returns data, additional fields can be populated from the response.
type AdminRouteDefinition ¶ added in v0.5.0
type AdminRouteDefinition struct {
Method string
Path string
Handler gin.HandlerFunc
}
AdminRouteDefinition defines a single admin route for both production and testing.
func GetAdminDynamicFieldsRoutes ¶ added in v0.5.0
func GetAdminDynamicFieldsRoutes() []AdminRouteDefinition
GetAdminDynamicFieldsRoutes returns the canonical route definitions for dynamic fields admin. This MUST be used by both htmx_routes.go and test files to prevent route divergence.
func GetAdminRolesRoutes ¶ added in v0.5.0
func GetAdminRolesRoutes() []AdminRouteDefinition
GetAdminRolesRoutes returns the canonical route definitions for admin roles. This MUST be used by both htmx_routes.go and test files to prevent route divergence.
type AgentHandlerRegistry ¶
type AgentHandlerRegistry struct {
NewTicket gin.HandlerFunc
CreateTicket gin.HandlerFunc
}
AgentHandlerRegistry holds references to agent handlers for external registration.
type ArticleInsertParams ¶ added in v0.5.0
type ArticleInsertParams struct {
TicketID int64
CommunicationChannel int // 1=email, 2=phone, 3=internal, 4=chat
IsVisibleForCustomer int
CreateBy int64
}
ArticleInsertParams holds parameters for creating an article.
type ArticleMimeParams ¶ added in v0.5.0
type ArticleMimeParams struct {
ArticleID int64
From string
To string // optional, empty for notes
Subject string
Body string
ContentType string
IncomingTime int64
CreateBy int64
}
ArticleMimeParams holds parameters for article MIME data.
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 AttachmentBasicInfo ¶ added in v0.6.0
AttachmentBasicInfo represents basic attachment information for the admin UI.
func GetAttachmentBasicInfo ¶ added in v0.6.0
func GetAttachmentBasicInfo(attachmentID int) (*AttachmentBasicInfo, error)
GetAttachmentBasicInfo returns basic attachment information by ID.
type AttachmentInfo ¶ added in v0.5.0
type AttachmentInfo struct {
ID int `json:"id"`
Name string `json:"name"`
Filename string `json:"filename"`
ContentType string `json:"content_type"`
ContentSize int64 `json:"content_size"`
}
AttachmentInfo represents minimal attachment info for agent API.
func GetAttachmentsByIDs ¶ added in v0.5.0
func GetAttachmentsByIDs(ids []int) []AttachmentInfo
GetAttachmentsByIDs returns attachment details for given IDs.
type AttachmentWithTemplateCount ¶ added in v0.6.0
AttachmentWithTemplateCount represents an attachment with its template assignment count.
func GetAttachmentsWithTemplateCounts ¶ added in v0.6.0
func GetAttachmentsWithTemplateCounts() ([]AttachmentWithTemplateCount, error)
GetAttachmentsWithTemplateCounts returns all valid attachments with their template assignment counts.
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 BulkActionRequest ¶ added in v0.6.0
type BulkActionRequest struct {
TicketIDs []int `json:"ticket_ids" form:"ticket_ids"`
}
BulkActionRequest represents a request for bulk ticket operations
type BulkActionResult ¶ added in v0.6.0
type BulkActionResult struct {
Success bool `json:"success"`
Total int `json:"total"`
Succeeded int `json:"succeeded"`
Failed int `json:"failed"`
Errors []string `json:"errors,omitempty"`
}
BulkActionResult represents the result of a bulk operation
type BulkAssignRequest ¶ added in v0.6.0
type BulkAssignRequest struct {
BulkActionRequest
UserID int `json:"user_id" form:"user_id"`
}
BulkAssignRequest represents a bulk assignment request
type BulkLockRequest ¶ added in v0.6.0
type BulkLockRequest struct {
BulkActionRequest
Lock bool `json:"lock" form:"lock"`
}
BulkLockRequest represents a bulk lock/unlock request
type BulkMergeRequest ¶ added in v0.6.0
type BulkMergeRequest struct {
BulkActionRequest
TargetTicketID int `json:"target_ticket_id" form:"target_ticket_id"`
}
BulkMergeRequest represents a bulk merge request
type BulkPriorityRequest ¶ added in v0.6.0
type BulkPriorityRequest struct {
BulkActionRequest
PriorityID int `json:"priority_id" form:"priority_id"`
}
BulkPriorityRequest represents a bulk priority change request
type BulkQueueRequest ¶ added in v0.6.0
type BulkQueueRequest struct {
BulkActionRequest
QueueID int `json:"queue_id" form:"queue_id"`
}
BulkQueueRequest represents a bulk queue move request
type BulkStatusRequest ¶ added in v0.6.0
type BulkStatusRequest struct {
BulkActionRequest
StatusID int `json:"status_id" form:"status_id"`
PendingUntil int64 `json:"pending_until" form:"pending_until"`
}
BulkStatusRequest represents a bulk status change request
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"`
Tags []string `json:"tags"`
Scope string `json:"scope"`
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 CannedResponseDB ¶ added in v0.5.0
type CannedResponseDB struct {
ID int
Name string
Category sql.NullString
Content string
ContentType string
Tags sql.NullString
Scope string
OwnerID int
TeamID sql.NullInt64
Placeholders sql.NullString
UsageCount int
LastUsed sql.NullTime
ValidID int
CreateTime time.Time
CreateBy int
ChangeTime time.Time
ChangeBy int
}
CannedResponseDB represents a canned response in the database.
func (*CannedResponseDB) ToCannedResponse ¶ added in v0.5.0
func (r *CannedResponseDB) ToCannedResponse() *CannedResponse
ToCannedResponse converts database model to API model.
type CannedResponseFilters ¶ added in v0.5.0
type CannedResponseFilters struct {
Category string
Scope string
Search string
Tags []string
SortBy string
SortOrder string
}
CannedResponseFilters holds filter options for listing responses.
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 CannedResponseRepository ¶ added in v0.5.0
type CannedResponseRepository struct {
// contains filtered or unexported fields
}
CannedResponseRepository handles database operations for canned responses.
func NewCannedResponseRepository ¶ added in v0.5.0
func NewCannedResponseRepository() (*CannedResponseRepository, error)
NewCannedResponseRepository creates a new repository.
func (*CannedResponseRepository) CheckDuplicate ¶ added in v0.5.0
func (r *CannedResponseRepository) CheckDuplicate(name, scope string, ownerID, teamID int) (bool, error)
CheckDuplicate checks if a response with the same name exists in the same scope.
func (*CannedResponseRepository) Create ¶ added in v0.5.0
func (r *CannedResponseRepository) Create(cr *CannedResponse, userID int) (int, error)
Create inserts a new canned response.
func (*CannedResponseRepository) Delete ¶ added in v0.5.0
func (r *CannedResponseRepository) Delete(id, userID int) error
Delete soft-deletes a canned response by setting valid_id = 2.
func (*CannedResponseRepository) GetByID ¶ added in v0.5.0
func (r *CannedResponseRepository) GetByID(id int) (*CannedResponse, error)
GetByID retrieves a canned response by ID.
func (*CannedResponseRepository) IncrementUsage ¶ added in v0.5.0
func (r *CannedResponseRepository) IncrementUsage(id int) error
IncrementUsage increments usage count and updates last_used.
func (*CannedResponseRepository) ListAccessible ¶ added in v0.5.0
func (r *CannedResponseRepository) ListAccessible(userID, teamID int, filters CannedResponseFilters) ([]*CannedResponse, error)
ListAccessible returns canned responses accessible to a user.
func (*CannedResponseRepository) ListCategories ¶ added in v0.5.0
func (r *CannedResponseRepository) ListCategories() ([]string, error)
ListCategories returns all canned response categories.
func (*CannedResponseRepository) Update ¶ added in v0.5.0
func (r *CannedResponseRepository) Update(id int, cr *CannedResponse, userID int) error
Update updates a canned response.
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 CustomerCompanyInfo ¶ added in v0.6.0
CustomerCompanyInfo holds customer company data for display
type CustomerGroupAssignment ¶ added in v0.6.0
type CustomerGroupAssignment struct {
Customer CustomerCompanyInfo
Permissions map[int]map[string]bool // group_id -> permission_key -> enabled
}
CustomerGroupAssignment holds the permission matrix for a customer
type CustomerGroupPermission ¶ added in v0.6.0
type CustomerGroupPermission struct {
CustomerID string
GroupID int
PermissionKey string
PermissionValue int
PermissionContext string
}
CustomerGroupPermission represents a permission assignment
type CustomerUserInfo ¶ added in v0.6.0
type CustomerUserInfo struct {
Login string
FirstName string
LastName string
Email string
ValidID int
ValidName string
}
CustomerUserInfo holds customer user data for display
type CustomerUserWithPermissions ¶ added in v0.6.0
type CustomerUserWithPermissions struct {
Login string
FirstName string
LastName string
Email string
ValidID int
ValidName string
Permissions map[string]bool // permission_key -> enabled
}
CustomerUserWithPermissions holds customer user data with permission flags for templates
type CustomerWithPermissions ¶ added in v0.6.0
type CustomerWithPermissions struct {
CustomerID string
Name string
ValidID int
ValidName string
Permissions map[string]bool // permission_key -> enabled
}
CustomerWithPermissions holds customer data with permission flags for templates
type DynamicField ¶ added in v0.5.0
type DynamicField struct {
ID int `json:"id" db:"id"`
InternalField int `json:"internal_field" db:"internal_field"`
Name string `json:"name" db:"name"`
Label string `json:"label" db:"label"`
FieldOrder int `json:"field_order" db:"field_order"`
FieldType string `json:"field_type" db:"field_type"`
ObjectType string `json:"object_type" db:"object_type"`
Config *DynamicFieldConfig `json:"config"`
ConfigRaw []byte `json:"-" db:"config"` // YAML blob from DB
ValidID int `json:"valid_id" db:"valid_id"`
CreateTime time.Time `json:"create_time" db:"create_time"`
CreateBy int `json:"create_by" db:"create_by"`
ChangeTime time.Time `json:"change_time" db:"change_time"`
ChangeBy int `json:"change_by" db:"change_by"`
}
DynamicField represents a field definition from dynamic_field table.
func GetDynamicField ¶ added in v0.5.0
func GetDynamicField(id int) (*DynamicField, error)
GetDynamicField retrieves a single dynamic field by ID.
func GetDynamicFieldByName ¶ added in v0.5.0
func GetDynamicFieldByName(name string) (*DynamicField, error)
GetDynamicFieldByName retrieves a single dynamic field by name.
func GetDynamicFields ¶ added in v0.5.0
func GetDynamicFields(objectType, fieldType string) ([]DynamicField, error)
GetDynamicFields retrieves all dynamic fields.
func GetDynamicFieldsForScreen ¶ added in v0.5.0
func GetDynamicFieldsForScreen(objectType, screenKey string) ([]DynamicField, error)
GetDynamicFieldsForScreen retrieves active fields for a specific screen.
func (*DynamicField) GetValueColumn ¶ added in v0.5.0
func (df *DynamicField) GetValueColumn() string
GetValueColumn returns the database column name used for storing values of this field type.
func (*DynamicField) IsActive ¶ added in v0.5.0
func (df *DynamicField) IsActive() bool
IsActive returns true if the field is valid (active).
func (*DynamicField) IsInternal ¶ added in v0.5.0
func (df *DynamicField) IsInternal() bool
IsInternal returns true if this is an internal/system field.
func (*DynamicField) ParseConfig ¶ added in v0.5.0
func (df *DynamicField) ParseConfig() error
ParseConfig deserializes YAML config blob into DynamicFieldConfig.
func (*DynamicField) SerializeConfig ¶ added in v0.5.0
func (df *DynamicField) SerializeConfig() error
SerializeConfig serializes DynamicFieldConfig to YAML for storage.
func (*DynamicField) Validate ¶ added in v0.5.0
func (df *DynamicField) Validate() error
Validate checks the dynamic field for errors.
type DynamicFieldConfig ¶ added in v0.5.0
type DynamicFieldConfig struct {
// Common to all types
DefaultValue string `yaml:"DefaultValue,omitempty"`
// Text/TextArea fields
MaxLength int `yaml:"MaxLength,omitempty"`
RegExList []RegEx `yaml:"RegExList,omitempty"` // OTRS uses RegExList
Link string `yaml:"Link,omitempty"`
LinkPreview string `yaml:"LinkPreview,omitempty"`
Rows int `yaml:"Rows,omitempty"` // TextArea only
Cols int `yaml:"Cols,omitempty"` // TextArea only
// Dropdown/Multiselect
PossibleValues map[string]string `yaml:"PossibleValues,omitempty"`
PossibleNone int `yaml:"PossibleNone,omitempty"` // OTRS uses 0/1 not bool
TranslatableValues int `yaml:"TranslatableValues,omitempty"`
TreeView int `yaml:"TreeView,omitempty"`
// Date/DateTime
YearsInPast int `yaml:"YearsInPast,omitempty"`
YearsInFuture int `yaml:"YearsInFuture,omitempty"`
DateRestriction string `yaml:"DateRestriction,omitempty"` // none, DisablePastDates, DisableFutureDates
YearsPeriod int `yaml:"YearsPeriod,omitempty"`
// WebserviceDropdown/WebserviceMultiselect - OTRS compatible
Webservice string `yaml:"Webservice,omitempty"` // Webservice name
InvokerSearch string `yaml:"InvokerSearch,omitempty"` // Invoker for search/autocomplete
InvokerGet string `yaml:"InvokerGet,omitempty"` // Invoker for get-by-id
Backend string `yaml:"Backend,omitempty"` // Backend type (DirectRequest, etc.)
StoredValue string `yaml:"StoredValue,omitempty"` // Field key to store (e.g., "ID")
DisplayedValues string `yaml:"DisplayedValues,omitempty"` // Fields to display (comma-sep, e.g., "Name,Code")
DisplayedValuesSeparator string `yaml:"DisplayedValuesSeparator,omitempty"` // Separator for display (e.g., " - ")
SearchKeys string `yaml:"SearchKeys,omitempty"` // Fields to search (comma-sep)
AutocompleteMinLength int `yaml:"AutocompleteMinLength,omitempty"` // Min chars before autocomplete (default: 3)
QueryDelay int `yaml:"QueryDelay,omitempty"` // Delay in ms before query (default: 500)
CacheTTL int `yaml:"CacheTTL,omitempty"` // Cache TTL in seconds (default: 60)
Limit int `yaml:"Limit,omitempty"` // Result limit (default: 20)
AdditionalDFStorage []AdditionalDFStorageConfig `yaml:"AdditionalDFStorage,omitempty"` // Auto-fill other fields from response
}
DynamicFieldConfig stores type-specific configuration (YAML-serialized for OTRS compatibility).
func DefaultDynamicFieldConfig ¶ added in v0.6.0
func DefaultDynamicFieldConfig(fieldType string) *DynamicFieldConfig
DefaultDynamicFieldConfig returns sensible default configuration for each field type. Used when auto-config mode is enabled to skip manual configuration.
type DynamicFieldDisplay ¶ added in v0.5.0
type DynamicFieldDisplay struct {
Field DynamicField
Value interface{} // The raw value (string, int, time, etc.)
DisplayValue string // Human-readable display value
}
DynamicFieldDisplay represents a dynamic field with its value for display purposes.
func GetDynamicFieldValuesForDisplay ¶ added in v0.5.0
func GetDynamicFieldValuesForDisplay(objectID int, objectType string, screenKey string) ([]DynamicFieldDisplay, error)
screenKey is the screen (e.g., "AgentTicketZoom") - if empty, returns all enabled fields.
type DynamicFieldExport ¶ added in v0.6.0
type DynamicFieldExport struct {
DynamicFields map[string]DynamicFieldExportItem `yaml:"DynamicFields"`
DynamicFieldScreens map[string]map[string]int `yaml:"DynamicFieldScreens,omitempty"`
}
DynamicFieldExport represents the full export structure (OTRS-compatible format).
func ExportDynamicFields ¶ added in v0.6.0
func ExportDynamicFields(fieldNames []string, includeScreens bool) (*DynamicFieldExport, error)
ExportDynamicFields exports the specified dynamic fields to an OTRS-compatible format.
func ParseDynamicFieldsYAML ¶ added in v0.6.0
func ParseDynamicFieldsYAML(data []byte) (*DynamicFieldExport, error)
ParseDynamicFieldsYAML parses a YAML file into a DynamicFieldExport structure.
type DynamicFieldExportItem ¶ added in v0.6.0
type DynamicFieldExportItem struct {
Name string `yaml:"Name"`
Label string `yaml:"Label"`
FieldType string `yaml:"FieldType"`
ObjectType string `yaml:"ObjectType"`
FieldOrder int `yaml:"FieldOrder"`
ValidID int `yaml:"ValidID"`
Config *DynamicFieldConfig `yaml:"Config,omitempty"`
}
DynamicFieldExportItem represents a single field for export.
type DynamicFieldFilter ¶ added in v0.5.0
type DynamicFieldFilter struct {
FieldID int // ID of the dynamic field
FieldName string // Name of the dynamic field (alternative to ID)
Operator string // eq, ne, contains, gt, lt, gte, lte, in, notin, empty, notempty
Value string // Value to compare against (comma-separated for 'in' operator)
}
DynamicFieldFilter represents a filter condition for dynamic field values.
func ParseDynamicFieldFiltersFromQuery ¶ added in v0.5.0
func ParseDynamicFieldFiltersFromQuery(queryParams map[string][]string) []DynamicFieldFilter
Expected format: df_FieldName=value or df_FieldName_op=value (e.g., df_CustomerType=VIP, df_Amount_gt=1000).
type DynamicFieldScreenConfig ¶ added in v0.5.0
type DynamicFieldScreenConfig struct {
ID int `json:"id" db:"id"`
FieldID int `json:"field_id" db:"field_id"`
ScreenKey string `json:"screen_key" db:"screen_key"`
ConfigValue int `json:"config_value" db:"config_value"` // 0=disabled, 1=enabled, 2=required
CreateTime time.Time `json:"create_time" db:"create_time"`
CreateBy int `json:"create_by" db:"create_by"`
ChangeTime time.Time `json:"change_time" db:"change_time"`
ChangeBy int `json:"change_by" db:"change_by"`
}
DynamicFieldScreenConfig maps fields to screens.
func GetScreenConfigForField ¶ added in v0.5.0
func GetScreenConfigForField(fieldID int) ([]DynamicFieldScreenConfig, error)
GetScreenConfigForField gets all screen configs for a single field.
func GetScreenConfigForScreen ¶ added in v0.5.0
func GetScreenConfigForScreen(screenKey string) ([]DynamicFieldScreenConfig, error)
GetScreenConfigForScreen gets all field configs for a specific screen.
type DynamicFieldValue ¶ added in v0.5.0
type DynamicFieldValue struct {
ID int `json:"id" db:"id"`
FieldID int `json:"field_id" db:"field_id"`
ObjectID int64 `json:"object_id" db:"object_id"`
ValueText *string `json:"value_text,omitempty" db:"value_text"`
ValueDate *time.Time `json:"value_date,omitempty" db:"value_date"`
ValueInt *int64 `json:"value_int,omitempty" db:"value_int"`
}
DynamicFieldValue represents a stored value from dynamic_field_value table.
func GetDynamicFieldValues ¶ added in v0.5.0
func GetDynamicFieldValues(objectID int64) ([]DynamicFieldValue, error)
GetDynamicFieldValues retrieves all values for an object.
type EndpointContract ¶ added in v0.5.0
type EndpointContract struct {
Method string // HTTP method
Path string // Route path pattern
RequiredHeaders map[string]string // Headers the client MUST send for JSON response
ContentType string // Expected Content-Type for request body (if any)
ResponseType string // Expected response type: "json" or "html"
JSFunction string // Name of JavaScript function that calls this endpoint
}
EndpointContract documents the expected request/response contract for an endpoint. This MUST be kept in sync with both the handler logic AND the JavaScript client code. When writing tests, use these contracts to ensure test requests mirror real client requests.
func ContractForPath ¶ added in v0.5.0
func ContractForPath(contracts []EndpointContract, method, path string) *EndpointContract
ContractForPath returns the endpoint contract for a given method and path. Use this in tests to ensure requests include the required headers.
func GetAdminRolesContracts ¶ added in v0.5.0
func GetAdminRolesContracts() []EndpointContract
GetAdminRolesContracts returns the endpoint contracts for admin roles. CRITICAL: When handlers check headers to decide JSON vs HTML response, document the required headers here AND ensure JS client sends them.
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 FieldWithScreenConfig ¶ added in v0.5.0
type FieldWithScreenConfig struct {
Field DynamicField
ConfigValue int // 0=disabled, 1=enabled, 2=required
}
FieldWithScreenConfig pairs a field with its screen configuration value.
func GetFieldsForScreenWithConfig ¶ added in v0.5.0
func GetFieldsForScreenWithConfig(screenKey, objectType string) ([]FieldWithScreenConfig, error)
GetFieldsForScreenWithConfig gets fields enabled for a specific screen.
type GenericAgentJob ¶ added in v0.6.0
type GenericAgentJob struct {
Name string `json:"name"`
Valid bool `json:"valid"`
Config map[string]string `json:"config"`
}
GenericAgentJob represents a generic agent job configuration. Generic agent jobs are stored as key-value pairs in the database.
type GroupCustomerAssignment ¶ added in v0.6.0
type GroupCustomerAssignment struct {
Group GroupInfo
Permissions map[string]map[string]bool // customer_id -> permission_key -> enabled
}
GroupCustomerAssignment holds the permission matrix for a group
type GroupWithCustomerUserPermissions ¶ added in v0.6.0
type GroupWithCustomerUserPermissions struct {
ID int
Name string
ValidID int
ValidName string
Permissions map[string]bool // permission_key -> enabled
}
GroupWithCustomerUserPermissions holds group data with permission flags for customer user templates
type GroupWithPermissions ¶ added in v0.6.0
type GroupWithPermissions struct {
ID int
Name string
ValidID int
ValidName string
Permissions map[string]bool // permission_key -> enabled
}
GroupWithPermissions holds group data with permission flags for templates
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)
@Router /api/v1/i18n/export/{lang} [get].
func (*I18nHandlers) GetCurrentTranslations ¶
func (h *I18nHandlers) GetCurrentTranslations(c *gin.Context)
@Router /api/v1/i18n/translations [get].
func (*I18nHandlers) GetLanguageStats ¶
func (h *I18nHandlers) GetLanguageStats(c *gin.Context)
@Router /api/v1/i18n/stats [get].
func (*I18nHandlers) GetMissingTranslations ¶
func (h *I18nHandlers) GetMissingTranslations(c *gin.Context)
@Router /api/v1/i18n/missing/{lang} [get].
func (*I18nHandlers) GetSupportedLanguages ¶
func (h *I18nHandlers) GetSupportedLanguages(c *gin.Context)
@Router /api/v1/i18n/languages [get].
func (*I18nHandlers) GetTranslationCoverage ¶
func (h *I18nHandlers) GetTranslationCoverage(c *gin.Context)
@Router /api/v1/i18n/coverage [get].
func (*I18nHandlers) GetTranslations ¶
func (h *I18nHandlers) GetTranslations(c *gin.Context)
@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)
@Router /api/v1/i18n/language [post].
func (*I18nHandlers) Translate ¶
func (h *I18nHandlers) Translate(c *gin.Context)
@Router /api/v1/i18n/translate [post].
func (*I18nHandlers) ValidateTranslations ¶
func (h *I18nHandlers) ValidateTranslations(c *gin.Context)
@Router /api/v1/i18n/validate/{lang} [get].
type ImportPreviewItem ¶ added in v0.6.0
type ImportPreviewItem struct {
Name string `json:"name"`
Label string `json:"label"`
FieldType string `json:"field_type"`
ObjectType string `json:"object_type"`
Exists bool `json:"exists"`
HasScreens bool `json:"has_screens"`
ScreenCount int `json:"screen_count"`
WillCreate bool `json:"will_create"`
WillOverwrite bool `json:"will_overwrite"`
}
ImportPreviewItem represents a field in the import preview.
func GetImportPreview ¶ added in v0.6.0
func GetImportPreview(export *DynamicFieldExport) ([]ImportPreviewItem, error)
GetImportPreview returns a preview of what will happen when importing.
type ImportResult ¶ added in v0.6.0
type ImportResult struct {
Created []string `json:"created"`
Updated []string `json:"updated"`
Skipped []string `json:"skipped"`
Errors []string `json:"errors"`
ScreensOK int `json:"screens_ok"`
}
ImportResult contains the results of an import operation.
func ImportDynamicFields ¶ added in v0.6.0
func ImportDynamicFields( export *DynamicFieldExport, selectedFields []string, selectedScreens []string, overwrite bool, userID int, ) (*ImportResult, error)
ImportDynamicFields imports dynamic fields from an export structure.
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 LookupItem ¶ added in v0.6.0
LookupItem represents a simple ID/Name lookup option for templates.
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 NotificationEvent ¶ added in v0.6.0
type NotificationEvent struct {
ID int `json:"id"`
Name string `json:"name"`
ValidID int `json:"valid_id"`
Comments string `json:"comments"`
CreateTime time.Time `json:"create_time"`
CreateBy int `json:"create_by"`
ChangeTime time.Time `json:"change_time"`
ChangeBy int `json:"change_by"`
}
NotificationEvent represents a notification event from the database.
type NotificationEventFull ¶ added in v0.6.0
type NotificationEventFull struct {
NotificationEvent
Events []string `json:"events"`
Filters map[string][]string `json:"filters"`
Recipients map[string][]string `json:"recipients"`
Messages map[string]NotificationEventMessage `json:"messages"`
}
NotificationEventFull represents a complete notification with all related data.
type NotificationEventInput ¶ added in v0.6.0
type NotificationEventInput struct {
Name string `json:"name" binding:"required"`
ValidID int `json:"valid_id"`
Comments string `json:"comments"`
Events []string `json:"events"`
Filters map[string][]string `json:"filters"`
Recipients map[string][]string `json:"recipients"`
Messages map[string]NotificationEventMessage `json:"messages"`
}
NotificationEventInput represents the JSON input for creating/updating notification events.
type NotificationEventItem ¶ added in v0.6.0
type NotificationEventItem struct {
NotificationID int `json:"notification_id"`
EventKey string `json:"event_key"`
EventValue string `json:"event_value"`
}
NotificationEventItem represents an event trigger condition.
type NotificationEventMessage ¶ added in v0.6.0
type NotificationEventMessage struct {
ID int `json:"id"`
NotificationID int `json:"notification_id"`
Subject string `json:"subject"`
Text string `json:"text"`
ContentType string `json:"content_type"`
Language string `json:"language"`
}
NotificationEventMessage represents a notification message for a specific language.
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 PluginWidgetData ¶ added in v0.6.4
type PluginWidgetData struct {
ID string
Title string
PluginName string
HTML string
Size string
Refreshable bool
RefreshSec int
}
PluginWidgetData is the rendered widget data for templates.
func GetPluginWidgets ¶ added in v0.6.4
func GetPluginWidgets(ctx context.Context, location string) []PluginWidgetData
GetPluginWidgets returns rendered widgets for a dashboard location. Used by dashboard handlers to include plugin widgets.
type PostmasterFilterInput ¶ added in v0.6.0
type PostmasterFilterInput struct {
Name string `json:"name" binding:"required"`
Stop bool `json:"stop"`
Matches []repository.FilterMatch `json:"matches"`
Sets []repository.FilterSet `json:"sets"`
}
PostmasterFilterInput represents the JSON input for creating/updating filters.
type QueueBasic ¶ added in v0.5.0
QueueBasic represents minimal queue info for display.
func GetSignatureQueues ¶ added in v0.5.0
func GetSignatureQueues(signatureID int) ([]QueueBasic, error)
GetSignatureQueues returns queues that use a specific signature.
type QueueInfo ¶ added in v0.6.0
QueueInfo represents basic queue information.
func GetQueueInfo ¶ added in v0.6.0
GetQueueInfo returns basic queue information by ID.
type QueueWithTemplateCount ¶ added in v0.6.0
QueueWithTemplateCount represents a queue with its template assignment count.
func GetQueuesWithTemplateCounts ¶ added in v0.6.0
func GetQueuesWithTemplateCounts() ([]QueueWithTemplateCount, error)
GetQueuesWithTemplateCounts returns all valid queues with their template assignment counts.
type Role ¶
type Role struct {
ID int `json:"id"`
Name string `json:"name"`
Comments *string `json:"comments"`
Description string `json:"description"` // Computed from Comments for template
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 ScreenConfigMatrix ¶ added in v0.5.0
type ScreenConfigMatrix struct {
ObjectType string
Fields []DynamicField
Screens []ScreenDefinition
ConfigMap map[int]map[string]int // fieldID -> screenKey -> configValue
}
ScreenConfigMatrix provides a full view of field-screen mappings for admin UI.
func GetScreenConfigMatrix ¶ added in v0.5.0
func GetScreenConfigMatrix(objectType string) (*ScreenConfigMatrix, error)
GetScreenConfigMatrix builds a matrix of all fields and their screen configs.
type ScreenDefinition ¶ added in v0.5.0
type ScreenDefinition struct {
Key string `json:"key"`
Name string `json:"name"`
ObjectType string `json:"object_type"`
SupportsRequired bool `json:"supports_required"`
IsDisplayOnly bool `json:"is_display_only"`
}
ScreenDefinition describes a screen that can display dynamic fields.
func GetScreenDefinitions ¶ added in v0.5.0
func GetScreenDefinitions() []ScreenDefinition
GetScreenDefinitions returns all screens that support dynamic fields.
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 SearchableDynamicField ¶ added in v0.5.0
type SearchableDynamicField struct {
DynamicField
Options []map[string]string `json:"options"` // [{key: "value", value: "display_name"}, ...]
}
SearchableDynamicField wraps DynamicField with template-friendly Options.
func GetFieldsForSearch ¶ added in v0.5.0
func GetFieldsForSearch() ([]SearchableDynamicField, error)
Results are cached for 30 seconds to improve performance.
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 Signature ¶ added in v0.5.0
type Signature struct {
ID int `json:"id"`
Name string `json:"name"`
Text string `json:"text"`
ContentType string `json:"content_type"`
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"`
}
Signature represents an email signature in the system.
func GetAllSignatures ¶ added in v0.5.0
GetAllSignatures returns all valid signatures for dropdowns.
func GetSignature ¶ added in v0.5.0
GetSignature returns a single signature by ID.
type SignatureExportData ¶ added in v0.5.0
type SignatureExportData struct {
Name string `yaml:"name"`
Text string `yaml:"text"`
ContentType string `yaml:"content_type,omitempty"`
Comments string `yaml:"comments,omitempty"`
Valid bool `yaml:"valid"`
Queues []string `yaml:"queues,omitempty"`
}
SignatureExportData represents a signature for YAML export.
type SignatureForAgent ¶ added in v0.5.0
type SignatureForAgent struct {
ID int `json:"id"`
Name string `json:"name"`
Text string `json:"text"`
ContentType string `json:"content_type"`
}
SignatureForAgent represents a signature available to agents.
func GetQueueSignature ¶ added in v0.5.0
func GetQueueSignature(queueID int) (*SignatureForAgent, error)
GetQueueSignature returns the signature assigned to a specific queue.
type SignatureWithStats ¶ added in v0.5.0
SignatureWithStats includes queue usage statistics.
func ListSignatures ¶ added in v0.5.0
func ListSignatures(search string, validFilter string, sortBy string, sortOrder string) ([]SignatureWithStats, error)
ListSignatures returns all signatures with optional filters.
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.
func ListStandardAttachments ¶ added in v0.5.0
func ListStandardAttachments() ([]StandardAttachment, error)
ListStandardAttachments returns all valid standard attachments.
type StandardTemplate ¶ added in v0.5.0
type StandardTemplate struct {
ID int `json:"id"`
Name string `json:"name"`
Text string `json:"text"`
ContentType string `json:"content_type"`
TemplateType string `json:"template_type"` // comma-separated: Answer,Forward,Note
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"`
}
StandardTemplate represents a response template in the system.
func GetStandardTemplate ¶ added in v0.5.0
func GetStandardTemplate(id int) (*StandardTemplate, error)
GetStandardTemplate retrieves a single template by ID.
type StandardTemplateWithStats ¶ added in v0.5.0
type StandardTemplateWithStats struct {
StandardTemplate
QueueCount int `json:"queue_count"`
}
StandardTemplateWithStats includes usage statistics.
func ListStandardTemplates ¶ added in v0.5.0
func ListStandardTemplates( search string, validFilter string, typeFilter string, sortBy string, sortOrder string, ) ([]StandardTemplateWithStats, error)
ListStandardTemplates returns all templates with optional filters.
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 TemplateExport ¶ added in v0.5.0
type TemplateExport struct {
Name string `yaml:"name"`
Text string `yaml:"text,omitempty"`
ContentType string `yaml:"content_type,omitempty"`
TemplateType string `yaml:"template_type,omitempty"`
Comments string `yaml:"comments,omitempty"`
Valid bool `yaml:"valid"`
Queues []string `yaml:"queues,omitempty"`
Attachments []string `yaml:"attachments,omitempty"`
}
TemplateExport represents a single template for YAML export.
func ExportTemplate ¶ added in v0.5.0
func ExportTemplate(id int) (*TemplateExport, error)
ExportTemplate exports a single template with its relationships.
type TemplateExportFile ¶ added in v0.5.0
type TemplateExportFile struct {
Version string `yaml:"version"`
ExportedAt string `yaml:"exported_at"`
Templates []TemplateExport `yaml:"templates"`
}
TemplateExportFile represents the full export file structure.
func ExportAllTemplates ¶ added in v0.5.0
func ExportAllTemplates() (*TemplateExportFile, error)
ExportAllTemplates exports all templates.
type TemplateForAgent ¶ added in v0.5.0
type TemplateForAgent struct {
ID int `json:"id"`
Name string `json:"name"`
Text string `json:"text"`
ContentType string `json:"content_type"`
TemplateType string `json:"template_type"`
}
TemplateForAgent represents a template available to agents.
func GetTemplatesForQueue ¶ added in v0.5.0
func GetTemplatesForQueue(queueID int, templateType string) ([]TemplateForAgent, error)
GetTemplatesForQueue returns templates available for a specific queue and optional type filter.
type TemplateOption ¶ added in v0.6.0
TemplateOption represents a template option for checkbox selection.
type TemplateTypeOption ¶ added in v0.5.0
TemplateTypeOption represents a template type for UI selection.
func ValidTemplateTypes ¶ added in v0.5.0
func ValidTemplateTypes() []TemplateTypeOption
ValidTemplateTypes returns all available template types matching OTRS.
type TemplateWithAttachmentCount ¶ added in v0.6.0
type TemplateWithAttachmentCount struct {
ID int
Name string
TemplateType string
AttachmentCount int
}
TemplateWithAttachmentCount represents a template with its attachment assignment count.
func GetTemplatesWithAttachmentCounts ¶ added in v0.6.0
func GetTemplatesWithAttachmentCounts() ([]TemplateWithAttachmentCount, error)
GetTemplatesWithAttachmentCounts returns all valid templates with their attachment assignment counts.
type TemplateWithQueueCount ¶ added in v0.6.0
TemplateWithQueueCount represents a template with its queue assignment count.
func GetTemplatesWithQueueCounts ¶ added in v0.6.0
func GetTemplatesWithQueueCounts() ([]TemplateWithQueueCount, error)
GetTemplatesWithQueueCounts returns all valid templates with their queue assignment counts.
type TestAuthConfig ¶ added in v0.6.3
TestAuthConfig holds configuration for test authentication.
func GetTestAuthConfig ¶ added in v0.6.3
func GetTestAuthConfig() TestAuthConfig
GetTestAuthConfig returns auth configuration from environment variables with defaults. Environment variables:
- TEST_AUTH_USER_ID: User ID for test token (default: 1)
- TEST_AUTH_EMAIL: Email for test token (default: root@localhost)
- TEST_AUTH_ROLE: Role for test token (default: Admin)
- TEST_AUTH_IS_ADMIN: Whether user is admin (default: true)
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
¶
- acl_helper.go
- admin_acl_handlers.go
- admin_acl_init.go
- admin_attachment_handler.go
- admin_attachment_init.go
- admin_crud_handlers.go
- admin_customer_company.go
- admin_customer_groups_handlers.go
- admin_customer_user_groups_handlers.go
- admin_customer_user_services.go
- admin_customer_user_services_init.go
- admin_customer_users_handlers.go
- admin_debug_config_sources_handler.go
- admin_debug_ticket_number_handler.go
- admin_dynamic_field_webservice_ajax.go
- admin_dynamic_fields_handlers.go
- admin_email_handlers.go
- admin_generic_agent_handlers.go
- admin_generic_agent_init.go
- admin_groups_handlers.go
- admin_lookups_handlers.go
- admin_notification_event_handlers.go
- admin_notification_event_init.go
- admin_postmaster_filters_handlers.go
- admin_postmaster_filters_init.go
- admin_queue_templates_handlers.go
- admin_queue_templates_init.go
- admin_roles_handler.go
- admin_roles_init.go
- admin_service_handlers.go
- admin_session_handlers.go
- admin_signatures_handlers.go
- admin_signatures_init.go
- admin_sla_handlers.go
- admin_sla_init.go
- admin_state_handlers.go
- admin_system_maintenance_handlers.go
- admin_system_maintenance_init.go
- admin_template_attachments_handlers.go
- admin_template_attachments_init.go
- admin_templates_handlers.go
- admin_templates_init.go
- admin_ticket_attribute_relations_handlers.go
- admin_tickets_handler.go
- admin_type_handlers.go
- admin_user_password_handler.go
- admin_users_handlers.go
- admin_users_handlers_improved.go
- admin_webservice_handlers.go
- agent_handlers_init.go
- agent_routes.go
- agent_signatures_handlers.go
- agent_signatures_init.go
- agent_templates_handlers.go
- agent_templates_init.go
- agent_ticket_actions.go
- agent_ticket_bulk_actions.go
- agent_ticket_bulk_actions_init.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_helper.go
- article_list_handler.go
- article_update_handler.go
- attachment_display_fix.go
- attachment_helper.go
- auth_api.go
- auth_customer.go
- auth_handler.go
- auth_handlers.go
- auth_htmx_handlers.go
- basic_handlers.go
- canned_response_handler.go
- canned_response_handlers.go
- canned_response_repository.go
- customer_attachment_handlers.go
- customer_only_guard.go
- customer_portal_config.go
- customer_routes.go
- dashboard_htmx_handlers.go
- dynamic_field_import_export.go
- dynamic_field_init.go
- dynamic_field_repository.go
- dynamic_field_screen_config.go
- dynamic_field_search.go
- dynamic_field_types.go
- dynamic_integration.go
- dynamic_router.go
- email_identity_handlers.go
- exports.go
- exports_admin_placeholder.go
- exports_agent.go
- exports_api_v1.go
- exports_customer.go
- file_handler.go
- group_list_handler.go
- handler_registry.go
- helpers.go
- htmx_routes.go
- htmx_utils.go
- i18n_handlers.go
- internal_note_handlers.go
- ldap_handlers.go
- lookup_crud_handlers.go
- lookup_handlers.go
- mail_account_status.go
- misc_init.go
- plugin_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_htmx_handlers.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
- root_redirect.go
- routes_simplified.go
- routes_watcher.go
- search_handler.go
- search_handlers.go
- service_list_handler.go
- sla_handlers.go
- state_handlers_api.go
- state_list_handler.go
- statistics_handlers.go
- template_validation.go
- test_helpers.go
- test_router_registry.go
- ticket_actions_api.go
- ticket_actions_handlers.go
- ticket_advanced_search_handler.go
- ticket_api_handlers.go
- ticket_attachment_handler.go
- ticket_create_handler.go
- ticket_create_handlers.go
- ticket_create_with_attachments.go
- ticket_delete_api.go
- ticket_detail_handlers.go
- ticket_edit_handler.go
- ticket_events.go
- ticket_fragment_handlers.go
- ticket_get_handler.go
- ticket_internal_note_handler.go
- ticket_list_handler.go
- ticket_list_handlers.go
- ticket_merge_handler.go
- ticket_messages_handler.go
- ticket_notes_handlers.go
- ticket_sla_handler.go
- ticket_state_handlers.go
- ticket_state_helper.go
- ticket_state_list_handler.go
- ticket_template_handler.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
- webhook_test_helpers.go
- yaml_router_loader.go