Skip to content

Commit 13d5b06

Browse files
committed
feature(shopify): auto assign shopify customers to a default shopify plan with a 50 messages per month limit and send dittofeed user information on signup
1 parent 3cc6fcf commit 13d5b06

File tree

5 files changed

+95
-17
lines changed

5 files changed

+95
-17
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- This file should undo anything in `up.sql`
2+
delete from stripe_plans where id = 'dead0000-f0ee-4000-a000-000000000000';
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- Your SQL goes here
2+
INSERT into stripe_plans (id, stripe_id, chunk_count, user_count, dataset_count, message_count, amount, created_at, updated_at, name, visible, file_storage, messages_per_month) VALUES (
3+
'dead0000-f0ee-4000-a000-000000000000', 'dead0000-f0ee-4000-a000-000000000000', 1147483647, 1147483647, 1147483647, 1147483647, 0, now(), now(), 'Free Shop Tier', false, 1147483647, 50
4+
);

server/src/handlers/auth_handler.rs

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
use crate::data::models::{ApiKeyRole, Organization, RedisPool, UserRole};
22
use crate::get_env;
3-
use crate::operators::dittofeed_operator::{get_user_ditto_identity, send_user_ditto_identity};
3+
use crate::handlers::shopify_handler::ShopifyCustomerEvent;
4+
use crate::operators::dittofeed_operator::{
5+
get_user_ditto_identity, send_user_ditto_identity, DittoBatchRequest, DittoBatchRequestTypes,
6+
DittoTrackProperties, DittoTrackRequest, DittofeedIdentifyUser, DittofeedUserTraits,
7+
};
48
use crate::operators::invitation_operator::check_inv_valid;
59
use crate::operators::organization_operator::{
610
create_organization_api_key_query, get_org_from_id_query, get_user_org_count,
711
};
12+
use crate::operators::payment_operator::create_flat_subscription_query;
813
use crate::operators::user_operator::{
914
add_user_to_organization, associate_user_to_oidc_subject_query, create_user_query,
1015
get_option_user_by_email_query, get_user_by_oidc_subject_query,
@@ -728,7 +733,74 @@ pub async fn create_api_only_user(
728733

729734
let (user, user_orgs, orgs) = match option_user {
730735
Some(user) => get_user_by_id_query(&user.id, pool.clone()).await?,
731-
None => create_account(user_email, user_name, None, None, None, pool.clone()).await?,
736+
None => {
737+
let (user, user_orgs, orgs) = create_account(
738+
user_email.clone(),
739+
user_name.clone(),
740+
None,
741+
None,
742+
None,
743+
pool.clone(),
744+
)
745+
.await?;
746+
747+
// Associate orgs.0 with api_only_price
748+
let organization = orgs
749+
.first()
750+
.ok_or(ServiceError::BadRequest(
751+
"Failed to create organization for api only user; please try again".to_string(),
752+
))?
753+
.clone();
754+
755+
create_flat_subscription_query(
756+
"shopify_free_plan".to_string(),
757+
uuid::Uuid::parse_str("dead0000-f0ee-4000-a000-000000000000")
758+
.expect("hardcoded should be valid uuid"),
759+
organization.id,
760+
None,
761+
pool.clone(),
762+
)
763+
.await?;
764+
765+
// Send user ditto identity with shopify tag
766+
let ditto_batch_request = vec![
767+
DittoBatchRequestTypes::Identify(DittofeedIdentifyUser {
768+
r#type: Some("identify".to_string()),
769+
message_id: uuid::Uuid::new_v4(),
770+
user_id: user.id,
771+
traits: DittofeedUserTraits {
772+
email: user.email.clone(),
773+
name: user.name.clone(),
774+
created_at: user.created_at,
775+
organization_count: 1,
776+
dataset_count: 1,
777+
},
778+
}),
779+
DittoBatchRequestTypes::Track(DittoTrackRequest {
780+
r#type: Some("track".to_string()),
781+
message_id: format!(
782+
"{}-{}-{}",
783+
user_email.clone(),
784+
user.id,
785+
"shopify_installed"
786+
),
787+
event: "shopify_installed".to_string(),
788+
properties: DittoTrackProperties::DittoShopifyEvent(ShopifyCustomerEvent {
789+
organization_id: organization.id,
790+
store_name: user_name.clone(),
791+
event_type: "shopify_installed".to_string(),
792+
}),
793+
user_id: user.id,
794+
}),
795+
];
796+
797+
let _ = send_user_ditto_identity(DittoBatchRequest {
798+
batch: ditto_batch_request,
799+
})
800+
.await;
801+
802+
(user, user_orgs, orgs)
803+
}
732804
};
733805

734806
let organization = orgs

server/src/handlers/payment_handler.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ use crate::{
99
get_org_from_id_query, get_org_id_from_subscription_id_query, get_org_usage_by_id_query,
1010
},
1111
payment_operator::{
12-
cancel_stripe_subscription, create_invoice_query, create_stripe_payment_link,
13-
create_stripe_plan_query, create_stripe_setup_checkout_session,
14-
create_stripe_subscription_query, create_usage_based_stripe_payment_link,
12+
cancel_stripe_subscription, create_flat_subscription_query, create_invoice_query,
13+
create_stripe_payment_link, create_stripe_plan_query,
14+
create_stripe_setup_checkout_session, create_usage_based_stripe_payment_link,
1515
create_usage_stripe_subscription_query, delete_subscription_by_id_query,
1616
delete_usage_subscription_by_id_query, get_all_plans_query, get_all_usage_plans_query,
1717
get_bill_from_range, get_invoices_for_org_query,
@@ -201,7 +201,7 @@ pub async fn webhook(
201201
)
202202
.await;
203203

204-
create_stripe_subscription_query(
204+
create_flat_subscription_query(
205205
subscription_stripe_id,
206206
plan_id,
207207
organization_id,
@@ -477,7 +477,7 @@ pub async fn update_subscription_plan(
477477
}
478478
TrieveSubscription::UsageBased(_) => {
479479
// Old was usage based, create a new entry for flat
480-
create_stripe_subscription_query(
480+
create_flat_subscription_query(
481481
current_trieve_subscription.stripe_subscription_id(),
482482
flat_plan.id,
483483
current_trieve_subscription.organization_id(),
@@ -765,7 +765,7 @@ pub async fn handle_shopify_plan_change(
765765
return Err(ServiceError::BadRequest("Invalid session token".to_string()).into());
766766
}
767767

768-
let organization_plan =
768+
let organization_sub =
769769
get_option_subscription_by_organization_id_query(payload.organization_id, pool.clone())
770770
.await
771771
.map_err(|e| ServiceError::BadRequest(e.to_string()))?;
@@ -774,28 +774,28 @@ pub async fn handle_shopify_plan_change(
774774
.await
775775
.map_err(|e| ServiceError::BadRequest(e.to_string()))?;
776776

777-
if let Some(organization_plan) = organization_plan {
778-
if organization_plan.stripe_id == payload.idempotency_key {
777+
if let Some(organization_sub) = organization_sub {
778+
if organization_sub.stripe_id == payload.idempotency_key {
779779
return Ok(HttpResponse::NoContent().finish());
780780
}
781781

782-
if organization_plan.plan_id == plan.id
782+
if organization_sub.plan_id == plan.id
783783
&& payload.shopify_plan.status.to_lowercase() == "active"
784784
{
785785
return Ok(HttpResponse::NoContent().finish());
786-
} else if organization_plan.plan_id == plan.id
786+
} else if organization_sub.plan_id == plan.id
787787
&& payload.shopify_plan.status.to_lowercase() != "active"
788788
{
789789
set_stripe_subscription_current_period_end(
790-
organization_plan.stripe_id,
790+
organization_sub.stripe_id,
791791
chrono::Utc::now().naive_utc(),
792792
pool,
793793
)
794794
.await?;
795-
} else if organization_plan.plan_id != plan.id
795+
} else if organization_sub.plan_id != plan.id
796796
&& payload.shopify_plan.status.to_lowercase() == "active"
797797
{
798-
create_stripe_subscription_query(
798+
create_flat_subscription_query(
799799
payload.idempotency_key.clone(),
800800
plan.id,
801801
payload.organization_id,
@@ -805,7 +805,7 @@ pub async fn handle_shopify_plan_change(
805805
.await?;
806806
}
807807
} else if payload.shopify_plan.status.to_lowercase() == "active" {
808-
create_stripe_subscription_query(
808+
create_flat_subscription_query(
809809
payload.idempotency_key.clone(),
810810
plan.id,
811811
payload.organization_id,

server/src/operators/payment_operator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ pub async fn update_static_stripe_meters(
175175
Ok(static_events)
176176
}
177177

178-
pub async fn create_stripe_subscription_query(
178+
pub async fn create_flat_subscription_query(
179179
stripe_id: String,
180180
plan_id: uuid::Uuid,
181181
organization_id: uuid::Uuid,

0 commit comments

Comments
 (0)