tracks.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  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. }
  68. // UserCreateTrack returns a track for when a user is created
  69. func UserCreateTrack(opts *UserCreateTrackOpts) segmentTrack {
  70. additionalProps := make(map[string]interface{})
  71. additionalProps["email"] = opts.Email
  72. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  73. additionalProps["company"] = opts.CompanyName
  74. return getSegmentUserTrack(
  75. opts.UserScopedTrackOpts,
  76. getDefaultSegmentTrack(additionalProps, UserCreate),
  77. )
  78. }
  79. // UserCreateTrackOpts are the options for creating a track when a user's email is verified
  80. type UserVerifyEmailTrackOpts struct {
  81. *UserScopedTrackOpts
  82. Email string
  83. }
  84. // UserVerifyEmailTrack returns a track for when a user's email is verified
  85. func UserVerifyEmailTrack(opts *UserVerifyEmailTrackOpts) segmentTrack {
  86. additionalProps := make(map[string]interface{})
  87. additionalProps["email"] = opts.Email
  88. return getSegmentUserTrack(
  89. opts.UserScopedTrackOpts,
  90. getDefaultSegmentTrack(additionalProps, UserVerifyEmail),
  91. )
  92. }
  93. // ProjectCreateTrackOpts are the options for creating a track when a project is created
  94. type ProjectCreateTrackOpts struct {
  95. *ProjectScopedTrackOpts
  96. }
  97. // ProjectCreateTrack returns a track for when a project is created
  98. func ProjectCreateTrack(opts *ProjectCreateTrackOpts) segmentTrack {
  99. additionalProps := make(map[string]interface{})
  100. return getSegmentProjectTrack(
  101. opts.ProjectScopedTrackOpts,
  102. getDefaultSegmentTrack(additionalProps, ProjectCreate),
  103. )
  104. }
  105. // CostConsentOpenedTrackOpts are the options for creating a track when a user opens the cost consent
  106. type CostConsentOpenedTrackOpts struct {
  107. *UserScopedTrackOpts
  108. Provider string
  109. Email string
  110. FirstName string
  111. LastName string
  112. CompanyName string
  113. }
  114. // CostConsentCompletedTrack returns a track for when a user completes the cost consent
  115. func CostConsentOpenedTrack(opts *CostConsentOpenedTrackOpts) segmentTrack {
  116. additionalProps := make(map[string]interface{})
  117. additionalProps["provider"] = opts.Provider
  118. additionalProps["email"] = opts.Email
  119. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  120. additionalProps["company"] = opts.CompanyName
  121. return getSegmentUserTrack(
  122. opts.UserScopedTrackOpts,
  123. getDefaultSegmentTrack(additionalProps, CostConsentOpened),
  124. )
  125. }
  126. // CostConsentCompletedTrackOpts are the options for creating a track when a user completes the cost consent
  127. type CostConsentCompletedTrackOpts struct {
  128. *UserScopedTrackOpts
  129. Provider string
  130. Email string
  131. FirstName string
  132. LastName string
  133. CompanyName string
  134. }
  135. // CostConsentCompletedTrack returns a track for when a user completes the cost consent
  136. func CostConsentCompletedTrack(opts *CostConsentCompletedTrackOpts) segmentTrack {
  137. additionalProps := make(map[string]interface{})
  138. additionalProps["provider"] = opts.Provider
  139. additionalProps["email"] = opts.Email
  140. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  141. additionalProps["company"] = opts.CompanyName
  142. return getSegmentUserTrack(
  143. opts.UserScopedTrackOpts,
  144. getDefaultSegmentTrack(additionalProps, CostConsentComplete),
  145. )
  146. }
  147. // CredentialStepTrackOpts are the options for creating a track when a user completes the credential step
  148. type CredentialStepTrackOpts struct {
  149. *UserScopedTrackOpts
  150. }
  151. // CredentialStepTrack returns a track for when a user completes the credential step
  152. func CredentialStepTrack(opts *CredentialStepTrackOpts) segmentTrack {
  153. additionalProps := make(map[string]interface{})
  154. return getSegmentUserTrack(
  155. opts.UserScopedTrackOpts,
  156. getDefaultSegmentTrack(additionalProps, CredentialStepComplete),
  157. )
  158. }
  159. // PreProvisionCheckTrackOpts are the options for creating a track when a user checks if they can provision
  160. type PreProvisionCheckTrackOpts struct {
  161. *UserScopedTrackOpts
  162. Email string
  163. FirstName string
  164. LastName string
  165. CompanyName string
  166. }
  167. // PreProvisionCheckTrack returns a track for when a user attempts provisioning
  168. func PreProvisionCheckTrack(opts *PreProvisionCheckTrackOpts) segmentTrack {
  169. additionalProps := make(map[string]interface{})
  170. additionalProps["email"] = opts.Email
  171. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  172. additionalProps["company"] = opts.CompanyName
  173. return getSegmentUserTrack(
  174. opts.UserScopedTrackOpts,
  175. getDefaultSegmentTrack(additionalProps, PreProvisionCheck),
  176. )
  177. }
  178. // ProvisioningAttemptedTrackOpts are the options for creating a track when a user attempts provisioning
  179. type ProvisioningAttemptTrackOpts struct {
  180. *UserScopedTrackOpts
  181. Email string
  182. FirstName string
  183. LastName string
  184. CompanyName string
  185. }
  186. // ProvisioningAttemptTrack returns a track for when a user attempts provisioning
  187. func ProvisioningAttemptTrack(opts *ProvisioningAttemptTrackOpts) segmentTrack {
  188. additionalProps := make(map[string]interface{})
  189. additionalProps["email"] = opts.Email
  190. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  191. additionalProps["company"] = opts.CompanyName
  192. return getSegmentUserTrack(
  193. opts.UserScopedTrackOpts,
  194. getDefaultSegmentTrack(additionalProps, ProvisioningAttempted),
  195. )
  196. }
  197. // ClusterProvisioningStartTrackOpts are the options for creating a track when a cluster
  198. // has started provisioning
  199. type ClusterProvisioningStartTrackOpts struct {
  200. // note that this is a project-scoped track, since the cluster has not been created yet
  201. *ProjectScopedTrackOpts
  202. ClusterType types.InfraKind
  203. InfraID uint
  204. }
  205. // ClusterProvisioningStartTrack returns a track for when a cluster
  206. // has started provisioning
  207. func ClusterProvisioningStartTrack(opts *ClusterProvisioningStartTrackOpts) segmentTrack {
  208. additionalProps := make(map[string]interface{})
  209. additionalProps["cluster_type"] = opts.ClusterType
  210. additionalProps["infra_id"] = opts.InfraID
  211. return getSegmentProjectTrack(
  212. opts.ProjectScopedTrackOpts,
  213. getDefaultSegmentTrack(additionalProps, ClusterProvisioningStart),
  214. )
  215. }
  216. // ClusterProvisioningErrorTrackOpts are the options for creating a track when a cluster
  217. // has experienced a provisioning error
  218. type ClusterProvisioningErrorTrackOpts struct {
  219. // note that this is a project-scoped track, since the cluster has not been created yet
  220. *ProjectScopedTrackOpts
  221. ClusterType types.InfraKind
  222. InfraID uint
  223. }
  224. // ClusterProvisioningErrorTrack returns a track for when a cluster
  225. // has experienced a provisioning error
  226. func ClusterProvisioningErrorTrack(opts *ClusterProvisioningErrorTrackOpts) segmentTrack {
  227. additionalProps := make(map[string]interface{})
  228. additionalProps["cluster_type"] = opts.ClusterType
  229. additionalProps["infra_id"] = opts.InfraID
  230. return getSegmentProjectTrack(
  231. opts.ProjectScopedTrackOpts,
  232. getDefaultSegmentTrack(additionalProps, ClusterProvisioningError),
  233. )
  234. }
  235. // ClusterProvisioningSuccessTrackOpts are the options for creating a track when a cluster
  236. // has successfully provisioned
  237. type ClusterProvisioningSuccessTrackOpts struct {
  238. *ClusterScopedTrackOpts
  239. ClusterType types.InfraKind
  240. InfraID uint
  241. }
  242. // ClusterProvisioningSuccessTrack returns a new track for when a cluster
  243. // has successfully provisioned
  244. func ClusterProvisioningSuccessTrack(opts *ClusterProvisioningSuccessTrackOpts) segmentTrack {
  245. additionalProps := make(map[string]interface{})
  246. additionalProps["cluster_type"] = opts.ClusterType
  247. additionalProps["infra_id"] = opts.InfraID
  248. return getSegmentClusterTrack(
  249. opts.ClusterScopedTrackOpts,
  250. getDefaultSegmentTrack(additionalProps, ClusterProvisioningSuccess),
  251. )
  252. }
  253. // ClusterConnectionStartTrackOpts are the options for creating a track when a cluster
  254. // connection has started
  255. type ClusterConnectionStartTrackOpts struct {
  256. // note that this is a project-scoped track, since the cluster has not been created yet
  257. *ProjectScopedTrackOpts
  258. ClusterCandidateID uint
  259. }
  260. // ClusterConnectionStartTrack returns a new track for when a cluster
  261. // connection has started
  262. func ClusterConnectionStartTrack(opts *ClusterConnectionStartTrackOpts) segmentTrack {
  263. additionalProps := make(map[string]interface{})
  264. additionalProps["cc_id"] = opts.ClusterCandidateID
  265. return getSegmentProjectTrack(
  266. opts.ProjectScopedTrackOpts,
  267. getDefaultSegmentTrack(additionalProps, ClusterConnectionStart),
  268. )
  269. }
  270. // ClusterConnectionSuccessTrackOpts are the options for creating a track when a cluster
  271. // connection has finished
  272. type ClusterConnectionSuccessTrackOpts struct {
  273. *ClusterScopedTrackOpts
  274. ClusterCandidateID uint
  275. }
  276. // ClusterConnectionSuccessTrack returns a new track for when a cluster
  277. // connection has finished
  278. func ClusterConnectionSuccessTrack(opts *ClusterConnectionSuccessTrackOpts) segmentTrack {
  279. additionalProps := make(map[string]interface{})
  280. additionalProps["cc_id"] = opts.ClusterCandidateID
  281. return getSegmentClusterTrack(
  282. opts.ClusterScopedTrackOpts,
  283. getDefaultSegmentTrack(additionalProps, ClusterConnectionSuccess),
  284. )
  285. }
  286. // RegistryConnectionStartTrackOpts are the options for creating a track when a registry
  287. // connection has started
  288. type RegistryConnectionStartTrackOpts struct {
  289. // note that this is a project-scoped track, since the cluster has not been created yet
  290. *ProjectScopedTrackOpts
  291. // a random id assigned to this connection request
  292. FlowID string
  293. }
  294. // RegistryConnectionStartTrack returns a new track for when a registry
  295. // connection has started
  296. func RegistryConnectionStartTrack(opts *RegistryConnectionStartTrackOpts) segmentTrack {
  297. additionalProps := make(map[string]interface{})
  298. additionalProps["flow_id"] = opts.FlowID
  299. return getSegmentProjectTrack(
  300. opts.ProjectScopedTrackOpts,
  301. getDefaultSegmentTrack(additionalProps, RegistryConnectionStart),
  302. )
  303. }
  304. // RegistryConnectionSuccessTrackOpts are the options for creating a track when a registry
  305. // connection has completed
  306. type RegistryConnectionSuccessTrackOpts struct {
  307. *RegistryScopedTrackOpts
  308. // a random id assigned to this connection request
  309. FlowID string
  310. }
  311. // RegistryConnectionSuccessTrack returns a new track for when a registry
  312. // connection has completed
  313. func RegistryConnectionSuccessTrack(opts *RegistryConnectionSuccessTrackOpts) segmentTrack {
  314. additionalProps := make(map[string]interface{})
  315. additionalProps["flow_id"] = opts.FlowID
  316. return getSegmentRegistryTrack(
  317. opts.RegistryScopedTrackOpts,
  318. getDefaultSegmentTrack(additionalProps, RegistryConnectionSuccess),
  319. )
  320. }
  321. // GithubConnectionStartTrackOpts are the options for creating a track when a github account
  322. // connection has started
  323. type GithubConnectionStartTrackOpts struct {
  324. // note that this is a user-scoped track, since github repos are tied to the user
  325. *UserScopedTrackOpts
  326. }
  327. // GithubConnectionStartTrack returns a new track for when a github account
  328. // connection has started
  329. func GithubConnectionStartTrack(opts *GithubConnectionStartTrackOpts) segmentTrack {
  330. additionalProps := make(map[string]interface{})
  331. return getSegmentUserTrack(
  332. opts.UserScopedTrackOpts,
  333. getDefaultSegmentTrack(additionalProps, GithubConnectionStart),
  334. )
  335. }
  336. // GithubConnectionSuccessTrackOpts are the options for creating a track when a github account
  337. // connection has completed
  338. type GithubConnectionSuccessTrackOpts struct {
  339. // note that this is a user-scoped track, since github repos are tied to the user
  340. *UserScopedTrackOpts
  341. }
  342. // GithubConnectionSuccessTrack returns a new track when a github account
  343. // connection has completed
  344. func GithubConnectionSuccessTrack(opts *GithubConnectionSuccessTrackOpts) segmentTrack {
  345. additionalProps := make(map[string]interface{})
  346. return getSegmentUserTrack(
  347. opts.UserScopedTrackOpts,
  348. getDefaultSegmentTrack(additionalProps, GithubConnectionSuccess),
  349. )
  350. }
  351. // ApplicationLaunchStartTrackOpts are the options for creating a track when an application
  352. // launch has started
  353. type ApplicationLaunchStartTrackOpts struct {
  354. *ClusterScopedTrackOpts
  355. FlowID string
  356. }
  357. // ApplicationLaunchStartTrack returns a new track for when an application
  358. // launch has started
  359. func ApplicationLaunchStartTrack(opts *ApplicationLaunchStartTrackOpts) segmentTrack {
  360. additionalProps := make(map[string]interface{})
  361. additionalProps["flow_id"] = opts.FlowID
  362. return getSegmentClusterTrack(
  363. opts.ClusterScopedTrackOpts,
  364. getDefaultSegmentTrack(additionalProps, ApplicationLaunchStart),
  365. )
  366. }
  367. // ApplicationLaunchSuccessTrackOpts are the options for creating a track when an application
  368. // launch has completed
  369. type ApplicationLaunchSuccessTrackOpts struct {
  370. *ApplicationScopedTrackOpts
  371. FlowID string
  372. }
  373. // ApplicationLaunchSuccessTrack returns a new track for when an application
  374. // launch has completed
  375. func ApplicationLaunchSuccessTrack(opts *ApplicationLaunchSuccessTrackOpts) segmentTrack {
  376. additionalProps := make(map[string]interface{})
  377. additionalProps["flow_id"] = opts.FlowID
  378. return getSegmentApplicationTrack(
  379. opts.ApplicationScopedTrackOpts,
  380. getDefaultSegmentTrack(additionalProps, ApplicationLaunchSuccess),
  381. )
  382. }
  383. // ApplicationDeploymentWebhookTrackOpts are the options for creating a track when an application
  384. // launch has completed from a webhook
  385. type ApplicationDeploymentWebhookTrackOpts struct {
  386. *ApplicationScopedTrackOpts
  387. ImageURI string
  388. }
  389. // ApplicationDeploymentWebhookTrack returns a new track for when an application
  390. // launch has completed from a webhook
  391. func ApplicationDeploymentWebhookTrack(opts *ApplicationDeploymentWebhookTrackOpts) segmentTrack {
  392. additionalProps := make(map[string]interface{})
  393. additionalProps["image_uri"] = opts.ImageURI
  394. return getSegmentApplicationTrack(
  395. opts.ApplicationScopedTrackOpts,
  396. getDefaultSegmentTrack(additionalProps, ApplicationDeploymentWebhook),
  397. )
  398. }
  399. // RegistryProvisioningStartTrackOpts are the options for creating a track when a registry
  400. // provisioning has started
  401. type RegistryProvisioningStartTrackOpts struct {
  402. // note that this is a project-scoped track, since the registry has not been created yet
  403. *ProjectScopedTrackOpts
  404. RegistryType types.InfraKind
  405. InfraID uint
  406. }
  407. // RegistryProvisioningStartTrack returns a new track for when a registry
  408. // provisioning has started
  409. func RegistryProvisioningStartTrack(opts *RegistryProvisioningStartTrackOpts) segmentTrack {
  410. additionalProps := make(map[string]interface{})
  411. additionalProps["registry_type"] = opts.RegistryType
  412. additionalProps["infra_id"] = opts.InfraID
  413. return getSegmentProjectTrack(
  414. opts.ProjectScopedTrackOpts,
  415. getDefaultSegmentTrack(additionalProps, RegistryProvisioningStart),
  416. )
  417. }
  418. // RegistryProvisioningErrorTrackOpts are the options for creating a track when a registry
  419. // provisioning has failed
  420. type RegistryProvisioningErrorTrackOpts struct {
  421. // note that this is a project-scoped track, since the registry has not been created yet
  422. *ProjectScopedTrackOpts
  423. RegistryType types.InfraKind
  424. InfraID uint
  425. }
  426. // RegistryProvisioningErrorTrack returns a new track for when a registry
  427. // provisioning has failed
  428. func RegistryProvisioningErrorTrack(opts *RegistryProvisioningErrorTrackOpts) segmentTrack {
  429. additionalProps := make(map[string]interface{})
  430. additionalProps["registry_type"] = opts.RegistryType
  431. additionalProps["infra_id"] = opts.InfraID
  432. return getSegmentProjectTrack(
  433. opts.ProjectScopedTrackOpts,
  434. getDefaultSegmentTrack(additionalProps, RegistryProvisioningError),
  435. )
  436. }
  437. // RegistryProvisioningSuccessTrackOpts are the options for creating a track when a registry
  438. // provisioning has completed
  439. type RegistryProvisioningSuccessTrackOpts struct {
  440. *RegistryScopedTrackOpts
  441. RegistryType types.InfraKind
  442. InfraID uint
  443. }
  444. // RegistryProvisioningSuccessTrack returns a new track for when a registry
  445. // provisioning has completed
  446. func RegistryProvisioningSuccessTrack(opts *RegistryProvisioningSuccessTrackOpts) segmentTrack {
  447. additionalProps := make(map[string]interface{})
  448. additionalProps["registry_type"] = opts.RegistryType
  449. additionalProps["infra_id"] = opts.InfraID
  450. return getSegmentRegistryTrack(
  451. opts.RegistryScopedTrackOpts,
  452. getDefaultSegmentTrack(additionalProps, RegistryProvisioningSuccess),
  453. )
  454. }
  455. // ClusterDestroyingStartTrackOpts are the options for creating a track when a cluster
  456. // has started destroying
  457. type ClusterDestroyingStartTrackOpts struct {
  458. *ClusterScopedTrackOpts
  459. ClusterType types.InfraKind
  460. InfraID uint
  461. }
  462. // ClusterDestroyingStartTrack returns a track for when a cluster
  463. // has started destroying
  464. func ClusterDestroyingStartTrack(opts *ClusterDestroyingStartTrackOpts) segmentTrack {
  465. additionalProps := make(map[string]interface{})
  466. additionalProps["cluster_type"] = opts.ClusterType
  467. additionalProps["infra_id"] = opts.InfraID
  468. return getSegmentClusterTrack(
  469. opts.ClusterScopedTrackOpts,
  470. getDefaultSegmentTrack(additionalProps, ClusterDestroyingStart),
  471. )
  472. }
  473. // ClusterDestroyingSuccessTrackOpts are the options for creating a track when a cluster
  474. // has successfully provisioned
  475. type ClusterDestroyingSuccessTrackOpts struct {
  476. *ClusterScopedTrackOpts
  477. ClusterType types.InfraKind
  478. InfraID uint
  479. }
  480. // ClusterDestroyingSuccessTrack returns a new track for when a cluster
  481. // has successfully provisioned
  482. func ClusterDestroyingSuccessTrack(opts *ClusterDestroyingSuccessTrackOpts) segmentTrack {
  483. additionalProps := make(map[string]interface{})
  484. additionalProps["cluster_type"] = opts.ClusterType
  485. additionalProps["infra_id"] = opts.InfraID
  486. return getSegmentClusterTrack(
  487. opts.ClusterScopedTrackOpts,
  488. getDefaultSegmentTrack(additionalProps, ClusterDestroyingSuccess),
  489. )
  490. }
  491. // StackLaunchStartOpts are the options for creating a track when a user starts creating a stack
  492. type StackLaunchStartOpts struct {
  493. *ProjectScopedTrackOpts
  494. Email string
  495. FirstName string
  496. LastName string
  497. CompanyName string
  498. }
  499. // StackLaunchStartTrack returns a track for when a user starts creating a stack
  500. func StackLaunchStartTrack(opts *StackLaunchStartOpts) segmentTrack {
  501. additionalProps := make(map[string]interface{})
  502. additionalProps["email"] = opts.Email
  503. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  504. additionalProps["company"] = opts.CompanyName
  505. return getSegmentProjectTrack(
  506. opts.ProjectScopedTrackOpts,
  507. getDefaultSegmentTrack(additionalProps, StackLaunchStart),
  508. )
  509. }
  510. // StackLaunchCompleteOpts are the options for creating a track when a user completes creating a stack
  511. type StackLaunchCompleteOpts struct {
  512. *ProjectScopedTrackOpts
  513. StackName string
  514. Email string
  515. FirstName string
  516. LastName string
  517. CompanyName string
  518. }
  519. // StackLaunchCompleteTrack returns a track for when a user completes creating a stack
  520. func StackLaunchCompleteTrack(opts *StackLaunchCompleteOpts) segmentTrack {
  521. additionalProps := make(map[string]interface{})
  522. additionalProps["stack_name"] = opts.StackName
  523. additionalProps["email"] = opts.Email
  524. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  525. additionalProps["company"] = opts.CompanyName
  526. return getSegmentProjectTrack(
  527. opts.ProjectScopedTrackOpts,
  528. getDefaultSegmentTrack(additionalProps, StackLaunchComplete),
  529. )
  530. }
  531. // StackLaunchSuccessOpts are the options for creating a track when a user succeeds in creating a stack
  532. type StackLaunchSuccessOpts struct {
  533. *ProjectScopedTrackOpts
  534. StackName string
  535. Email string
  536. FirstName string
  537. LastName string
  538. CompanyName string
  539. }
  540. // StackLaunchCompleteTrack returns a track for when a user completes creating a stack
  541. func StackLaunchSuccessTrack(opts *StackLaunchSuccessOpts) segmentTrack {
  542. additionalProps := make(map[string]interface{})
  543. additionalProps["stack_name"] = opts.StackName
  544. additionalProps["email"] = opts.Email
  545. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  546. additionalProps["company"] = opts.CompanyName
  547. return getSegmentProjectTrack(
  548. opts.ProjectScopedTrackOpts,
  549. getDefaultSegmentTrack(additionalProps, StackLaunchSuccess),
  550. )
  551. }
  552. // StackLaunchFailureOpts are the options for creating a track when a user fails in creating a stack
  553. type StackLaunchFailureOpts struct {
  554. *ProjectScopedTrackOpts
  555. StackName string
  556. Email string
  557. FirstName string
  558. LastName string
  559. CompanyName string
  560. ErrorMessage string
  561. }
  562. // StackLaunchFailureTrack returns a track for when a user fails creating a stack
  563. func StackLaunchFailureTrack(opts *StackLaunchFailureOpts) segmentTrack {
  564. additionalProps := make(map[string]interface{})
  565. additionalProps["stack_name"] = opts.StackName
  566. additionalProps["email"] = opts.Email
  567. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  568. additionalProps["company"] = opts.CompanyName
  569. additionalProps["error_message"] = opts.ErrorMessage
  570. return getSegmentProjectTrack(
  571. opts.ProjectScopedTrackOpts,
  572. getDefaultSegmentTrack(additionalProps, StackLaunchFailure),
  573. )
  574. }
  575. // StackDeletionOpts are the options for creating a track when a user deletes a stack
  576. type StackDeletionOpts struct {
  577. *ProjectScopedTrackOpts
  578. StackName string
  579. Email string
  580. FirstName string
  581. LastName string
  582. CompanyName string
  583. }
  584. // StackDeletionTrack returns a track for when a user deletes a stack
  585. func StackDeletionTrack(opts *StackDeletionOpts) segmentTrack {
  586. additionalProps := make(map[string]interface{})
  587. additionalProps["stack_name"] = opts.StackName
  588. additionalProps["email"] = opts.Email
  589. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  590. additionalProps["company"] = opts.CompanyName
  591. return getSegmentProjectTrack(
  592. opts.ProjectScopedTrackOpts,
  593. getDefaultSegmentTrack(additionalProps, StackDeletion),
  594. )
  595. }