D
Engineering

settings

Koleksi settings — setting store, CS distribution (GlobalAssignation), dan pixel. Dipakai CS rotator untuk menentukan strategi assignment.

Koleksi settings menyimpan konfigurasi per store — termasuk CS distribution (GlobalAssignation) yang dipakai rotator, dan pixel tracking.

Model

models/mongo_settings.go:17 — SettingsStruct:

FieldBSON keyTipeCatatan
IDidstringPrimary key
StoreIdstore_idstringTenant scope
GlobalAssignationglobalAssignationGlobalAssignationStructKonfigurasi CS rotator
PixelpixelSettingPixelStructAccess token pixel

Sub-struct: GlobalAssignationStruct

mongo_settings.go:5:

FieldBSON keyTipeCatatan
RolerolestringRole default CS
Teamteam[]stringDaftar CS ID yang eligible
Distributiondistribution[]DistributionBobot per CS (untuk percentage)
TypeDistributiontype_distributionstring"percentage" atau lainnya → selectBySame

Sub-struct: Distribution

mongo_product.go:20:

FieldBSON keyTipeCatatan
Name—stringNama CS
ID—stringCS ID (match dengan Team entry)
Total—intBobot

Sub-struct: SettingPixelStruct

mongo_settings.go:12:

FieldBSON keyTipe
AccessTokenaccess_tokenstring

Cara akses di handler

CS rotator

internal/service/chat_service.go:83-84:

go
col := mongo.MongoClient.Database(config.Env.DbName).Collection("settings")
var settings models.SettingsStruct
err := col.FindOne(ctx, bson.M{"store_id": storeID}).Decode(&settings)

Strategi rotator

TypeDistribution menentukan strategi (lihat CS Rotator):

TypeDistributionStrategiFungsi
"percentage"WeightedselectByPercentage (chat_service.go:190)
(lainnya)Least-loadedselectBySame (chat_service.go:167)

Percentage — contoh

json
{
  "globalAssignation": {
    "role": "Customer service",
    "team": ["cs-001", "cs-002", "cs-003"],
    "distribution": [
      {"name": "CS Andi", "id": "cs-001", "total": 50},
      {"name": "CS Budi", "id": "cs-002", "total": 30},
      {"name": "CS Citra", "id": "cs-003", "total": 20}
    ],
    "type_distribution": "percentage"
  }
}
  • Total bobot: 100
  • CS Andi dapat alokasi 50%, Budi 30%, Citra 20%
  • Rotator pilih CS dengan rasio activeCount / normalizedWeight terendah

Least-loaded — contoh

json
{
  "globalAssignation": {
    "role": "Customer service",
    "team": ["cs-001", "cs-002", "cs-003"],
    "distribution": [],
    "type_distribution": "same"
  }
}
  • Distribution boleh kosong (tidak dipakai)
  • Rotator pilih CS dengan activeCount paling sedikit

Catatan

  • Hanya satu dokumen settings per store (query by store_id, FindOne)
  • Distribution bisa kosong untuk strategi least-loaded
  • Jika Team kosong → ErrEmptyTeam (chat_service.go:28)
  • Jika TypeDistribution="percentage" tapi totalBobot=0 → fall back ke selectBySame (bukan error)

Kembali ke