Backend Development (Kotlin)
🚀 Plugin Lifecycle & Context
Plugins extend PanoPlugin. Key contexts include:
applicationContext: Pano's main DI context.pluginBeanContext: Handles plugin-internal beans.pluginGlobalBeanContext: Shares beans between different plugins.
Setup Interaction
Wait for setup completion before initializing database-heavy operations.
Event Handler Example:
kotlin
@EventListener
class SetupEventHandler(private val plugin: YourPlugin): SetupEventListener {
override suspend fun onSetupFinished() {
if (plugin.pluginState == PluginState.STARTED) {
plugin.startPlugin()
}
}
}Main Plugin Class Methods:
kotlin
override suspend fun onStart() {
if (!setupManager.isSetupDone()) {
return // Wait for SetupEventHandler
}
startPlugin()
}
override suspend fun onUninstall() {
pluginDatabaseManager.uninstall(this)
}🗄️ Database & Models
- Package Structure:
db/daos/,db/impl/,db/models/,db/migrations/. - Annotations:
@DBEntity(models),@Migration(versioned changes),@Dao(implementations). - Naming Convention: Keep DAO and Model names similar (e.g.,
AnnouncementModelandAnnouncementDao). - Implementation: Extend abstract Dao classes and provide the model class. Ensure
uninstalllogic is implemented.
🛣️ API & Routing
- Location:
routes/package. - Types:
PanelApi(admin),LoggedInApi(authenticated users). - Validation:
- Validation handlers are mandatory.
- Use path variables like
:id. - Specify
required bodyfor schema-based objects.
- Permissions: Use
authProviderfromapplicationContext. - Activity Logs: All Panel APIs must define activity logs.
- Error Handling: Prefer built-in errors (
com.panomc.platform.error). Define custom errors inerror/by extendingcom.panomc.platform.model.Error.
🔐 Permissions & Configuration
- Permissions: Define in
permission/package, extendingPanelPermissionwith@PermissionDefinition.- Icon: Provide a FontAwesome icon name to the
PanelPermissionconstructor (e.g.,PanelPermission("fa-question-circle")). - Node: The permission node ID is automatically generated from the class name (e.g.,
ManageFAQPermission->MANAGE_FAQ).
- Icon: Provide a FontAwesome icon name to the
Permission Definition Example:
kotlin
@PermissionDefinition
class ManageFAQPermission : PanelPermission("fa-question-circle")java
@PermissionDefinition
public class ManageFAQPermission extends PanelPermission {
public ManageFAQPermission() {
super("fa-question-circle");
}
}- Config: Use
PluginConfigManager.- Keep general settings in Config classes.
- Enum First: Use Enums instead of static strings for type safety.