Hello from MCP server

List Files | Just Commands | Repo | Logs

← back |
package main

import (
	"encoding/json"
	"github.com/pocketbase/pocketbase"
	"github.com/pocketbase/pocketbase/core"
)

func registerHookNewOrg(app *pocketbase.PocketBase) {
	app.OnRecordAfterCreateSuccess("organizations").BindFunc(func(e *core.RecordEvent) error {
		defaultRoles := []string{"admin", "author", "tech", "support"}
		collection, err := app.FindCollectionByNameOrId("roles")

		if err != nil {
			return err
		}

		record, err := app.FindRecordById("organizations", e.Record.Id)
		if err != nil {
			return err
		}

		record.Set("org", e.Record.Id)

		// Set default variables for pricing calculations (values in XAG - base currency)
		defaultVariables := map[string]float64{
			"hourlyFee":      5.262, // Default hourly rate in XAG
			"saDiscount":     1.5,   // Service agreement multiplier
			"serviceCallFee": 2.0,   // Service call fee in XAG
			"salesTax":       1.08,  // Sales tax multiplier (8%)
		}
		variablesJson, _ := json.Marshal(defaultVariables)
		record.Set("variables", string(variablesJson))

		err = app.Save(record)

		if err != nil {
			return err
		}

		roleIds := make(map[string]string)

		for _, role := range defaultRoles {
			roleRecord := core.NewRecord(collection)
			roleRecord.Set("org", e.Record.Id)
			roleRecord.Set("name", role)

			if err := app.Save(roleRecord); err != nil {
				return err
			}
			roleIds[role] = roleRecord.Id
		}
		resources, err := app.FindAllRecords("resources")
		if err != nil {
			return err
		}

		actions, err := app.FindAllRecords("permissionActions")
		if err != nil {
			return err
		}

		allow, err := app.FindFirstRecordByData("permissionTypes", "name", "allow")
		if err != nil {
			return err
		}

		permissions, err := app.FindCollectionByNameOrId("permissions")
		if err != nil {
			return err
		}

		defaultPermissions := map[string]map[string][]string{
			"support": {
				"list": []string{"profiles"},
				"view": []string{"profiles", "organizations"},
			},

			"tech": {
				"create": []string{"serviceCalls"},
				"list":   []string{"books", "menus", "offers", "profiles", "pricebookChanges", "serviceCalls"},
				"view":   []string{"books", "menus", "offers", "profiles", "organizations", "pricebookChanges", "serviceCalls"},
				"update": []string{"serviceCalls"},
			},
			"author": {
				"create": []string{"books", "menus", "offers", "pricebookChanges", "serviceCalls"},
				"list":   []string{"books", "menus", "offers", "profiles", "pricebookChanges", "serviceCalls"},
				"view":   []string{"books", "menus", "offers", "organizations", "pricebookChanges", "serviceCalls"},
				"update": []string{"serviceCalls"},
			},
		}

		for _, role := range defaultRoles {
			for _, action := range actions {
				for _, resource := range resources {
					resourcesAllowed := defaultPermissions[role][action.GetString("name")]
					for _, r := range resourcesAllowed {
						if r == resource.GetString("name") {
							record := core.NewRecord(permissions)
							record.Set("org", e.Record.Id)
							record.Set("role", roleIds[role])
							record.Set("resource", resource.Id)
							record.Set("action", action.Id)
							record.Set("type", allow.Id)
							err := app.Save(record)
							if err != nil {
								return err
							}
						}
					}
				}
			}
		}

		profiles, err := app.FindCollectionByNameOrId("profiles")
		if err != nil {
			return err
		}

		userId := e.Record.GetString("owner")

		profile := core.NewRecord(profiles)
		profile.Set("org", e.Record.Id)
		profile.Set("user", userId)
		profile.Set("roles", []string{roleIds["admin"]})
		err = app.Save(profile)

		if err != nil {
			return err
		}

		user, err := app.FindRecordById("users", userId)
		if err != nil {
			return err
		}

		user.Set("activeOrg", e.Record.Id)
		err = app.Save(user)

		if err != nil {
			return err
		}

		return e.Next()
	})

}