tracks.go 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024
  1. package analytics
  2. import (
  3. "github.com/porter-dev/porter/api/types"
  4. segment "gopkg.in/segmentio/analytics-go.v3"
  5. )
  6. type segmentTrack interface {
  7. getUserId() string
  8. getEvent() SegmentEvent
  9. getProperties() segment.Properties
  10. }
  11. type defaultTrackOpts struct {
  12. AdditionalProps map[string]interface{}
  13. }
  14. type defaultSegmentTrack struct {
  15. event SegmentEvent
  16. properties segmentProperties
  17. }
  18. func getDefaultSegmentTrack(additionalProps map[string]interface{}, event SegmentEvent) *defaultSegmentTrack {
  19. props := newSegmentProperties()
  20. props.addAdditionalProperties(additionalProps)
  21. return &defaultSegmentTrack{
  22. event: event,
  23. properties: props,
  24. }
  25. }
  26. func (t *defaultSegmentTrack) getEvent() SegmentEvent {
  27. return t.event
  28. }
  29. func (t *defaultSegmentTrack) getProperties() segment.Properties {
  30. props := segment.NewProperties()
  31. for key, val := range t.properties {
  32. props = props.Set(key, val)
  33. }
  34. return props
  35. }
  36. type segmentProperties map[string]interface{}
  37. func newSegmentProperties() segmentProperties {
  38. props := make(map[string]interface{})
  39. return props
  40. }
  41. func (p segmentProperties) addProjectProperties(opts *ProjectScopedTrackOpts) {
  42. p["proj_id"] = opts.ProjectID
  43. }
  44. func (p segmentProperties) addClusterProperties(opts *ClusterScopedTrackOpts) {
  45. p["cluster_id"] = opts.ClusterID
  46. }
  47. func (p segmentProperties) addRegistryProperties(opts *RegistryScopedTrackOpts) {
  48. p["registry_id"] = opts.RegistryID
  49. }
  50. func (p segmentProperties) addApplicationProperties(opts *ApplicationScopedTrackOpts) {
  51. p["app_name"] = opts.Name
  52. p["app_namespace"] = opts.Namespace
  53. p["chart_name"] = opts.ChartName
  54. }
  55. func (p segmentProperties) addAdditionalProperties(props map[string]interface{}) {
  56. for key, val := range props {
  57. p[key] = val
  58. }
  59. }
  60. // UserCreateTrackOpts are the options for creating a track when a user is created
  61. type UserCreateTrackOpts struct {
  62. *UserScopedTrackOpts
  63. Email string
  64. FirstName string
  65. LastName string
  66. CompanyName string
  67. ReferralMethod string
  68. }
  69. // UserCreateTrack returns a track for when a user is created
  70. func UserCreateTrack(opts *UserCreateTrackOpts) segmentTrack {
  71. additionalProps := make(map[string]interface{})
  72. additionalProps["email"] = opts.Email
  73. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  74. additionalProps["company"] = opts.CompanyName
  75. additionalProps["referral_method"] = opts.ReferralMethod
  76. return getSegmentUserTrack(
  77. opts.UserScopedTrackOpts,
  78. getDefaultSegmentTrack(additionalProps, UserCreate),
  79. )
  80. }
  81. // UserCreateTrackOpts are the options for creating a track when a user's email is verified
  82. type UserVerifyEmailTrackOpts struct {
  83. *UserScopedTrackOpts
  84. Email string
  85. }
  86. // UserVerifyEmailTrack returns a track for when a user's email is verified
  87. func UserVerifyEmailTrack(opts *UserVerifyEmailTrackOpts) segmentTrack {
  88. additionalProps := make(map[string]interface{})
  89. additionalProps["email"] = opts.Email
  90. return getSegmentUserTrack(
  91. opts.UserScopedTrackOpts,
  92. getDefaultSegmentTrack(additionalProps, UserVerifyEmail),
  93. )
  94. }
  95. // ProjectCreateDeleteTrackOpts are the options for creating a track when a project is created or deleted
  96. type ProjectCreateDeleteTrackOpts struct {
  97. *ProjectScopedTrackOpts
  98. Email string
  99. FirstName string
  100. LastName string
  101. CompanyName string
  102. }
  103. // ProjectCreateTrack returns a track for when a project is created
  104. func ProjectCreateTrack(opts *ProjectCreateDeleteTrackOpts) segmentTrack {
  105. additionalProps := make(map[string]interface{})
  106. additionalProps["email"] = opts.Email
  107. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  108. additionalProps["company"] = opts.CompanyName
  109. return getSegmentProjectTrack(
  110. opts.ProjectScopedTrackOpts,
  111. getDefaultSegmentTrack(additionalProps, ProjectCreate),
  112. )
  113. }
  114. // ProjectDeleteTrack returns a track for when a project is deleted
  115. func ProjectDeleteTrack(opts *ProjectCreateDeleteTrackOpts) segmentTrack {
  116. additionalProps := make(map[string]interface{})
  117. additionalProps["email"] = opts.Email
  118. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  119. additionalProps["company"] = opts.CompanyName
  120. return getSegmentProjectTrack(
  121. opts.ProjectScopedTrackOpts,
  122. getDefaultSegmentTrack(additionalProps, ProjectDelete),
  123. )
  124. }
  125. // ClusterDeleteTrackOpts are the options for creating a track when a cluster is deleted
  126. type ClusterDeleteTrackOpts struct {
  127. *ProjectScopedTrackOpts
  128. Email string
  129. FirstName string
  130. LastName string
  131. CompanyName string
  132. }
  133. // ClusterDeleteTrack returns a track for when a cluster is deleted
  134. func ClusterDeleteTrack(opts *ClusterDeleteTrackOpts) segmentTrack {
  135. additionalProps := make(map[string]interface{})
  136. additionalProps["email"] = opts.Email
  137. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  138. additionalProps["company"] = opts.CompanyName
  139. return getSegmentProjectTrack(
  140. opts.ProjectScopedTrackOpts,
  141. getDefaultSegmentTrack(additionalProps, ClusterDelete),
  142. )
  143. }
  144. // CostConsentOpenedTrackOpts are the options for creating a track when a user opens the cost consent
  145. type CostConsentOpenedTrackOpts struct {
  146. *UserScopedTrackOpts
  147. Provider string
  148. Email string
  149. FirstName string
  150. LastName string
  151. CompanyName string
  152. }
  153. // CostConsentCompletedTrack returns a track for when a user completes the cost consent
  154. func CostConsentOpenedTrack(opts *CostConsentOpenedTrackOpts) segmentTrack {
  155. additionalProps := make(map[string]interface{})
  156. additionalProps["provider"] = opts.Provider
  157. additionalProps["email"] = opts.Email
  158. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  159. additionalProps["company"] = opts.CompanyName
  160. return getSegmentUserTrack(
  161. opts.UserScopedTrackOpts,
  162. getDefaultSegmentTrack(additionalProps, CostConsentOpened),
  163. )
  164. }
  165. // CostConsentCompletedTrackOpts are the options for creating a track when a user completes the cost consent
  166. type CostConsentCompletedTrackOpts struct {
  167. *UserScopedTrackOpts
  168. Provider string
  169. Email string
  170. FirstName string
  171. LastName string
  172. CompanyName string
  173. }
  174. // CostConsentCompletedTrack returns a track for when a user completes the cost consent
  175. func CostConsentCompletedTrack(opts *CostConsentCompletedTrackOpts) segmentTrack {
  176. additionalProps := make(map[string]interface{})
  177. additionalProps["provider"] = opts.Provider
  178. additionalProps["email"] = opts.Email
  179. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  180. additionalProps["company"] = opts.CompanyName
  181. return getSegmentUserTrack(
  182. opts.UserScopedTrackOpts,
  183. getDefaultSegmentTrack(additionalProps, CostConsentComplete),
  184. )
  185. }
  186. // AWSInputTrackOpts are the options for creating a track when a user inputs a complete AWS account ID
  187. type AWSInputTrackOpts struct {
  188. *ProjectScopedTrackOpts
  189. Email string
  190. FirstName string
  191. LastName string
  192. CompanyName string
  193. AccountId string
  194. }
  195. // AWSInputTrack returns a track for when a user inputs a complete AWS account ID
  196. func AWSInputTrack(opts *AWSInputTrackOpts) segmentTrack {
  197. additionalProps := make(map[string]interface{})
  198. additionalProps["email"] = opts.Email
  199. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  200. additionalProps["company"] = opts.CompanyName
  201. additionalProps["account_id"] = opts.AccountId
  202. return getSegmentProjectTrack(
  203. opts.ProjectScopedTrackOpts,
  204. getDefaultSegmentTrack(additionalProps, AWSInputted),
  205. )
  206. }
  207. type AWSRedirectOpts struct {
  208. *ProjectScopedTrackOpts
  209. Email string
  210. FirstName string
  211. LastName string
  212. CompanyName string
  213. AccountId string
  214. CloudformationURL string
  215. LoginURL string
  216. ExternalId string
  217. }
  218. // AWSCloudformationRedirectSuccess returns a track for when a user clicks 'grant permissions' and gets redirected to cloudformation
  219. func AWSCloudformationRedirectSuccess(opts *AWSRedirectOpts) segmentTrack {
  220. additionalProps := make(map[string]interface{})
  221. additionalProps["email"] = opts.Email
  222. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  223. additionalProps["company"] = opts.CompanyName
  224. additionalProps["account_id"] = opts.AccountId
  225. additionalProps["cloudformation_url"] = opts.CloudformationURL
  226. additionalProps["external_id"] = opts.ExternalId
  227. return getSegmentProjectTrack(
  228. opts.ProjectScopedTrackOpts,
  229. getDefaultSegmentTrack(additionalProps, AWSCloudformationRedirect),
  230. )
  231. }
  232. // AWSLoginRedirectSuccess returns a track for when a user is prompted to login to AWS
  233. func AWSLoginRedirectSuccess(opts *AWSRedirectOpts) segmentTrack {
  234. additionalProps := make(map[string]interface{})
  235. additionalProps["email"] = opts.Email
  236. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  237. additionalProps["company"] = opts.CompanyName
  238. additionalProps["account_id"] = opts.AccountId
  239. additionalProps["login_url"] = opts.LoginURL
  240. return getSegmentProjectTrack(
  241. opts.ProjectScopedTrackOpts,
  242. getDefaultSegmentTrack(additionalProps, AWSLoginRedirect),
  243. )
  244. }
  245. type AWSCreateIntegrationOpts struct {
  246. *ProjectScopedTrackOpts
  247. Email string
  248. FirstName string
  249. LastName string
  250. CompanyName string
  251. AccountId string
  252. ExternalId string
  253. ErrorMessage string
  254. }
  255. // AWSCreateIntegrationSucceeded returns a track for when a user succeeds in creating an aws integration
  256. func AWSCreateIntegrationSucceeded(opts *AWSCreateIntegrationOpts) segmentTrack {
  257. additionalProps := make(map[string]interface{})
  258. additionalProps["email"] = opts.Email
  259. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  260. additionalProps["company"] = opts.CompanyName
  261. additionalProps["account_id"] = opts.AccountId
  262. return getSegmentProjectTrack(
  263. opts.ProjectScopedTrackOpts,
  264. getDefaultSegmentTrack(additionalProps, AWSCreateIntegrationSuccess),
  265. )
  266. }
  267. // AWSCreateIntegrationSucceeded returns a track for when a user succeeds in creating an aws integration
  268. func AWSCreateIntegrationFailed(opts *AWSCreateIntegrationOpts) segmentTrack {
  269. additionalProps := make(map[string]interface{})
  270. additionalProps["email"] = opts.Email
  271. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  272. additionalProps["company"] = opts.CompanyName
  273. additionalProps["account_id"] = opts.AccountId
  274. additionalProps["error_message"] = opts.ErrorMessage
  275. additionalProps["external_id"] = opts.ExternalId
  276. return getSegmentProjectTrack(
  277. opts.ProjectScopedTrackOpts,
  278. getDefaultSegmentTrack(additionalProps, AWSCreateIntegrationFailure),
  279. )
  280. }
  281. // CredentialStepTrackOpts are the options for creating a track when a user completes the credential step
  282. type CredentialStepTrackOpts struct {
  283. *UserScopedTrackOpts
  284. }
  285. // CredentialStepTrack returns a track for when a user completes the credential step
  286. func CredentialStepTrack(opts *CredentialStepTrackOpts) segmentTrack {
  287. additionalProps := make(map[string]interface{})
  288. return getSegmentUserTrack(
  289. opts.UserScopedTrackOpts,
  290. getDefaultSegmentTrack(additionalProps, CredentialStepComplete),
  291. )
  292. }
  293. // PreProvisionCheckTrackOpts are the options for creating a track when a user checks if they can provision
  294. type PreProvisionCheckTrackOpts struct {
  295. *ProjectScopedTrackOpts
  296. Email string
  297. FirstName string
  298. LastName string
  299. CompanyName string
  300. }
  301. // PreProvisionCheckTrack returns a track for when a user attempts provisioning
  302. func PreProvisionCheckTrack(opts *PreProvisionCheckTrackOpts) segmentTrack {
  303. additionalProps := make(map[string]interface{})
  304. additionalProps["email"] = opts.Email
  305. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  306. additionalProps["company"] = opts.CompanyName
  307. return getSegmentProjectTrack(
  308. opts.ProjectScopedTrackOpts,
  309. getDefaultSegmentTrack(additionalProps, PreProvisionCheck),
  310. )
  311. }
  312. // ProvisioningAttemptedTrackOpts are the options for creating a track when a user attempts provisioning
  313. type ProvisioningAttemptTrackOpts struct {
  314. *ProjectScopedTrackOpts
  315. Email string
  316. FirstName string
  317. LastName string
  318. CompanyName string
  319. ErrorMessage string
  320. Region string
  321. Provider string
  322. }
  323. // ProvisioningAttemptTrack returns a track for when a user attempts provisioning
  324. func ProvisioningAttemptTrack(opts *ProvisioningAttemptTrackOpts) segmentTrack {
  325. additionalProps := make(map[string]interface{})
  326. additionalProps["email"] = opts.Email
  327. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  328. additionalProps["company"] = opts.CompanyName
  329. additionalProps["region"] = opts.Region
  330. additionalProps["provider"] = opts.Provider
  331. return getSegmentProjectTrack(
  332. opts.ProjectScopedTrackOpts,
  333. getDefaultSegmentTrack(additionalProps, ProvisioningAttempted),
  334. )
  335. }
  336. // QuotaIncreaseAttemptTrack returns a track for when a user attempts provisioning
  337. func QuotaIncreaseAttemptTrack(opts *ProvisioningAttemptTrackOpts) segmentTrack {
  338. additionalProps := make(map[string]interface{})
  339. additionalProps["email"] = opts.Email
  340. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  341. additionalProps["company"] = opts.CompanyName
  342. additionalProps["region"] = opts.Region
  343. additionalProps["provider"] = opts.Provider
  344. return getSegmentProjectTrack(
  345. opts.ProjectScopedTrackOpts,
  346. getDefaultSegmentTrack(additionalProps, QuotaIncreaseRequested),
  347. )
  348. }
  349. // PreProvisionCheckTrack returns a track for when a user attempts provisioning
  350. func ProvisionFailureTrack(opts *ProvisioningAttemptTrackOpts) segmentTrack {
  351. additionalProps := make(map[string]interface{})
  352. additionalProps["email"] = opts.Email
  353. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  354. additionalProps["company"] = opts.CompanyName
  355. additionalProps["error_message"] = opts.ErrorMessage
  356. additionalProps["region"] = opts.Region
  357. return getSegmentProjectTrack(
  358. opts.ProjectScopedTrackOpts,
  359. getDefaultSegmentTrack(additionalProps, ProvisioningFailure),
  360. )
  361. }
  362. // ClusterProvisioningStartTrackOpts are the options for creating a track when a cluster
  363. // has started provisioning
  364. type ClusterProvisioningStartTrackOpts struct {
  365. // note that this is a project-scoped track, since the cluster has not been created yet
  366. *ProjectScopedTrackOpts
  367. ClusterType types.InfraKind
  368. InfraID uint
  369. }
  370. // ClusterProvisioningStartTrack returns a track for when a cluster
  371. // has started provisioning
  372. func ClusterProvisioningStartTrack(opts *ClusterProvisioningStartTrackOpts) segmentTrack {
  373. additionalProps := make(map[string]interface{})
  374. additionalProps["cluster_type"] = opts.ClusterType
  375. additionalProps["infra_id"] = opts.InfraID
  376. return getSegmentProjectTrack(
  377. opts.ProjectScopedTrackOpts,
  378. getDefaultSegmentTrack(additionalProps, ClusterProvisioningStart),
  379. )
  380. }
  381. // ClusterProvisioningErrorTrackOpts are the options for creating a track when a cluster
  382. // has experienced a provisioning error
  383. type ClusterProvisioningErrorTrackOpts struct {
  384. // note that this is a project-scoped track, since the cluster has not been created yet
  385. *ProjectScopedTrackOpts
  386. ClusterType types.InfraKind
  387. InfraID uint
  388. }
  389. // ClusterProvisioningErrorTrack returns a track for when a cluster
  390. // has experienced a provisioning error
  391. func ClusterProvisioningErrorTrack(opts *ClusterProvisioningErrorTrackOpts) segmentTrack {
  392. additionalProps := make(map[string]interface{})
  393. additionalProps["cluster_type"] = opts.ClusterType
  394. additionalProps["infra_id"] = opts.InfraID
  395. return getSegmentProjectTrack(
  396. opts.ProjectScopedTrackOpts,
  397. getDefaultSegmentTrack(additionalProps, ClusterProvisioningError),
  398. )
  399. }
  400. // ClusterProvisioningSuccessTrackOpts are the options for creating a track when a cluster
  401. // has successfully provisioned
  402. type ClusterProvisioningSuccessTrackOpts struct {
  403. *ClusterScopedTrackOpts
  404. ClusterType types.InfraKind
  405. InfraID uint
  406. }
  407. // ClusterProvisioningSuccessTrack returns a new track for when a cluster
  408. // has successfully provisioned
  409. func ClusterProvisioningSuccessTrack(opts *ClusterProvisioningSuccessTrackOpts) segmentTrack {
  410. additionalProps := make(map[string]interface{})
  411. additionalProps["cluster_type"] = opts.ClusterType
  412. additionalProps["infra_id"] = opts.InfraID
  413. return getSegmentClusterTrack(
  414. opts.ClusterScopedTrackOpts,
  415. getDefaultSegmentTrack(additionalProps, ClusterProvisioningSuccess),
  416. )
  417. }
  418. // ClusterConnectionStartTrackOpts are the options for creating a track when a cluster
  419. // connection has started
  420. type ClusterConnectionStartTrackOpts struct {
  421. // note that this is a project-scoped track, since the cluster has not been created yet
  422. *ProjectScopedTrackOpts
  423. ClusterCandidateID uint
  424. }
  425. // ClusterConnectionStartTrack returns a new track for when a cluster
  426. // connection has started
  427. func ClusterConnectionStartTrack(opts *ClusterConnectionStartTrackOpts) segmentTrack {
  428. additionalProps := make(map[string]interface{})
  429. additionalProps["cc_id"] = opts.ClusterCandidateID
  430. return getSegmentProjectTrack(
  431. opts.ProjectScopedTrackOpts,
  432. getDefaultSegmentTrack(additionalProps, ClusterConnectionStart),
  433. )
  434. }
  435. // ClusterConnectionSuccessTrackOpts are the options for creating a track when a cluster
  436. // connection has finished
  437. type ClusterConnectionSuccessTrackOpts struct {
  438. *ClusterScopedTrackOpts
  439. ClusterCandidateID uint
  440. }
  441. // ClusterConnectionSuccessTrack returns a new track for when a cluster
  442. // connection has finished
  443. func ClusterConnectionSuccessTrack(opts *ClusterConnectionSuccessTrackOpts) segmentTrack {
  444. additionalProps := make(map[string]interface{})
  445. additionalProps["cc_id"] = opts.ClusterCandidateID
  446. return getSegmentClusterTrack(
  447. opts.ClusterScopedTrackOpts,
  448. getDefaultSegmentTrack(additionalProps, ClusterConnectionSuccess),
  449. )
  450. }
  451. // RegistryConnectionStartTrackOpts are the options for creating a track when a registry
  452. // connection has started
  453. type RegistryConnectionStartTrackOpts struct {
  454. // note that this is a project-scoped track, since the cluster has not been created yet
  455. *ProjectScopedTrackOpts
  456. // a random id assigned to this connection request
  457. FlowID string
  458. }
  459. // RegistryConnectionStartTrack returns a new track for when a registry
  460. // connection has started
  461. func RegistryConnectionStartTrack(opts *RegistryConnectionStartTrackOpts) segmentTrack {
  462. additionalProps := make(map[string]interface{})
  463. additionalProps["flow_id"] = opts.FlowID
  464. return getSegmentProjectTrack(
  465. opts.ProjectScopedTrackOpts,
  466. getDefaultSegmentTrack(additionalProps, RegistryConnectionStart),
  467. )
  468. }
  469. // RegistryConnectionSuccessTrackOpts are the options for creating a track when a registry
  470. // connection has completed
  471. type RegistryConnectionSuccessTrackOpts struct {
  472. *RegistryScopedTrackOpts
  473. // a random id assigned to this connection request
  474. FlowID string
  475. }
  476. // RegistryConnectionSuccessTrack returns a new track for when a registry
  477. // connection has completed
  478. func RegistryConnectionSuccessTrack(opts *RegistryConnectionSuccessTrackOpts) segmentTrack {
  479. additionalProps := make(map[string]interface{})
  480. additionalProps["flow_id"] = opts.FlowID
  481. return getSegmentRegistryTrack(
  482. opts.RegistryScopedTrackOpts,
  483. getDefaultSegmentTrack(additionalProps, RegistryConnectionSuccess),
  484. )
  485. }
  486. // GithubConnectionStartTrackOpts are the options for creating a track when a github account
  487. // connection has started
  488. type GithubConnectionStartTrackOpts struct {
  489. // note that this is a user-scoped track, since github repos are tied to the user
  490. *UserScopedTrackOpts
  491. }
  492. // GithubConnectionStartTrack returns a new track for when a github account
  493. // connection has started
  494. func GithubConnectionStartTrack(opts *GithubConnectionStartTrackOpts) segmentTrack {
  495. additionalProps := make(map[string]interface{})
  496. return getSegmentUserTrack(
  497. opts.UserScopedTrackOpts,
  498. getDefaultSegmentTrack(additionalProps, GithubConnectionStart),
  499. )
  500. }
  501. // GithubConnectionSuccessTrackOpts are the options for creating a track when a github account
  502. // connection has completed
  503. type GithubConnectionSuccessTrackOpts struct {
  504. // note that this is a user-scoped track, since github repos are tied to the user
  505. *UserScopedTrackOpts
  506. }
  507. // GithubConnectionSuccessTrack returns a new track when a github account
  508. // connection has completed
  509. func GithubConnectionSuccessTrack(opts *GithubConnectionSuccessTrackOpts) segmentTrack {
  510. additionalProps := make(map[string]interface{})
  511. return getSegmentUserTrack(
  512. opts.UserScopedTrackOpts,
  513. getDefaultSegmentTrack(additionalProps, GithubConnectionSuccess),
  514. )
  515. }
  516. // ApplicationLaunchStartTrackOpts are the options for creating a track when an application
  517. // launch has started
  518. type ApplicationLaunchStartTrackOpts struct {
  519. *ClusterScopedTrackOpts
  520. FlowID string
  521. }
  522. // ApplicationLaunchStartTrack returns a new track for when an application
  523. // launch has started
  524. func ApplicationLaunchStartTrack(opts *ApplicationLaunchStartTrackOpts) segmentTrack {
  525. additionalProps := make(map[string]interface{})
  526. additionalProps["flow_id"] = opts.FlowID
  527. return getSegmentClusterTrack(
  528. opts.ClusterScopedTrackOpts,
  529. getDefaultSegmentTrack(additionalProps, ApplicationLaunchStart),
  530. )
  531. }
  532. // ApplicationLaunchSuccessTrackOpts are the options for creating a track when an application
  533. // launch has completed
  534. type ApplicationLaunchSuccessTrackOpts struct {
  535. *ApplicationScopedTrackOpts
  536. FlowID string
  537. }
  538. // ApplicationLaunchSuccessTrack returns a new track for when an application
  539. // launch has completed
  540. func ApplicationLaunchSuccessTrack(opts *ApplicationLaunchSuccessTrackOpts) segmentTrack {
  541. additionalProps := make(map[string]interface{})
  542. additionalProps["flow_id"] = opts.FlowID
  543. return getSegmentApplicationTrack(
  544. opts.ApplicationScopedTrackOpts,
  545. getDefaultSegmentTrack(additionalProps, ApplicationLaunchSuccess),
  546. )
  547. }
  548. // ApplicationDeploymentWebhookTrackOpts are the options for creating a track when an application
  549. // launch has completed from a webhook
  550. type ApplicationDeploymentWebhookTrackOpts struct {
  551. *ApplicationScopedTrackOpts
  552. ImageURI string
  553. }
  554. // ApplicationDeploymentWebhookTrack returns a new track for when an application
  555. // launch has completed from a webhook
  556. func ApplicationDeploymentWebhookTrack(opts *ApplicationDeploymentWebhookTrackOpts) segmentTrack {
  557. additionalProps := make(map[string]interface{})
  558. additionalProps["image_uri"] = opts.ImageURI
  559. return getSegmentApplicationTrack(
  560. opts.ApplicationScopedTrackOpts,
  561. getDefaultSegmentTrack(additionalProps, ApplicationDeploymentWebhook),
  562. )
  563. }
  564. // RegistryProvisioningStartTrackOpts are the options for creating a track when a registry
  565. // provisioning has started
  566. type RegistryProvisioningStartTrackOpts struct {
  567. // note that this is a project-scoped track, since the registry has not been created yet
  568. *ProjectScopedTrackOpts
  569. RegistryType types.InfraKind
  570. InfraID uint
  571. }
  572. // RegistryProvisioningStartTrack returns a new track for when a registry
  573. // provisioning has started
  574. func RegistryProvisioningStartTrack(opts *RegistryProvisioningStartTrackOpts) segmentTrack {
  575. additionalProps := make(map[string]interface{})
  576. additionalProps["registry_type"] = opts.RegistryType
  577. additionalProps["infra_id"] = opts.InfraID
  578. return getSegmentProjectTrack(
  579. opts.ProjectScopedTrackOpts,
  580. getDefaultSegmentTrack(additionalProps, RegistryProvisioningStart),
  581. )
  582. }
  583. // RegistryProvisioningErrorTrackOpts are the options for creating a track when a registry
  584. // provisioning has failed
  585. type RegistryProvisioningErrorTrackOpts struct {
  586. // note that this is a project-scoped track, since the registry has not been created yet
  587. *ProjectScopedTrackOpts
  588. RegistryType types.InfraKind
  589. InfraID uint
  590. }
  591. // RegistryProvisioningErrorTrack returns a new track for when a registry
  592. // provisioning has failed
  593. func RegistryProvisioningErrorTrack(opts *RegistryProvisioningErrorTrackOpts) segmentTrack {
  594. additionalProps := make(map[string]interface{})
  595. additionalProps["registry_type"] = opts.RegistryType
  596. additionalProps["infra_id"] = opts.InfraID
  597. return getSegmentProjectTrack(
  598. opts.ProjectScopedTrackOpts,
  599. getDefaultSegmentTrack(additionalProps, RegistryProvisioningError),
  600. )
  601. }
  602. // RegistryProvisioningSuccessTrackOpts are the options for creating a track when a registry
  603. // provisioning has completed
  604. type RegistryProvisioningSuccessTrackOpts struct {
  605. *RegistryScopedTrackOpts
  606. RegistryType types.InfraKind
  607. InfraID uint
  608. }
  609. // RegistryProvisioningSuccessTrack returns a new track for when a registry
  610. // provisioning has completed
  611. func RegistryProvisioningSuccessTrack(opts *RegistryProvisioningSuccessTrackOpts) segmentTrack {
  612. additionalProps := make(map[string]interface{})
  613. additionalProps["registry_type"] = opts.RegistryType
  614. additionalProps["infra_id"] = opts.InfraID
  615. return getSegmentRegistryTrack(
  616. opts.RegistryScopedTrackOpts,
  617. getDefaultSegmentTrack(additionalProps, RegistryProvisioningSuccess),
  618. )
  619. }
  620. // ClusterDestroyingStartTrackOpts are the options for creating a track when a cluster
  621. // has started destroying
  622. type ClusterDestroyingStartTrackOpts struct {
  623. *ClusterScopedTrackOpts
  624. ClusterType types.InfraKind
  625. InfraID uint
  626. }
  627. // ClusterDestroyingStartTrack returns a track for when a cluster
  628. // has started destroying
  629. func ClusterDestroyingStartTrack(opts *ClusterDestroyingStartTrackOpts) segmentTrack {
  630. additionalProps := make(map[string]interface{})
  631. additionalProps["cluster_type"] = opts.ClusterType
  632. additionalProps["infra_id"] = opts.InfraID
  633. return getSegmentClusterTrack(
  634. opts.ClusterScopedTrackOpts,
  635. getDefaultSegmentTrack(additionalProps, ClusterDestroyingStart),
  636. )
  637. }
  638. // ClusterDestroyingSuccessTrackOpts are the options for creating a track when a cluster
  639. // has successfully provisioned
  640. type ClusterDestroyingSuccessTrackOpts struct {
  641. *ClusterScopedTrackOpts
  642. ClusterType types.InfraKind
  643. InfraID uint
  644. }
  645. // ClusterDestroyingSuccessTrack returns a new track for when a cluster
  646. // has successfully provisioned
  647. func ClusterDestroyingSuccessTrack(opts *ClusterDestroyingSuccessTrackOpts) segmentTrack {
  648. additionalProps := make(map[string]interface{})
  649. additionalProps["cluster_type"] = opts.ClusterType
  650. additionalProps["infra_id"] = opts.InfraID
  651. return getSegmentClusterTrack(
  652. opts.ClusterScopedTrackOpts,
  653. getDefaultSegmentTrack(additionalProps, ClusterDestroyingSuccess),
  654. )
  655. }
  656. // StackLaunchStartOpts are the options for creating a track when a user starts creating a stack
  657. type StackLaunchStartOpts struct {
  658. *ProjectScopedTrackOpts
  659. Email string
  660. FirstName string
  661. LastName string
  662. CompanyName string
  663. ValidateApplyV2 bool
  664. }
  665. // StackLaunchStartTrack returns a track for when a user starts creating a stack
  666. func StackLaunchStartTrack(opts *StackLaunchStartOpts) segmentTrack {
  667. additionalProps := make(map[string]interface{})
  668. additionalProps["email"] = opts.Email
  669. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  670. additionalProps["company"] = opts.CompanyName
  671. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  672. return getSegmentProjectTrack(
  673. opts.ProjectScopedTrackOpts,
  674. getDefaultSegmentTrack(additionalProps, StackLaunchStart),
  675. )
  676. }
  677. // StackLaunchCompleteOpts are the options for creating a track when a user completes creating a stack
  678. type StackLaunchCompleteOpts struct {
  679. *ProjectScopedTrackOpts
  680. StackName string
  681. Email string
  682. FirstName string
  683. LastName string
  684. CompanyName string
  685. ValidateApplyV2 bool
  686. }
  687. // StackLaunchCompleteTrack returns a track for when a user completes creating a stack
  688. func StackLaunchCompleteTrack(opts *StackLaunchCompleteOpts) segmentTrack {
  689. additionalProps := make(map[string]interface{})
  690. additionalProps["stack_name"] = opts.StackName
  691. additionalProps["email"] = opts.Email
  692. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  693. additionalProps["company"] = opts.CompanyName
  694. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  695. return getSegmentProjectTrack(
  696. opts.ProjectScopedTrackOpts,
  697. getDefaultSegmentTrack(additionalProps, StackLaunchComplete),
  698. )
  699. }
  700. // StackLaunchSuccessOpts are the options for creating a track when a user succeeds in creating a stack
  701. type StackLaunchSuccessOpts struct {
  702. *ProjectScopedTrackOpts
  703. StackName string
  704. Email string
  705. FirstName string
  706. LastName string
  707. CompanyName string
  708. ValidateApplyV2 bool
  709. }
  710. // StackLaunchCompleteTrack returns a track for when a user completes creating a stack
  711. func StackLaunchSuccessTrack(opts *StackLaunchSuccessOpts) segmentTrack {
  712. additionalProps := make(map[string]interface{})
  713. additionalProps["stack_name"] = opts.StackName
  714. additionalProps["email"] = opts.Email
  715. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  716. additionalProps["company"] = opts.CompanyName
  717. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  718. return getSegmentProjectTrack(
  719. opts.ProjectScopedTrackOpts,
  720. getDefaultSegmentTrack(additionalProps, StackLaunchSuccess),
  721. )
  722. }
  723. // StackLaunchFailureOpts are the options for creating a track when a user fails in creating a stack
  724. type StackLaunchFailureOpts struct {
  725. *ProjectScopedTrackOpts
  726. StackName string
  727. Email string
  728. FirstName string
  729. LastName string
  730. CompanyName string
  731. ErrorMessage string
  732. ValidateApplyV2 bool
  733. }
  734. // StackLaunchFailureTrack returns a track for when a user fails creating a stack
  735. func StackLaunchFailureTrack(opts *StackLaunchFailureOpts) segmentTrack {
  736. additionalProps := make(map[string]interface{})
  737. additionalProps["stack_name"] = opts.StackName
  738. additionalProps["email"] = opts.Email
  739. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  740. additionalProps["company"] = opts.CompanyName
  741. additionalProps["error_message"] = opts.ErrorMessage
  742. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  743. return getSegmentProjectTrack(
  744. opts.ProjectScopedTrackOpts,
  745. getDefaultSegmentTrack(additionalProps, StackLaunchFailure),
  746. )
  747. }
  748. // StackDeletionOpts are the options for creating a track when a user deletes a stack
  749. type StackDeletionOpts struct {
  750. *ProjectScopedTrackOpts
  751. StackName string
  752. Email string
  753. FirstName string
  754. LastName string
  755. CompanyName string
  756. DeleteWorkflowFile bool
  757. ValidateApplyV2 bool
  758. }
  759. // StackDeletionTrack returns a track for when a user deletes a stack
  760. func StackDeletionTrack(opts *StackDeletionOpts) segmentTrack {
  761. additionalProps := make(map[string]interface{})
  762. additionalProps["stack_name"] = opts.StackName
  763. additionalProps["email"] = opts.Email
  764. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  765. additionalProps["company"] = opts.CompanyName
  766. additionalProps["delete_workflow_file"] = opts.DeleteWorkflowFile
  767. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  768. return getSegmentProjectTrack(
  769. opts.ProjectScopedTrackOpts,
  770. getDefaultSegmentTrack(additionalProps, StackDeletion),
  771. )
  772. }
  773. // StackBuildOpts are the options for creating a track when a stack builds
  774. type StackBuildOpts struct {
  775. *ProjectScopedTrackOpts
  776. StackName string
  777. ErrorMessage string
  778. B64BuildLogs string
  779. Email string
  780. FirstName string
  781. LastName string
  782. CompanyName string
  783. ValidateApplyV2 bool
  784. }
  785. // StackBuildFailureTrack returns a track for when a stack fails to build
  786. func StackBuildFailureTrack(opts *StackBuildOpts) segmentTrack {
  787. additionalProps := make(map[string]interface{})
  788. additionalProps["stack_name"] = opts.StackName
  789. additionalProps["error_message"] = opts.ErrorMessage
  790. additionalProps["email"] = opts.Email
  791. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  792. additionalProps["company"] = opts.CompanyName
  793. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  794. additionalProps["b64_build_logs"] = opts.B64BuildLogs
  795. return getSegmentProjectTrack(
  796. opts.ProjectScopedTrackOpts,
  797. getDefaultSegmentTrack(additionalProps, StackBuildFailure),
  798. )
  799. }
  800. // StackBuildSuccessTrack returns a track for when a stack succeeds to build
  801. func StackBuildSuccessTrack(opts *StackBuildOpts) segmentTrack {
  802. additionalProps := make(map[string]interface{})
  803. additionalProps["stack_name"] = opts.StackName
  804. additionalProps["email"] = opts.Email
  805. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  806. additionalProps["company"] = opts.CompanyName
  807. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  808. return getSegmentProjectTrack(
  809. opts.ProjectScopedTrackOpts,
  810. getDefaultSegmentTrack(additionalProps, StackBuildSuccess),
  811. )
  812. }
  813. // StackBuildProgressingTrack returns a track for when a stack starts to build
  814. func StackBuildProgressingTrack(opts *StackBuildOpts) segmentTrack {
  815. additionalProps := make(map[string]interface{})
  816. additionalProps["stack_name"] = opts.StackName
  817. additionalProps["email"] = opts.Email
  818. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  819. additionalProps["company"] = opts.CompanyName
  820. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  821. return getSegmentProjectTrack(
  822. opts.ProjectScopedTrackOpts,
  823. getDefaultSegmentTrack(additionalProps, StackBuildProgressing),
  824. )
  825. }
  826. // PorterAppUpdateOpts are the options for creating a track when a user updates a porter app
  827. type PorterAppUpdateOpts struct {
  828. *ProjectScopedTrackOpts
  829. StackName string
  830. Email string
  831. FirstName string
  832. LastName string
  833. CompanyName string
  834. ErrorMessage string
  835. ErrorStackTrace string
  836. ValidateApplyV2 bool
  837. }
  838. // PorterAppUpdateFailureTrack returns a track for when a user attempts to update an app and receives an error
  839. func PorterAppUpdateFailureTrack(opts *PorterAppUpdateOpts) segmentTrack {
  840. additionalProps := make(map[string]interface{})
  841. additionalProps["stack_name"] = opts.StackName
  842. additionalProps["email"] = opts.Email
  843. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  844. additionalProps["company"] = opts.CompanyName
  845. additionalProps["error_message"] = opts.ErrorMessage
  846. additionalProps["error_stack_trace"] = opts.ErrorStackTrace
  847. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  848. return getSegmentProjectTrack(
  849. opts.ProjectScopedTrackOpts,
  850. getDefaultSegmentTrack(additionalProps, PorterAppUpdateFailure),
  851. )
  852. }