From ac499f75f78b4da14bd98bed4a718e7ba651c5f6 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Mon, 24 Jun 2024 09:29:17 -0500 Subject: [PATCH 01/16] wip --- docs/tutorials/go/background-check/index.mdx | 6 +-- .../index.md | 25 +++++---- .../index.md | 5 +- .../part1.md | 0 .../part2.md | 0 .../part3.md | 0 .../part4.md | 0 .../tutorials/java/background-check/index.mdx | 5 +- .../index.md | 9 ++-- .../images/booking-saga-flow.png | Bin .../index.md | 10 ++-- .../index.md | 8 +-- .../index.md | 8 +-- .../typescript/background-check/index.mdx | 5 +- .../index.md | 9 ++-- .../index.md | 25 ++++----- .../index.md | 7 +-- vercel.json | 48 +++++++++++++++++- 18 files changed, 111 insertions(+), 59 deletions(-) rename docs/tutorials/go/{subscriptions => build-an-email-drip-campaign}/index.md (98%) rename docs/tutorials/go/{ecommerce => build-ecommerce-app}/index.md (92%) rename docs/tutorials/go/{ecommerce => build-ecommerce-app}/part1.md (100%) rename docs/tutorials/go/{ecommerce => build-ecommerce-app}/part2.md (100%) rename docs/tutorials/go/{ecommerce => build-ecommerce-app}/part3.md (100%) rename docs/tutorials/go/{ecommerce => build-ecommerce-app}/part4.md (100%) rename docs/tutorials/php/{subscriptions => build-a-recurring-billing-app}/index.md (98%) rename docs/tutorials/php/{booking_saga => build_a_trip_booking_app}/images/booking-saga-flow.png (100%) rename docs/tutorials/php/{booking_saga => build_a_trip_booking_app}/index.md (98%) rename docs/tutorials/python/{data-pipelines => build-a-data-pipeline}/index.md (99%) rename docs/tutorials/python/{subscriptions => build-an-email-drip-campaign}/index.md (99%) rename docs/tutorials/typescript/{subscriptions => build-a-recurring-billing-app}/index.md (98%) rename docs/tutorials/typescript/{chatbot => build-choose-your-own-adventure-bot}/index.md (93%) rename docs/tutorials/typescript/{nextjs => build-one-click-order-app-nextjs}/index.md (98%) diff --git a/docs/tutorials/go/background-check/index.mdx b/docs/tutorials/go/background-check/index.mdx index 9f2d6dcc..287434f3 100644 --- a/docs/tutorials/go/background-check/index.mdx +++ b/docs/tutorials/go/background-check/index.mdx @@ -1,11 +1,9 @@ --- id: index -title: Build a Background Check application with Temporal and Go +title: Build a Background Check application with Go description: Learn Temporal and its features while building a Background Check application -sidebar_label: Build a Background Check application with Temporal and Go tags: -- long-running -- human-in-the-loop +- Go keywords: - long-running - human in the loop diff --git a/docs/tutorials/go/subscriptions/index.md b/docs/tutorials/go/build-an-email-drip-campaign/index.md similarity index 98% rename from docs/tutorials/go/subscriptions/index.md rename to docs/tutorials/go/build-an-email-drip-campaign/index.md index 3817857d..9f0ec5b0 100644 --- a/docs/tutorials/go/subscriptions/index.md +++ b/docs/tutorials/go/build-an-email-drip-campaign/index.md @@ -1,11 +1,14 @@ --- -title: Build an email subscription workflow with Temporal and Go +id: build-an-email-drip-campaign-go +title: Build an email drip campaign with Go sidebar_position: 3 keywords: [Go,tutorial,temporal,workflows,SDK,subscription] description: Implement an email subscription application in Go with Temporal's Workflows, Activities, and Queries, using the Temporal Client in a web API. last_update: date: 2023-09-28 image: /img/temporal-logo-twitter-card.png +tags: +- Go --- ### Introduction @@ -18,7 +21,7 @@ By the end of this tutorial, you'll have a clear understanding of how to use Tem You'll find the code for this tutorial on GitHub in the [email-subscription-project-go](https://github.com/temporalio/email-subscription-project-go) repository. -## Prerequisites +## Prerequisites - [Set up a local development environment for Temporal and Go](https://learn.temporal.io/getting_started/go/dev_environment/). - Complete the [Hello World](https://learn.temporal.io/getting_started/go/hello_world_in_go/) to ensure you understand the basics of creating Workflows and Activities with Temporal. @@ -151,7 +154,7 @@ The `SubscriptionWorkflow()` function uses a `for` loop to send the emails. The Later in this tutorial, you will find that the user's email address is set to the [Workflow Id](https://docs.temporal.io/workflows#workflow-id). This means that attempting to subscribe with the same email address twice will result in an error and prevent the Workflow Execution from spawning again. -Therefore, only one running Workflow Execution per email address can exist within the associated [Namespace](https://docs.temporal.io/namespaces). +Therefore, only one running Workflow Execution per email address can exist within the associated [Namespace](https://docs.temporal.io/namespaces). This ensures that the user won't receive multiple email subscriptions. This also helps reduce the complexity of the code you have to write and maintain. With this Workflow Definition in place, you can now develop an Activity to send emails. @@ -236,7 +239,7 @@ Now that you've written the logic to execute the Workflow and Activity Definitio ## Build the web server The web server is used to handle requests. -This tutorial uses [Go's HTTP library](https://pkg.go.dev/net/http) as the entry point for initiating Workflow Executions and for communicating with the `/subscribe`, `/unsubscribe`, and `/details` endpoints. +This tutorial uses [Go's HTTP library](https://pkg.go.dev/net/http) as the entry point for initiating Workflow Executions and for communicating with the `/subscribe`, `/unsubscribe`, and `/details` endpoints. Create a `gateway` folder with the file `main.go`. Establish your JSON request and response structs, set the endpoint handlers, and connect to the Temporal Client. @@ -388,10 +391,10 @@ After decoding the request, use `workflowOptions` to pass in the user's email ad This ensures that the email is unique across all Workflows so that the user can't sign up multiple times. They'll only receive the emails they've subscribed to, and once they unsubscribe, they cancel the Workflow run. -With this endpoint in place, you can now send a "POST" request to `/subscribe` with an email address in the request body. +With this endpoint in place, you can now send a "POST" request to `/subscribe` with an email address in the request body. In return, you'll receive a JSON response that shows a new Workflow has started, along with a welcome email. -But how would you get details about the subscription? +But how would you get details about the subscription? In the next section, you'll query your Workflow to get back information on the state of things. ## Add a Query @@ -423,7 +426,7 @@ This Query handler returns the contents of the `emailDetails` variable. Queries You can use Queries even if the Workflow completes, which is useful for when the user unsubscribes but still wants to retrieve information about their subscription. -Now that you've added the ability to Query your Workflow, add the ability to Query from the web API. +Now that you've added the ability to Query your Workflow, add the ability to Query from the web API. Create a function called `showDetailsHandler()` in which a user can get information about their subscription details. Make sure to include error handlers to ensure proper "GET" requests and responses. @@ -584,12 +587,12 @@ func unsubscribeHandler(w http.ResponseWriter, r *http.Request) { ``` -The `CancelWorkflow()` function sends a cancellation request to the Workflow Execution you started on the `/subscribe` endpoint. +The `CancelWorkflow()` function sends a cancellation request to the Workflow Execution you started on the `/subscribe` endpoint. When the Workflow receives the cancellation request, it will cancel the Workflow Execution and return a `CancelledError` to the Workflow Execution. This is then handled by the error handlers included in the `unsubscribeHandler()` function. -Users can now send a "DELETE" request to `/unsubscribe` to cancel the Workflow associated with the request body's email address. +Users can now send a "DELETE" request to `/unsubscribe` to cancel the Workflow associated with the request body's email address. This lets users unsubscribe from the email list and prevent any further emails from sending. Now that you've added the ability to unsubscribe from the email list, test your application code to ensure it works as expected. @@ -670,9 +673,9 @@ ok subscribeemails 0.285s ``` With a cancellation request that fires after five seconds, this test shows the successful creation of a subscription as well as its cancellation. -You've successfully written, executed, and passed a Cancellation Workflow test. +You've successfully written, executed, and passed a Cancellation Workflow test. -Temporal's Go SDK provides a number of functions that help you test your Workflow Executions. +Temporal's Go SDK provides a number of functions that help you test your Workflow Executions. By following the best practices for testing your code, you can be confident that your Workflows are reliable and performant. ## Conclusion diff --git a/docs/tutorials/go/ecommerce/index.md b/docs/tutorials/go/build-ecommerce-app/index.md similarity index 92% rename from docs/tutorials/go/ecommerce/index.md rename to docs/tutorials/go/build-ecommerce-app/index.md index 3344c36d..6d7c0c36 100644 --- a/docs/tutorials/go/ecommerce/index.md +++ b/docs/tutorials/go/build-ecommerce-app/index.md @@ -1,11 +1,14 @@ --- -title: "Build an eCommerce App With Temporal and Go" +id: build-ecommerce-app +title: "Build an eCommerce App With Go" sidebar_position: 1 keywords: [Go,tutorial,temporal,workflows, sending email,testing] description: "Four-part tutorial series on building an eCommerce application with Temporal and Go." last_update: date: 2021-09-14 image: /img/temporal-logo-twitter-card.png +tags: +- Go --- ![Temporal Go SDK](/img/sdk_banners/banner_go.png) diff --git a/docs/tutorials/go/ecommerce/part1.md b/docs/tutorials/go/build-ecommerce-app/part1.md similarity index 100% rename from docs/tutorials/go/ecommerce/part1.md rename to docs/tutorials/go/build-ecommerce-app/part1.md diff --git a/docs/tutorials/go/ecommerce/part2.md b/docs/tutorials/go/build-ecommerce-app/part2.md similarity index 100% rename from docs/tutorials/go/ecommerce/part2.md rename to docs/tutorials/go/build-ecommerce-app/part2.md diff --git a/docs/tutorials/go/ecommerce/part3.md b/docs/tutorials/go/build-ecommerce-app/part3.md similarity index 100% rename from docs/tutorials/go/ecommerce/part3.md rename to docs/tutorials/go/build-ecommerce-app/part3.md diff --git a/docs/tutorials/go/ecommerce/part4.md b/docs/tutorials/go/build-ecommerce-app/part4.md similarity index 100% rename from docs/tutorials/go/ecommerce/part4.md rename to docs/tutorials/go/build-ecommerce-app/part4.md diff --git a/docs/tutorials/java/background-check/index.mdx b/docs/tutorials/java/background-check/index.mdx index 621fc978..f0c29483 100644 --- a/docs/tutorials/java/background-check/index.mdx +++ b/docs/tutorials/java/background-check/index.mdx @@ -1,12 +1,9 @@ --- id: index -title: Temporal Java SDK Background Check tutorial +title: Build a Background Check application with Java description: Learn Temporal and its features while building a Background Check application -sidebar_label: Build a Background Check application with Temporal and Java tags: - java -- long-running -- human-in-the-loop keywords: - java - long-running diff --git a/docs/tutorials/php/subscriptions/index.md b/docs/tutorials/php/build-a-recurring-billing-app/index.md similarity index 98% rename from docs/tutorials/php/subscriptions/index.md rename to docs/tutorials/php/build-a-recurring-billing-app/index.md index fd0e5de6..f5bdd31b 100644 --- a/docs/tutorials/php/subscriptions/index.md +++ b/docs/tutorials/php/build-a-recurring-billing-app/index.md @@ -1,11 +1,12 @@ --- -id: subscription-tutorial +id: build-a-recurring-billing-app-php sidebar_position: 1 keywords: [PHP, temporal, sdk, tutorial, subscriptions, signals] -tags: [PHP, SDK] +tags: +- PHP last_update: date: 2021-10-01 -title: Subscription walkthrough with Temporal in PHP +title: Build a recurring billing subscription system with PHP description: In this tutorial you'll build a realistic monthly subscription payments workflow that can be canceled while it runs. image: /img/temporal-logo-twitter-card.png --- @@ -34,7 +35,7 @@ Of course, this all has to be fault-tolerant, scalable to millions of customers, ## Prerequisites - [Set up a local development environment for developing Temporal applications using PHP](/getting_started/php/dev_environment/index.md) -- Review the [Hello World in PHP tutorial](/getting_started/php/hello_world_in_php/index.md) and understood the basics of getting a Temporal PHP SDK project up and running. +- Review the [Hello World in PHP tutorial](/getting_started/php/hello_world_in_php/index.md) and understood the basics of getting a Temporal PHP SDK project up and running. ## Create the Workflow diff --git a/docs/tutorials/php/booking_saga/images/booking-saga-flow.png b/docs/tutorials/php/build_a_trip_booking_app/images/booking-saga-flow.png similarity index 100% rename from docs/tutorials/php/booking_saga/images/booking-saga-flow.png rename to docs/tutorials/php/build_a_trip_booking_app/images/booking-saga-flow.png diff --git a/docs/tutorials/php/booking_saga/index.md b/docs/tutorials/php/build_a_trip_booking_app/index.md similarity index 98% rename from docs/tutorials/php/booking_saga/index.md rename to docs/tutorials/php/build_a_trip_booking_app/index.md index 09d73fef..d2c85e2c 100644 --- a/docs/tutorials/php/booking_saga/index.md +++ b/docs/tutorials/php/build_a_trip_booking_app/index.md @@ -1,11 +1,13 @@ --- -id: booking-saga-tutorial +id: build_a_trip_booking_app-php +title: Build a trip booking system with PHP sidebar_position: 1 keywords: [PHP, temporal, sdk, tutorial, saga pattern, transactions, compensations] -tags: [PHP, SDK, Saga] +tags: +- php +- saga last_update: date: 2021-10-01 -title: Create a trip booking system with the Saga pattern and Temporal in PHP description: In this tutorial, you'll explore the different components that make up the Temporal Booking Saga code sample. image: /img/temporal-logo-twitter-card.png --- @@ -31,7 +33,7 @@ All of these steps together make up a **distributed transaction** that crosses ## Prerequisites - [Set up a local development environment for developing Temporal applications using PHP](/getting_started/php/dev_environment/index.md) -- Review the [Hello World in PHP tutorial](/getting_started/php/hello_world_in_php/index.md) to understood the basics of getting a Temporal PHP SDK project up and running. +- Review the [Hello World in PHP tutorial](/getting_started/php/hello_world_in_php/index.md) to understood the basics of getting a Temporal PHP SDK project up and running. ## Review the Saga architecture pattern diff --git a/docs/tutorials/python/data-pipelines/index.md b/docs/tutorials/python/build-a-data-pipeline/index.md similarity index 99% rename from docs/tutorials/python/data-pipelines/index.md rename to docs/tutorials/python/build-a-data-pipeline/index.md index ee375d48..9364d52f 100644 --- a/docs/tutorials/python/data-pipelines/index.md +++ b/docs/tutorials/python/build-a-data-pipeline/index.md @@ -1,11 +1,11 @@ --- -id: data-pipeline-tutorial +title: Build a data pipeline with Python +id: build-a-data-pipeline-python sidebar_position: 3 keywords: [Python, temporal, sdk, tutorial] tags: [Python, SDK] last_update: date: 2023-05-01 -title: Build a data pipeline Workflow with Temporal and Python description: You'll implement a data pipeline application in Python, using Temporal's Workflows, Activities, and Schedules to orchestrate and run the steps in your pipeline. image: /img/temporal-logo-twitter-card.png --- @@ -283,7 +283,7 @@ For this example, `stories` is processed by a [Pandas Data Frame](https://pandas The code runs in an `asyncio` event loop. -To run your code, open two terminal windows. +To run your code, open two terminal windows. In the first terminal, run this command to start the worker: @@ -330,7 +330,7 @@ You've successfully run your Workflow and explored the Event History, now schedu You just built and ran a Workflow, that returns information from your data pipeline. Now, you'll run this Workflow on a schedule. Cron jobs have a reputation for fragility because they run commands in a different environment than the user's shell, which can lead to configuration management issues and random machine failures. -Additionally, cron errors are not always directed to live email, making it hard to know when things go wrong. +Additionally, cron errors are not always directed to live email, making it hard to know when things go wrong. While newer systems like systemd timers and Kubernetes cron jobs fix some of these issues, there is still a reliance on the archaic five-field string syntax for specifying times. Fortunately, Temporal provides an alternative solution for scheduling workflows that doesn't require configuring additional dependencies or worrying about system alerts. diff --git a/docs/tutorials/python/subscriptions/index.md b/docs/tutorials/python/build-an-email-drip-campaign/index.md similarity index 99% rename from docs/tutorials/python/subscriptions/index.md rename to docs/tutorials/python/build-an-email-drip-campaign/index.md index 72633e3f..084874e0 100644 --- a/docs/tutorials/python/subscriptions/index.md +++ b/docs/tutorials/python/build-an-email-drip-campaign/index.md @@ -1,11 +1,13 @@ --- -id: subscription-tutorial +id: build-an-email-drip-campaign-python +title: Build an email drip campaign with Python sidebar_position: 3 keywords: [Python, temporal, sdk, tutorial, entity workflow, email subscription, sending emails] -tags: [Python, SDK] +tags: +- Python +- entity workflow last_update: date: 2024-03-06 -title: Build an email subscription workflow with Temporal and Python description: Implement an email subscription application with Temporal's Workflows, Activities, and Queries, and allow users to start your business logic through a web action. image: /img/temporal-logo-twitter-card.png --- diff --git a/docs/tutorials/typescript/background-check/index.mdx b/docs/tutorials/typescript/background-check/index.mdx index 5313a52f..69a8c3b8 100644 --- a/docs/tutorials/typescript/background-check/index.mdx +++ b/docs/tutorials/typescript/background-check/index.mdx @@ -1,12 +1,9 @@ --- id: index -title: Temporal Typescript SDK Background Check tutorial +title: Build a Background Check application with TypeScript description: Learn Temporal and its features while building a Background Check application -sidebar_label: Build a Background Check application with Temporal and Typescript tags: - typescript -- long-running -- human-in-the-loop keywords: - typescript - long-running diff --git a/docs/tutorials/typescript/subscriptions/index.md b/docs/tutorials/typescript/build-a-recurring-billing-app/index.md similarity index 98% rename from docs/tutorials/typescript/subscriptions/index.md rename to docs/tutorials/typescript/build-a-recurring-billing-app/index.md index 6cf9152b..29457b30 100644 --- a/docs/tutorials/typescript/subscriptions/index.md +++ b/docs/tutorials/typescript/build-a-recurring-billing-app/index.md @@ -1,11 +1,12 @@ --- -id: subscription-tutorial +id: build-a-recurring-billing-app-ts +title: Build a recurring billing subscription system with TypeScript sidebar_position: 3 keywords: [TypeScript, temporal, sdk, tutorial] -tags: [TypeScript, SDK] +tags: +- TypeScript last_update: date: 2021-10-01 -title: Build a subscription workflow with Temporal and TypeScript description: In this tutorial, we will tour all of the Workflow APIs you should know, primarily Signals, Queries, `condition`, and `sleep`, by building a realistic monthly subscription payments workflow that can be canceled and changed while it runs. image: /img/temporal-logo-twitter-card.png --- @@ -412,5 +413,5 @@ These are meant to be low level primitives, and it is entirely expected that you Two paths from here: - **Go Full Stack**: Integrate the manually-run Temporal Client scripts you have written here into an Express.js app, or serverless function. - Our [Next.js Tutorial](/tutorials/typescript/nextjs/index.md) should help show you how to integrate this with a frontend app, and give indications on how to deploy. + Our [Next.js Tutorial](/tutorials/typescript/build-one-click-order-app-nextjs/index.md) should help show you how to integrate this with a frontend app, and give indications on how to deploy. - **Learn More**: Explore using [Child Workflows](https://docs.temporal.io/typescript/workflows#child-workflows) and [`continueAsNew`](https://docs.temporal.io/typescript/workflows#continueasnew) so that your subscriptions can keep running indefinitely. diff --git a/docs/tutorials/typescript/chatbot/index.md b/docs/tutorials/typescript/build-choose-your-own-adventure-bot/index.md similarity index 93% rename from docs/tutorials/typescript/chatbot/index.md rename to docs/tutorials/typescript/build-choose-your-own-adventure-bot/index.md index 56ccedd0..ac7ebe27 100644 --- a/docs/tutorials/typescript/chatbot/index.md +++ b/docs/tutorials/typescript/build-choose-your-own-adventure-bot/index.md @@ -1,11 +1,12 @@ --- -id: chatbot-tutorial +id: build-choose-your-own-adventure-bot-ts sidebar_position: 4 keywords: [TypeScript, temporal, sdk, tutorial] -tags: [TypeScript, SDK] +tags: +- TypeScript last_update: date: 2021-10-01 -title: Choose Your Own Adventure Bot walkthrough in TypeScript +title: Build a Choose Your Own Adventure Bot in TypeScript description: In this tutorial, we'll integrate all the knowledge gained from Core and Production APIs in an end-to-end, complete demo application. image: /img/temporal-logo-twitter-card.png --- @@ -51,15 +52,15 @@ import { ResponsivePlayer } from '@site/src/components' -[00:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=0s) Project Intro and Demo -[03:30](https://youtube.com/watch?v=hGIhc6m2keQ&t=210s) Temporal Worker - Activity Dependency Injection -[07:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=420s) Temporal Sinks for Logging -[08:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=480s) Temporal Client -[10:50](https://youtube.com/watch?v=hGIhc6m2keQ&t=650s) RunGame Workflow and Game Logic -[13:45](https://youtube.com/watch?v=hGIhc6m2keQ&t=825s) Async Race Design Pattern: Timers vs Humans -[15:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=900s) Design Pattern: Polling -[18:05](https://youtube.com/watch?v=hGIhc6m2keQ&t=1085s) Signals -[20:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=1200s) HTTP Server for Signal +[00:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=0s) Project Intro and Demo +[03:30](https://youtube.com/watch?v=hGIhc6m2keQ&t=210s) Temporal Worker - Activity Dependency Injection +[07:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=420s) Temporal Sinks for Logging +[08:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=480s) Temporal Client +[10:50](https://youtube.com/watch?v=hGIhc6m2keQ&t=650s) RunGame Workflow and Game Logic +[13:45](https://youtube.com/watch?v=hGIhc6m2keQ&t=825s) Async Race Design Pattern: Timers vs Humans +[15:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=900s) Design Pattern: Polling +[18:05](https://youtube.com/watch?v=hGIhc6m2keQ&t=1085s) Signals +[20:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=1200s) HTTP Server for Signal [23:00](https://youtube.com/watch?v=hGIhc6m2keQ&t=1380s) ContinueAsNew diff --git a/docs/tutorials/typescript/nextjs/index.md b/docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md similarity index 98% rename from docs/tutorials/typescript/nextjs/index.md rename to docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md index 4288edf4..08d89633 100644 --- a/docs/tutorials/typescript/nextjs/index.md +++ b/docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md @@ -1,11 +1,12 @@ --- -id: nextjs-tutorial +id: build-one-click-order-app-nextjs +title: Build a one-click order application with TypeScript and Next.js sidebar_position: 2 keywords: [TypeScript, temporal, sdk, tutorial, NextJS] -tags: [TypeScript, SDK] +tags: +- TypeScript last_update: date: 2021-10-01 -title: Integrating Temporal into an existing Next.js application description: Explore how Temporal integrates into an existing Next.js application using Next.js API routes. This gives you the ability to write full-stack, long-running applications end to end in TypeScript. image: /img/temporal-logo-twitter-card.png --- diff --git a/vercel.json b/vercel.json index 1e9c7bc3..dfbe135b 100644 --- a/vercel.json +++ b/vercel.json @@ -1,3 +1,49 @@ { - "trailingSlash": true + "trailingSlash": true, + "redirects": [ + { + "source": "/tutorials/go/ecommerce", + "destination": "/tutorials/go/build-ecommerce-app", + "permanent": true + }, + { + "source": "/tutorials/go/subscriptions", + "destination": "/tutorials/go/build-an-email_drip_campaign", + "permanent": true + }, + { + "source": "/tutorials/php/booking_saga", + "destination": "/tutorials/php/build_a_trip_booking_app", + "permanent": true + }, + { + "source": "/tutorials/php/subscriptiosn", + "destination": "/tutorials/php/build-a-recurring-billing-app", + "permanent": true + }, + { + "source": "/tutorials/python/subscriptions", + "destination": "/tutorials/python/build-an-email-drip-campaign", + "permanent": true + }, + { + "source": "/tutorials/python/data-pipelines", + "destination": "/tutorials/python/build-a-data-pipeline", + "permanent": true + }, + { + "source": "/tutorials/typescript/subscriptiosn", + "destination": "/tutorials/typescript/build-a-recurring-billing-app", + "permanent": true + }, + { + "source": "/tutorials/typescript/nextjs", + "destination": "/tutorials/typescript/build-one-click-order-app-nextjs", + "permanent": true + }, + "source": "/tutorials/typescript/chatbot", + "destination": "/tutorials/typescript/build-choose-your-own-adventure-bot", + "permanent": true + } + ] } From 701e72c28143dfca91b6cfa62446c2c149658437 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Thu, 11 Jul 2024 12:03:16 -0500 Subject: [PATCH 02/16] fixed yaml --- docs/tutorials/python/build-an-email-drip-campaign/index.md | 1 - .../typescript/build-one-click-order-app-nextjs/index.md | 2 -- 2 files changed, 3 deletions(-) diff --git a/docs/tutorials/python/build-an-email-drip-campaign/index.md b/docs/tutorials/python/build-an-email-drip-campaign/index.md index abffe892..084874e0 100644 --- a/docs/tutorials/python/build-an-email-drip-campaign/index.md +++ b/docs/tutorials/python/build-an-email-drip-campaign/index.md @@ -8,7 +8,6 @@ tags: - entity workflow last_update: date: 2024-03-06 -title: Build an email subscription Workflow with Temporal and Python description: Implement an email subscription application with Temporal's Workflows, Activities, and Queries, and allow users to start your business logic through a web action. image: /img/temporal-logo-twitter-card.png --- diff --git a/docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md b/docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md index 7578f897..432bf37a 100644 --- a/docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md +++ b/docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md @@ -5,8 +5,6 @@ sidebar_position: 2 keywords: [TypeScript, temporal, sdk, tutorial, NextJS] tags: - TypeScript -title: Integrating Temporal into an existing Next.js application -description: Explore how Temporal integrates into an existing Next.js application using Next.js API routes. This gives you the ability to write full-stack, long-running applications end to end in TypeScript. last_update: date: 2024-06-28 description: Build a One-Click Buy application with Next.js and integrate Temporal using Next.js API routes to create a durable order processing backend. From 5a88405ea2ad81d8469eb034417a623d8187e5e7 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Thu, 11 Jul 2024 12:20:59 -0500 Subject: [PATCH 03/16] fix json and align front matter --- docs/tutorials/go/build-an-email-drip-campaign/index.md | 8 ++++---- docs/tutorials/go/build-ecommerce-app/index.md | 8 ++++---- docs/tutorials/go/build-ecommerce-app/part1.md | 2 +- .../tutorials/php/build-a-recurring-billing-app/index.md | 6 +++--- docs/tutorials/php/build_a_trip_booking_app/index.md | 4 ++-- docs/tutorials/python/background-check/index.mdx | 4 +--- docs/tutorials/python/build-a-data-pipeline/index.md | 9 +++++---- docs/tutorials/typescript/background-check/index.mdx | 1 - .../typescript/build-a-recurring-billing-app/index.md | 4 ++-- .../build-choose-your-own-adventure-bot/index.md | 8 ++++---- .../typescript/build-one-click-order-app-nextjs/index.md | 8 ++++---- vercel.json | 1 + 12 files changed, 31 insertions(+), 32 deletions(-) diff --git a/docs/tutorials/go/build-an-email-drip-campaign/index.md b/docs/tutorials/go/build-an-email-drip-campaign/index.md index 9f0ec5b0..1225e1eb 100644 --- a/docs/tutorials/go/build-an-email-drip-campaign/index.md +++ b/docs/tutorials/go/build-an-email-drip-campaign/index.md @@ -2,13 +2,13 @@ id: build-an-email-drip-campaign-go title: Build an email drip campaign with Go sidebar_position: 3 -keywords: [Go,tutorial,temporal,workflows,SDK,subscription] description: Implement an email subscription application in Go with Temporal's Workflows, Activities, and Queries, using the Temporal Client in a web API. -last_update: - date: 2023-09-28 -image: /img/temporal-logo-twitter-card.png +keywords: [Go,tutorial,temporal,workflows,SDK,subscription] tags: - Go +image: /img/temporal-logo-twitter-card.png +last_update: + date: 2023-09-28 --- ### Introduction diff --git a/docs/tutorials/go/build-ecommerce-app/index.md b/docs/tutorials/go/build-ecommerce-app/index.md index 6d7c0c36..683506d9 100644 --- a/docs/tutorials/go/build-ecommerce-app/index.md +++ b/docs/tutorials/go/build-ecommerce-app/index.md @@ -2,13 +2,13 @@ id: build-ecommerce-app title: "Build an eCommerce App With Go" sidebar_position: 1 -keywords: [Go,tutorial,temporal,workflows, sending email,testing] description: "Four-part tutorial series on building an eCommerce application with Temporal and Go." -last_update: - date: 2021-09-14 -image: /img/temporal-logo-twitter-card.png +keywords: [Go,tutorial,temporal,workflows, sending email,testing] tags: - Go +image: /img/temporal-logo-twitter-card.png +last_update: + date: 2021-09-14 --- ![Temporal Go SDK](/img/sdk_banners/banner_go.png) diff --git a/docs/tutorials/go/build-ecommerce-app/part1.md b/docs/tutorials/go/build-ecommerce-app/part1.md index 9ae1f207..fc212381 100644 --- a/docs/tutorials/go/build-ecommerce-app/part1.md +++ b/docs/tutorials/go/build-ecommerce-app/part1.md @@ -6,10 +6,10 @@ tags: - tutorial keywords: [go, golang, temporal, sdk, tutorial, workflows, ecommerce] slug: build-an-ecommerce-app-with-temporal-part-1 +image: /img/temporal-logo-twitter-card.png last_update: date: 2021-05-18 author: Valeri Karpov -image: /img/temporal-logo-twitter-card.png --- ![Temporal Go SDK](/img/sdk_banners/banner_go.png) diff --git a/docs/tutorials/php/build-a-recurring-billing-app/index.md b/docs/tutorials/php/build-a-recurring-billing-app/index.md index f5bdd31b..fb3f79ba 100644 --- a/docs/tutorials/php/build-a-recurring-billing-app/index.md +++ b/docs/tutorials/php/build-a-recurring-billing-app/index.md @@ -1,14 +1,14 @@ --- id: build-a-recurring-billing-app-php +title: Build a recurring billing subscription system with PHP sidebar_position: 1 +description: In this tutorial you'll build a realistic monthly subscription payments workflow that can be canceled while it runs. keywords: [PHP, temporal, sdk, tutorial, subscriptions, signals] tags: - PHP +image: /img/temporal-logo-twitter-card.png last_update: date: 2021-10-01 -title: Build a recurring billing subscription system with PHP -description: In this tutorial you'll build a realistic monthly subscription payments workflow that can be canceled while it runs. -image: /img/temporal-logo-twitter-card.png --- ![Temporal PHP SDK](/img/sdk_banners/banner_php.png) diff --git a/docs/tutorials/php/build_a_trip_booking_app/index.md b/docs/tutorials/php/build_a_trip_booking_app/index.md index d2c85e2c..beea83f8 100644 --- a/docs/tutorials/php/build_a_trip_booking_app/index.md +++ b/docs/tutorials/php/build_a_trip_booking_app/index.md @@ -2,14 +2,14 @@ id: build_a_trip_booking_app-php title: Build a trip booking system with PHP sidebar_position: 1 +description: In this tutorial, you'll explore the different components that make up the Temporal Booking Saga code sample. keywords: [PHP, temporal, sdk, tutorial, saga pattern, transactions, compensations] tags: - php - saga +image: /img/temporal-logo-twitter-card.png last_update: date: 2021-10-01 -description: In this tutorial, you'll explore the different components that make up the Temporal Booking Saga code sample. -image: /img/temporal-logo-twitter-card.png --- ![Temporal PHP SDK](/img/sdk_banners/banner_php.png) diff --git a/docs/tutorials/python/background-check/index.mdx b/docs/tutorials/python/background-check/index.mdx index 6f1dafda..e954d186 100644 --- a/docs/tutorials/python/background-check/index.mdx +++ b/docs/tutorials/python/background-check/index.mdx @@ -1,12 +1,10 @@ --- id: index title: Temporal Python SDK Background Check tutorial -description: Learn Temporal and its features while building a Background Check application sidebar_label: Build a Background Check application with Temporal and Python +description: Learn Temporal and its features while building a Background Check application tags: - python -- long-running -- human-in-the-loop keywords: - python - long-running diff --git a/docs/tutorials/python/build-a-data-pipeline/index.md b/docs/tutorials/python/build-a-data-pipeline/index.md index 9364d52f..7b4fab50 100644 --- a/docs/tutorials/python/build-a-data-pipeline/index.md +++ b/docs/tutorials/python/build-a-data-pipeline/index.md @@ -1,13 +1,14 @@ --- -title: Build a data pipeline with Python id: build-a-data-pipeline-python +title: Build a data pipeline with Python sidebar_position: 3 +description: You'll implement a data pipeline application in Python, using Temporal's Workflows, Activities, and Schedules to orchestrate and run the steps in your pipeline. keywords: [Python, temporal, sdk, tutorial] -tags: [Python, SDK] +tags: +- Python +image: /img/temporal-logo-twitter-card.png last_update: date: 2023-05-01 -description: You'll implement a data pipeline application in Python, using Temporal's Workflows, Activities, and Schedules to orchestrate and run the steps in your pipeline. -image: /img/temporal-logo-twitter-card.png --- ![Temporal Python SDK](/img/sdk_banners/banner_python.png) diff --git a/docs/tutorials/typescript/background-check/index.mdx b/docs/tutorials/typescript/background-check/index.mdx index eeaa2f12..21a4baa7 100644 --- a/docs/tutorials/typescript/background-check/index.mdx +++ b/docs/tutorials/typescript/background-check/index.mdx @@ -2,7 +2,6 @@ id: index title: Build a Background Check application with TypeScript description: Learn Temporal and its features while building a Background Check application -sidebar_label: Build a Background Check application with Temporal and TypeScript tags: - typescript keywords: diff --git a/docs/tutorials/typescript/build-a-recurring-billing-app/index.md b/docs/tutorials/typescript/build-a-recurring-billing-app/index.md index 29457b30..8012303e 100644 --- a/docs/tutorials/typescript/build-a-recurring-billing-app/index.md +++ b/docs/tutorials/typescript/build-a-recurring-billing-app/index.md @@ -2,13 +2,13 @@ id: build-a-recurring-billing-app-ts title: Build a recurring billing subscription system with TypeScript sidebar_position: 3 +description: In this tutorial, we will tour all of the Workflow APIs you should know, primarily Signals, Queries, `condition`, and `sleep`, by building a realistic monthly subscription payments workflow that can be canceled and changed while it runs. keywords: [TypeScript, temporal, sdk, tutorial] tags: - TypeScript +image: /img/temporal-logo-twitter-card.png last_update: date: 2021-10-01 -description: In this tutorial, we will tour all of the Workflow APIs you should know, primarily Signals, Queries, `condition`, and `sleep`, by building a realistic monthly subscription payments workflow that can be canceled and changed while it runs. -image: /img/temporal-logo-twitter-card.png --- ![Temporal TypeScript SDK](/img/sdk_banners/banner_typescript.png) diff --git a/docs/tutorials/typescript/build-choose-your-own-adventure-bot/index.md b/docs/tutorials/typescript/build-choose-your-own-adventure-bot/index.md index ac7ebe27..975dca44 100644 --- a/docs/tutorials/typescript/build-choose-your-own-adventure-bot/index.md +++ b/docs/tutorials/typescript/build-choose-your-own-adventure-bot/index.md @@ -1,14 +1,14 @@ --- id: build-choose-your-own-adventure-bot-ts +title: Build a Choose Your Own Adventure Bot in TypeScript sidebar_position: 4 -keywords: [TypeScript, temporal, sdk, tutorial] +description: In this tutorial, we'll integrate all the knowledge gained from Core and Production APIs in an end-to-end, complete demo application. tags: - TypeScript +keywords: [TypeScript, temporal, sdk, tutorial] +image: /img/temporal-logo-twitter-card.png last_update: date: 2021-10-01 -title: Build a Choose Your Own Adventure Bot in TypeScript -description: In this tutorial, we'll integrate all the knowledge gained from Core and Production APIs in an end-to-end, complete demo application. -image: /img/temporal-logo-twitter-card.png --- ![Temporal TypeScript SDK](/img/sdk_banners/banner_typescript.png) diff --git a/docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md b/docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md index 432bf37a..7be577f0 100644 --- a/docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md +++ b/docs/tutorials/typescript/build-one-click-order-app-nextjs/index.md @@ -2,14 +2,14 @@ id: build-one-click-order-app-nextjs title: Build a one-click order application with TypeScript and Next.js sidebar_position: 2 -keywords: [TypeScript, temporal, sdk, tutorial, NextJS] +description: Build a One-Click Buy application with Next.js and integrate Temporal using Next.js API routes to create a durable order processing backend. tags: - TypeScript +keywords: [TypeScript, temporal, sdk, tutorial, NextJS] +image: /img/temporal-logo-twitter-card.png +code_repo: https://github.com/temporalio/nextjs-temporal-one-click-template/ last_update: date: 2024-06-28 -description: Build a One-Click Buy application with Next.js and integrate Temporal using Next.js API routes to create a durable order processing backend. -image: /img/temporal-logo-twitter-card.png -repository: https://github.com/temporalio/nextjs-temporal-one-click-template/ --- ![Temporal TypeScript SDK](/img/sdk_banners/banner_typescript.png) diff --git a/vercel.json b/vercel.json index dfbe135b..141561fc 100644 --- a/vercel.json +++ b/vercel.json @@ -41,6 +41,7 @@ "destination": "/tutorials/typescript/build-one-click-order-app-nextjs", "permanent": true }, + { "source": "/tutorials/typescript/chatbot", "destination": "/tutorials/typescript/build-choose-your-own-adventure-bot", "permanent": true From 44e9529210564dc74b0cd7a538e7413442934f36 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Thu, 11 Jul 2024 12:29:18 -0500 Subject: [PATCH 04/16] redirect test --- vercel.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vercel.json b/vercel.json index 141561fc..6f09196d 100644 --- a/vercel.json +++ b/vercel.json @@ -37,8 +37,8 @@ "permanent": true }, { - "source": "/tutorials/typescript/nextjs", - "destination": "/tutorials/typescript/build-one-click-order-app-nextjs", + "source": "/tutorials/typescript/nextjs/", + "destination": "/tutorials/typescript/build-one-click-order-app-nextjs/", "permanent": true }, { From 4a25cfe9b306f93dedd966b0f622f703e925adec Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Thu, 11 Jul 2024 12:32:08 -0500 Subject: [PATCH 05/16] redirects with slashes --- vercel.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/vercel.json b/vercel.json index 6f09196d..83863d22 100644 --- a/vercel.json +++ b/vercel.json @@ -2,38 +2,38 @@ "trailingSlash": true, "redirects": [ { - "source": "/tutorials/go/ecommerce", - "destination": "/tutorials/go/build-ecommerce-app", + "source": "/tutorials/go/ecommerce/", + "destination": "/tutorials/go/build-ecommerce-app/", "permanent": true }, { - "source": "/tutorials/go/subscriptions", - "destination": "/tutorials/go/build-an-email_drip_campaign", + "source": "/tutorials/go/subscriptions/", + "destination": "/tutorials/go/build-an-email_drip_campaign/", "permanent": true }, { - "source": "/tutorials/php/booking_saga", - "destination": "/tutorials/php/build_a_trip_booking_app", + "source": "/tutorials/php/booking_saga/", + "destination": "/tutorials/php/build_a_trip_booking_app/", "permanent": true }, { - "source": "/tutorials/php/subscriptiosn", - "destination": "/tutorials/php/build-a-recurring-billing-app", + "source": "/tutorials/php/subscriptiosn/", + "destination": "/tutorials/php/build-a-recurring-billing-app/", "permanent": true }, { - "source": "/tutorials/python/subscriptions", - "destination": "/tutorials/python/build-an-email-drip-campaign", + "source": "/tutorials/python/subscriptions/", + "destination": "/tutorials/python/build-an-email-drip-campaign/", "permanent": true }, { - "source": "/tutorials/python/data-pipelines", - "destination": "/tutorials/python/build-a-data-pipeline", + "source": "/tutorials/python/data-pipelines/", + "destination": "/tutorials/python/build-a-data-pipeline/", "permanent": true }, { - "source": "/tutorials/typescript/subscriptiosn", - "destination": "/tutorials/typescript/build-a-recurring-billing-app", + "source": "/tutorials/typescript/subscriptions/", + "destination": "/tutorials/typescript/build-a-recurring-billing-app/", "permanent": true }, { @@ -42,8 +42,8 @@ "permanent": true }, { - "source": "/tutorials/typescript/chatbot", - "destination": "/tutorials/typescript/build-choose-your-own-adventure-bot", + "source": "/tutorials/typescript/chatbot/", + "destination": "/tutorials/typescript/build-choose-your-own-adventure-bot/", "permanent": true } ] From 67a4350a374ac7d79ed60c6288a96700a557ba0d Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Thu, 11 Jul 2024 14:10:41 -0500 Subject: [PATCH 06/16] revert typescript subscription since draft is in flight --- .../index.md | 13 ++++++------- vercel.json | 5 ----- 2 files changed, 6 insertions(+), 12 deletions(-) rename docs/tutorials/typescript/{build-a-recurring-billing-app => subscriptions}/index.md (98%) diff --git a/docs/tutorials/typescript/build-a-recurring-billing-app/index.md b/docs/tutorials/typescript/subscriptions/index.md similarity index 98% rename from docs/tutorials/typescript/build-a-recurring-billing-app/index.md rename to docs/tutorials/typescript/subscriptions/index.md index 8012303e..6cf9152b 100644 --- a/docs/tutorials/typescript/build-a-recurring-billing-app/index.md +++ b/docs/tutorials/typescript/subscriptions/index.md @@ -1,14 +1,13 @@ --- -id: build-a-recurring-billing-app-ts -title: Build a recurring billing subscription system with TypeScript +id: subscription-tutorial sidebar_position: 3 -description: In this tutorial, we will tour all of the Workflow APIs you should know, primarily Signals, Queries, `condition`, and `sleep`, by building a realistic monthly subscription payments workflow that can be canceled and changed while it runs. keywords: [TypeScript, temporal, sdk, tutorial] -tags: -- TypeScript -image: /img/temporal-logo-twitter-card.png +tags: [TypeScript, SDK] last_update: date: 2021-10-01 +title: Build a subscription workflow with Temporal and TypeScript +description: In this tutorial, we will tour all of the Workflow APIs you should know, primarily Signals, Queries, `condition`, and `sleep`, by building a realistic monthly subscription payments workflow that can be canceled and changed while it runs. +image: /img/temporal-logo-twitter-card.png --- ![Temporal TypeScript SDK](/img/sdk_banners/banner_typescript.png) @@ -413,5 +412,5 @@ These are meant to be low level primitives, and it is entirely expected that you Two paths from here: - **Go Full Stack**: Integrate the manually-run Temporal Client scripts you have written here into an Express.js app, or serverless function. - Our [Next.js Tutorial](/tutorials/typescript/build-one-click-order-app-nextjs/index.md) should help show you how to integrate this with a frontend app, and give indications on how to deploy. + Our [Next.js Tutorial](/tutorials/typescript/nextjs/index.md) should help show you how to integrate this with a frontend app, and give indications on how to deploy. - **Learn More**: Explore using [Child Workflows](https://docs.temporal.io/typescript/workflows#child-workflows) and [`continueAsNew`](https://docs.temporal.io/typescript/workflows#continueasnew) so that your subscriptions can keep running indefinitely. diff --git a/vercel.json b/vercel.json index 83863d22..bff18221 100644 --- a/vercel.json +++ b/vercel.json @@ -31,11 +31,6 @@ "destination": "/tutorials/python/build-a-data-pipeline/", "permanent": true }, - { - "source": "/tutorials/typescript/subscriptions/", - "destination": "/tutorials/typescript/build-a-recurring-billing-app/", - "permanent": true - }, { "source": "/tutorials/typescript/nextjs/", "destination": "/tutorials/typescript/build-one-click-order-app-nextjs/", From dfb5e61d837b242d6b6e53593c944681cbe99382 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Thu, 11 Jul 2024 15:20:56 -0500 Subject: [PATCH 07/16] revert js link --- docs/tutorials/typescript/subscriptions/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/typescript/subscriptions/index.md b/docs/tutorials/typescript/subscriptions/index.md index 6cf9152b..1b7acf13 100644 --- a/docs/tutorials/typescript/subscriptions/index.md +++ b/docs/tutorials/typescript/subscriptions/index.md @@ -412,5 +412,5 @@ These are meant to be low level primitives, and it is entirely expected that you Two paths from here: - **Go Full Stack**: Integrate the manually-run Temporal Client scripts you have written here into an Express.js app, or serverless function. - Our [Next.js Tutorial](/tutorials/typescript/nextjs/index.md) should help show you how to integrate this with a frontend app, and give indications on how to deploy. + Our [Next.js Tutorial](/tutorials/typescript/build-one-click-order-app-nextjs/index.md) should help show you how to integrate this with a frontend app, and give indications on how to deploy. - **Learn More**: Explore using [Child Workflows](https://docs.temporal.io/typescript/workflows#child-workflows) and [`continueAsNew`](https://docs.temporal.io/typescript/workflows#continueasnew) so that your subscriptions can keep running indefinitely. From ce9d98c54dc169eb0237b529e3cb9156543647d0 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Thu, 11 Jul 2024 15:31:27 -0500 Subject: [PATCH 08/16] fix paths --- .../index.md | 0 .../part1.md | 0 .../part2.md | 0 .../part3.md | 0 .../part4.md | 0 vercel.json | 6 +++--- 6 files changed, 3 insertions(+), 3 deletions(-) rename docs/tutorials/go/{build-ecommerce-app => build-an-ecommerce-app}/index.md (100%) rename docs/tutorials/go/{build-ecommerce-app => build-an-ecommerce-app}/part1.md (100%) rename docs/tutorials/go/{build-ecommerce-app => build-an-ecommerce-app}/part2.md (100%) rename docs/tutorials/go/{build-ecommerce-app => build-an-ecommerce-app}/part3.md (100%) rename docs/tutorials/go/{build-ecommerce-app => build-an-ecommerce-app}/part4.md (100%) diff --git a/docs/tutorials/go/build-ecommerce-app/index.md b/docs/tutorials/go/build-an-ecommerce-app/index.md similarity index 100% rename from docs/tutorials/go/build-ecommerce-app/index.md rename to docs/tutorials/go/build-an-ecommerce-app/index.md diff --git a/docs/tutorials/go/build-ecommerce-app/part1.md b/docs/tutorials/go/build-an-ecommerce-app/part1.md similarity index 100% rename from docs/tutorials/go/build-ecommerce-app/part1.md rename to docs/tutorials/go/build-an-ecommerce-app/part1.md diff --git a/docs/tutorials/go/build-ecommerce-app/part2.md b/docs/tutorials/go/build-an-ecommerce-app/part2.md similarity index 100% rename from docs/tutorials/go/build-ecommerce-app/part2.md rename to docs/tutorials/go/build-an-ecommerce-app/part2.md diff --git a/docs/tutorials/go/build-ecommerce-app/part3.md b/docs/tutorials/go/build-an-ecommerce-app/part3.md similarity index 100% rename from docs/tutorials/go/build-ecommerce-app/part3.md rename to docs/tutorials/go/build-an-ecommerce-app/part3.md diff --git a/docs/tutorials/go/build-ecommerce-app/part4.md b/docs/tutorials/go/build-an-ecommerce-app/part4.md similarity index 100% rename from docs/tutorials/go/build-ecommerce-app/part4.md rename to docs/tutorials/go/build-an-ecommerce-app/part4.md diff --git a/vercel.json b/vercel.json index bff18221..ce76d8e1 100644 --- a/vercel.json +++ b/vercel.json @@ -3,12 +3,12 @@ "redirects": [ { "source": "/tutorials/go/ecommerce/", - "destination": "/tutorials/go/build-ecommerce-app/", + "destination": "/tutorials/go/build-an-ecommerce-app/", "permanent": true }, { "source": "/tutorials/go/subscriptions/", - "destination": "/tutorials/go/build-an-email_drip_campaign/", + "destination": "/tutorials/go/build-an-email-drip-campaign/", "permanent": true }, { @@ -17,7 +17,7 @@ "permanent": true }, { - "source": "/tutorials/php/subscriptiosn/", + "source": "/tutorials/php/subscriptions/", "destination": "/tutorials/php/build-a-recurring-billing-app/", "permanent": true }, From 1cea39781c6c94ea0657a2e868fad7e63edc76a5 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Mon, 29 Jul 2024 12:14:06 -0500 Subject: [PATCH 09/16] rename file --- docs/tutorials/python/background-check/introduction.mdx | 2 +- docs/tutorials/typescript/background-check/introduction.mdx | 2 +- .../index.md | 4 ++-- vercel.json | 5 +++++ 4 files changed, 9 insertions(+), 4 deletions(-) rename docs/tutorials/typescript/{subscriptions => recurring-billing-subscription}/index.md (99%) diff --git a/docs/tutorials/python/background-check/introduction.mdx b/docs/tutorials/python/background-check/introduction.mdx index 6c6d59c5..e2008f0d 100644 --- a/docs/tutorials/python/background-check/introduction.mdx +++ b/docs/tutorials/python/background-check/introduction.mdx @@ -112,7 +112,7 @@ Additional Python code samples are in the [temporalio/samples-python](https://gi - [Temporal 101 with Python](https://learn.temporal.io/courses/temporal_101/python) - [Python tutorials](https://learn.temporal.io/tutorials/python/) - [Build a data pipeline Workflow with Temporal and Python](https://learn.temporal.io/tutorials/python/data-pipelines/) - - [Build a subscription workflow with Temporal and Python](https://learn.temporal.io/tutorials/python/subscriptions/) + - [Build an Email drip campaign with Python](https://learn.temporal.io/tutorials/python/build-an-email-drip-campaign/) - Blog posts - [Temporal 101: Learn Temporal with Python](https://temporal.io/blog/temporal-101-learn-temporal-with-python) - [Temporal Python 1.0.0 – A Durable, Distributed Asyncio Event Loop](https://temporal.io/blog/durable-distributed-asyncio-event-loop) diff --git a/docs/tutorials/typescript/background-check/introduction.mdx b/docs/tutorials/typescript/background-check/introduction.mdx index f563f0d6..ab7c7479 100644 --- a/docs/tutorials/typescript/background-check/introduction.mdx +++ b/docs/tutorials/typescript/background-check/introduction.mdx @@ -76,7 +76,7 @@ Further resources for learning how to use the SDK include the following: - [Building Reliable Distributed Systems in Node.js](https://temporal.io/blog/building-reliable-distributed-systems-in-node): An introduction to Temporal and its value through a sample web app, [temporal.menu](https://temporal.menu/). - The [TypeScript SDK](https://www.youtube.com/playlist?list=PLl9kRkvFJrlTavecydpk9r6cF7qBmQJvb) YouTube playlist. - Tutorials - - [Build a recurring billing subscription system with TypeScript](https://learn.temporal.io/tutorials/typescript/subscriptions/) + - [Build a recurring billing subscription system with TypeScript](https://learn.temporal.io/tutorials/typescript/recurring-billing-subscription/) - [Choose Your Own Adventure Bot walkthrough in TypeScript](https://learn.temporal.io/tutorials/typescript/chatbot/) - Blog posts - [How Durable Execution Works](https://temporal.io/blog/building-reliable-distributed-systems-in-node-js-part-2) diff --git a/docs/tutorials/typescript/subscriptions/index.md b/docs/tutorials/typescript/recurring-billing-subscription/index.md similarity index 99% rename from docs/tutorials/typescript/subscriptions/index.md rename to docs/tutorials/typescript/recurring-billing-subscription/index.md index 6b9239fa..1d84826e 100644 --- a/docs/tutorials/typescript/subscriptions/index.md +++ b/docs/tutorials/typescript/recurring-billing-subscription/index.md @@ -5,8 +5,8 @@ keywords: [TypeScript, temporal, sdk, tutorial, entity workflow] tags: [TypeScript, SDK] last_update: date: 2024-07-24 -title: Build a Recurring Billing Subscription Workflow with TypeScript -description: Implement a subscription application using Temporal's Workflows, Activities, Signals, and Queries, enabling the payment workflow to be canceled or modified during execution. +title: Build a Recurring Billing Subscription System with TypeScript +description: Implement a subscription system in TypeScript using Temporal's Workflows, Activities, Signals, and Queries, and let the payment workflow be canceled or modified during execution. image: /img/temporal-logo-twitter-card.png --- diff --git a/vercel.json b/vercel.json index ce76d8e1..8a349dcf 100644 --- a/vercel.json +++ b/vercel.json @@ -36,6 +36,11 @@ "destination": "/tutorials/typescript/build-one-click-order-app-nextjs/", "permanent": true }, + { + "source": "/tutorials/typescript/subscriptions/", + "destination": "/tutorials/typescript/build-one-click-order-app-nextjs/", + "permanent": true + }, { "source": "/tutorials/typescript/chatbot/", "destination": "/tutorials/typescript/build-choose-your-own-adventure-bot/", From c3357bda25136d74108c2bd56c1ace95b49763f7 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Mon, 29 Jul 2024 12:17:27 -0500 Subject: [PATCH 10/16] slug change --- .../typescript/recurring-billing-subscription/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/typescript/recurring-billing-subscription/index.md b/docs/tutorials/typescript/recurring-billing-subscription/index.md index 1d84826e..f7d53fed 100644 --- a/docs/tutorials/typescript/recurring-billing-subscription/index.md +++ b/docs/tutorials/typescript/recurring-billing-subscription/index.md @@ -1,5 +1,5 @@ --- -id: subscription-tutorial +id: ts-recurring-subscription-tutorial sidebar_position: 3 keywords: [TypeScript, temporal, sdk, tutorial, entity workflow] tags: [TypeScript, SDK] From c206cb3f6b57a84cde430f73193b7131a8876a54 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Mon, 29 Jul 2024 12:30:53 -0500 Subject: [PATCH 11/16] fixing bug --- .../{recurring-billing-subscription => subscriptions}/index.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/tutorials/typescript/{recurring-billing-subscription => subscriptions}/index.md (100%) diff --git a/docs/tutorials/typescript/recurring-billing-subscription/index.md b/docs/tutorials/typescript/subscriptions/index.md similarity index 100% rename from docs/tutorials/typescript/recurring-billing-subscription/index.md rename to docs/tutorials/typescript/subscriptions/index.md From 36efc018b6f68e9dea2b79d58ff98c12d21320f0 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Mon, 29 Jul 2024 12:35:22 -0500 Subject: [PATCH 12/16] restore --- .../typescript/subscriptions/index.md | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/docs/tutorials/typescript/subscriptions/index.md b/docs/tutorials/typescript/subscriptions/index.md index f7d53fed..3855fb9b 100644 --- a/docs/tutorials/typescript/subscriptions/index.md +++ b/docs/tutorials/typescript/subscriptions/index.md @@ -1,12 +1,12 @@ --- -id: ts-recurring-subscription-tutorial +id: subscription-tutorial sidebar_position: 3 keywords: [TypeScript, temporal, sdk, tutorial, entity workflow] tags: [TypeScript, SDK] last_update: date: 2024-07-24 -title: Build a Recurring Billing Subscription System with TypeScript -description: Implement a subscription system in TypeScript using Temporal's Workflows, Activities, Signals, and Queries, and let the payment workflow be canceled or modified during execution. +title: Build a Recurring Billing Subscription Workflow with TypeScript +description: Implement a subscription application using Temporal's Workflows, Activities, Signals, and Queries, enabling the payment workflow to be canceled or modified during execution. image: /img/temporal-logo-twitter-card.png --- @@ -719,41 +719,41 @@ And replace it with: [src/workflows.ts](https://github.com/temporalio/subscription-workflow-project-template-typescript/blob/main/src/workflows.ts) ```ts // ... - // Used to wait for the subscription to be cancelled or for a trial period timeout to elapse - if ( - await condition( - () => subscriptionCancelled, - customer.subscription.trialPeriod - ) - ) { - await sendCancellationEmailDuringTrialPeriod(customer); - return `Subscription finished for: ${customer.id}`; - } else { - // Trial period is over, start billing until we reach the max billing periods for the subscription or subscription has been cancelled - while (true) { - if (billingPeriodNumber > customer.subscription.maxBillingPeriods) break; - - if (subscriptionCancelled) { - await sendSubscriptionFinishedEmail(customer); - return `Subscription finished for: ${customer.id}, Total Charged: ${totalCharged}`; - } +// Used to wait for the subscription to be cancelled or for a trial period timeout to elapse +if ( + await condition( + () => subscriptionCancelled, + customer.subscription.trialPeriod + ) +) { + await sendCancellationEmailDuringTrialPeriod(customer); + return `Subscription finished for: ${customer.id}`; +} else { + // Trial period is over, start billing until we reach the max billing periods for the subscription or subscription has been cancelled + while (true) { + if (billingPeriodNumber > customer.subscription.maxBillingPeriods) break; - log.info(`Charging ${customer.id} amount ${billingPeriodChargeAmount}`); + if (subscriptionCancelled) { + await sendSubscriptionFinishedEmail(customer); + return `Subscription finished for: ${customer.id}, Total Charged: ${totalCharged}`; + } - await chargeCustomerForBillingPeriod(customer, billingPeriodChargeAmount); - totalCharged += billingPeriodChargeAmount; - billingPeriodNumber++; + log.info(`Charging ${customer.id} amount ${billingPeriodChargeAmount}`); - // Wait for the next billing period or until the subscription is cancelled - await sleep(customer.subscription.billingPeriod); - } + await chargeCustomerForBillingPeriod(customer, billingPeriodChargeAmount); + totalCharged += billingPeriodChargeAmount; + billingPeriodNumber++; - // If the subscription period is over and not cancelled, notify the customer to buy a new subscription - await sendSubscriptionOverEmail(customer); - return `Completed ${ - workflowInfo().workflowId - }, Total Charged: ${totalCharged}`; + // Wait for the next billing period or until the subscription is cancelled + await sleep(customer.subscription.billingPeriod); } + + // If the subscription period is over and not cancelled, notify the customer to buy a new subscription + await sendSubscriptionOverEmail(customer); + return `Completed ${ + workflowInfo().workflowId + }, Total Charged: ${totalCharged}`; +} ``` @@ -827,15 +827,15 @@ Start by initiating the Workflow Execution and getting the handle: [src/scripts/cancel-subscription.ts](https://github.com/temporalio/subscription-workflow-project-template-typescript/blob/main/src/scripts/cancel-subscription.ts) ```ts // ... - const subscriptionWorkflowExecution = await client.workflow.start( - subscriptionWorkflow, - { - args: [customer], - taskQueue: TASK_QUEUE_NAME, - workflowId: `subscription-${customer.id}`, - } - ); - const handle = await client.workflow.getHandle(`subscription-${customer.id}`); +const subscriptionWorkflowExecution = await client.workflow.start( + subscriptionWorkflow, + { + args: [customer], + taskQueue: TASK_QUEUE_NAME, + workflowId: `subscription-${customer.id}`, + } +); +const handle = await client.workflow.getHandle(`subscription-${customer.id}`); ``` From b01d936fc73438b5ba1006a9cbf4095ec8fad06d Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Mon, 29 Jul 2024 14:26:53 -0500 Subject: [PATCH 13/16] resolve merge conflict --- .../index.md | 82 +++++++++---------- .../background-check/introduction.mdx | 2 +- .../typescript/work-queue-slack-app/index.mdx | 2 +- vercel.json | 2 +- 4 files changed, 44 insertions(+), 44 deletions(-) rename docs/tutorials/{typescript/subscriptions => recurring-billing-system}/index.md (96%) diff --git a/docs/tutorials/typescript/subscriptions/index.md b/docs/tutorials/recurring-billing-system/index.md similarity index 96% rename from docs/tutorials/typescript/subscriptions/index.md rename to docs/tutorials/recurring-billing-system/index.md index 3855fb9b..df547cd0 100644 --- a/docs/tutorials/typescript/subscriptions/index.md +++ b/docs/tutorials/recurring-billing-system/index.md @@ -1,11 +1,11 @@ --- -id: subscription-tutorial +id: ts-recurring-billing-subscription-tutorial sidebar_position: 3 keywords: [TypeScript, temporal, sdk, tutorial, entity workflow] tags: [TypeScript, SDK] last_update: date: 2024-07-24 -title: Build a Recurring Billing Subscription Workflow with TypeScript +title: Build a recurring billing subscription system with TypeScript description: Implement a subscription application using Temporal's Workflows, Activities, Signals, and Queries, enabling the payment workflow to be canceled or modified during execution. image: /img/temporal-logo-twitter-card.png --- @@ -719,41 +719,41 @@ And replace it with: [src/workflows.ts](https://github.com/temporalio/subscription-workflow-project-template-typescript/blob/main/src/workflows.ts) ```ts // ... -// Used to wait for the subscription to be cancelled or for a trial period timeout to elapse -if ( - await condition( - () => subscriptionCancelled, - customer.subscription.trialPeriod - ) -) { - await sendCancellationEmailDuringTrialPeriod(customer); - return `Subscription finished for: ${customer.id}`; -} else { - // Trial period is over, start billing until we reach the max billing periods for the subscription or subscription has been cancelled - while (true) { - if (billingPeriodNumber > customer.subscription.maxBillingPeriods) break; + // Used to wait for the subscription to be cancelled or for a trial period timeout to elapse + if ( + await condition( + () => subscriptionCancelled, + customer.subscription.trialPeriod + ) + ) { + await sendCancellationEmailDuringTrialPeriod(customer); + return `Subscription finished for: ${customer.id}`; + } else { + // Trial period is over, start billing until we reach the max billing periods for the subscription or subscription has been cancelled + while (true) { + if (billingPeriodNumber > customer.subscription.maxBillingPeriods) break; - if (subscriptionCancelled) { - await sendSubscriptionFinishedEmail(customer); - return `Subscription finished for: ${customer.id}, Total Charged: ${totalCharged}`; - } + if (subscriptionCancelled) { + await sendSubscriptionFinishedEmail(customer); + return `Subscription finished for: ${customer.id}, Total Charged: ${totalCharged}`; + } - log.info(`Charging ${customer.id} amount ${billingPeriodChargeAmount}`); + log.info(`Charging ${customer.id} amount ${billingPeriodChargeAmount}`); - await chargeCustomerForBillingPeriod(customer, billingPeriodChargeAmount); - totalCharged += billingPeriodChargeAmount; - billingPeriodNumber++; + await chargeCustomerForBillingPeriod(customer, billingPeriodChargeAmount); + totalCharged += billingPeriodChargeAmount; + billingPeriodNumber++; - // Wait for the next billing period or until the subscription is cancelled - await sleep(customer.subscription.billingPeriod); - } + // Wait for the next billing period or until the subscription is cancelled + await sleep(customer.subscription.billingPeriod); + } - // If the subscription period is over and not cancelled, notify the customer to buy a new subscription - await sendSubscriptionOverEmail(customer); - return `Completed ${ - workflowInfo().workflowId - }, Total Charged: ${totalCharged}`; -} + // If the subscription period is over and not cancelled, notify the customer to buy a new subscription + await sendSubscriptionOverEmail(customer); + return `Completed ${ + workflowInfo().workflowId + }, Total Charged: ${totalCharged}`; + } ``` @@ -827,15 +827,15 @@ Start by initiating the Workflow Execution and getting the handle: [src/scripts/cancel-subscription.ts](https://github.com/temporalio/subscription-workflow-project-template-typescript/blob/main/src/scripts/cancel-subscription.ts) ```ts // ... -const subscriptionWorkflowExecution = await client.workflow.start( - subscriptionWorkflow, - { - args: [customer], - taskQueue: TASK_QUEUE_NAME, - workflowId: `subscription-${customer.id}`, - } -); -const handle = await client.workflow.getHandle(`subscription-${customer.id}`); + const subscriptionWorkflowExecution = await client.workflow.start( + subscriptionWorkflow, + { + args: [customer], + taskQueue: TASK_QUEUE_NAME, + workflowId: `subscription-${customer.id}`, + } + ); + const handle = await client.workflow.getHandle(`subscription-${customer.id}`); ``` diff --git a/docs/tutorials/typescript/background-check/introduction.mdx b/docs/tutorials/typescript/background-check/introduction.mdx index ab7c7479..f5bf1f24 100644 --- a/docs/tutorials/typescript/background-check/introduction.mdx +++ b/docs/tutorials/typescript/background-check/introduction.mdx @@ -76,7 +76,7 @@ Further resources for learning how to use the SDK include the following: - [Building Reliable Distributed Systems in Node.js](https://temporal.io/blog/building-reliable-distributed-systems-in-node): An introduction to Temporal and its value through a sample web app, [temporal.menu](https://temporal.menu/). - The [TypeScript SDK](https://www.youtube.com/playlist?list=PLl9kRkvFJrlTavecydpk9r6cF7qBmQJvb) YouTube playlist. - Tutorials - - [Build a recurring billing subscription system with TypeScript](https://learn.temporal.io/tutorials/typescript/recurring-billing-subscription/) + - [Build a recurring billing subscription system with TypeScript](https://learn.temporal.io/tutorials/typescript/recurring-billing-system/) - [Choose Your Own Adventure Bot walkthrough in TypeScript](https://learn.temporal.io/tutorials/typescript/chatbot/) - Blog posts - [How Durable Execution Works](https://temporal.io/blog/building-reliable-distributed-systems-in-node-js-part-2) diff --git a/docs/tutorials/typescript/work-queue-slack-app/index.mdx b/docs/tutorials/typescript/work-queue-slack-app/index.mdx index cf602c4c..c037a934 100644 --- a/docs/tutorials/typescript/work-queue-slack-app/index.mdx +++ b/docs/tutorials/typescript/work-queue-slack-app/index.mdx @@ -17,5 +17,5 @@ When you are building a TypeScript application, you will typically build it loca In this two-part tutorial, you will first build a Work Queue Slack App with TypeScript and Temporal locally on your machine using the Temporal CLI. Then, you will deploy it to production on a DigitalOcean Droplet using Temporal Cloud. -- [Build a Work Queue Slack App with TypeScript and Temporal](/tutorials/typescript/work-queue-slack-app/build) +- [Build a Work Queue Slack App with TypeScriptl](/tutorials/typescript/work-queue-slack-app/build) - [Deploy a Typescript Slack App with TypeScript to DigitalOcean using Temporal Cloud](/tutorials/typescript/work-queue-slack-app/deploy) diff --git a/vercel.json b/vercel.json index 8a349dcf..38adca53 100644 --- a/vercel.json +++ b/vercel.json @@ -38,7 +38,7 @@ }, { "source": "/tutorials/typescript/subscriptions/", - "destination": "/tutorials/typescript/build-one-click-order-app-nextjs/", + "destination": "/tutorials/typescript/recurring-billing-system/", "permanent": true }, { From 19f554869a35189e06560852b5f4deed7ad42ba7 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Mon, 29 Jul 2024 15:32:15 -0500 Subject: [PATCH 14/16] moved file --- docs/tutorials/{ => typescript}/recurring-billing-system/index.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/tutorials/{ => typescript}/recurring-billing-system/index.md (100%) diff --git a/docs/tutorials/recurring-billing-system/index.md b/docs/tutorials/typescript/recurring-billing-system/index.md similarity index 100% rename from docs/tutorials/recurring-billing-system/index.md rename to docs/tutorials/typescript/recurring-billing-system/index.md From 05f8b61310cd99fd0d0b2d4d44be32e549acfcc7 Mon Sep 17 00:00:00 2001 From: Brian Hogan Date: Mon, 29 Jul 2024 15:48:30 -0500 Subject: [PATCH 15/16] restore java tutorial back to main --- .../java/build-an-email-drip-campaign/index.md | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/docs/tutorials/java/build-an-email-drip-campaign/index.md b/docs/tutorials/java/build-an-email-drip-campaign/index.md index 8902af36..ffabfd46 100644 --- a/docs/tutorials/java/build-an-email-drip-campaign/index.md +++ b/docs/tutorials/java/build-an-email-drip-campaign/index.md @@ -23,7 +23,7 @@ This reduces the complexity of the code you have to write and support. You'll create an endpoint for users to give their email address, and then create a new Workflow execution using that email address which will simulate sending an email message at certain intervals. The user can check on the status of their subscription, which you'll handle using a Query, and they can end the subscription at any time by unsubscribing, which you'll handle by cancelling the Workflow Execution. -You can view the user's entire process through Temporal's Web UI. +You can view the user's entire process through Temporal's Web UI. For this tutorial, you'll simulate sending emails, but you can adapt this example to call a live email service in the future. By the end of this tutorial, you'll have a clear understand how to use Temporal to create and manage long-running Workflows within a web application. @@ -71,7 +71,7 @@ Before writing the Workflow Definition, you'll define the data objects used by t You'll also define the Task Queue name you'll use in your Worker. Create the package directories for this project: - + ``` src ├── main @@ -327,7 +327,7 @@ The `run` method executes the `sendEmail()` Activity with the following paramete A `start_to_close_timeout` parameter tells the Temporal Server to time out the Activity 10 seconds from when the Activity starts. -The loop also includes a `Workflow.sleep()` statement that causes the Workflow to pause for a set amount of time between emails. +The loop also includes a `Workflow.sleep()` statement that causes the Workflow to pause for a set amount of time between emails. You can define this in seconds, days, months, or even years, depending on your business logic. If there's a cancellation request, the request throws a `CanceledFailure` error, which you can catch and respond. @@ -460,13 +460,6 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import subscription.model.*; import subscription.workflows.SendEmailWorkflow; - -@RestController -public class Controller { - - @Autowired - WorkflowClient client; - ``` @@ -498,7 +491,7 @@ In the `Controller.java` file, define a `/subscribe` endpoint so that users can In the `startSubscription()` method, use the `WorkflowClient` instance to start your Workflow Execution. -The `WorkflowData` object is used to pass the email address given by the user to the Workflow Execution and sets the Workflow Id. +The `WorkflowData` object is used to pass the email address given by the user to the Workflow Execution and sets the Workflow Id. This ensures that the email is unique across all Workflows so that the user can't sign up multiple times, only receive the emails they've subscribed to, and when they cancel; they cancel the Workflow run. With this endpoint in place, you can now send a POST request to `/subscribe` with an email address in the request body to start a new Workflow that sends an email to that address. @@ -607,7 +600,7 @@ Here's the relevant section as a reminder: With this endpoint in place, users can send a `DELETE` request to `unsubscribe` with an email address in the request body to cancel the Workflow associated with that email address. This allows users to unsubscribe from the email list and prevent any further emails from sending. -Now that you've added the ability to unsubscribe from the email list, build your server app. +Now that you've added the ability to unsubscribe from the email list, build your server app. ## Build the server app From 82c4f1e11f2c085a4d3196c6080c792a901dbf10 Mon Sep 17 00:00:00 2001 From: "Brian P. Hogan" Date: Mon, 5 Aug 2024 12:17:35 -0500 Subject: [PATCH 16/16] Update docs/tutorials/typescript/work-queue-slack-app/index.mdx Co-authored-by: Erica Sadun <156466156+fairlydurable@users.noreply.github.com> --- docs/tutorials/typescript/work-queue-slack-app/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/typescript/work-queue-slack-app/index.mdx b/docs/tutorials/typescript/work-queue-slack-app/index.mdx index c037a934..e8d6cc86 100644 --- a/docs/tutorials/typescript/work-queue-slack-app/index.mdx +++ b/docs/tutorials/typescript/work-queue-slack-app/index.mdx @@ -17,5 +17,5 @@ When you are building a TypeScript application, you will typically build it loca In this two-part tutorial, you will first build a Work Queue Slack App with TypeScript and Temporal locally on your machine using the Temporal CLI. Then, you will deploy it to production on a DigitalOcean Droplet using Temporal Cloud. -- [Build a Work Queue Slack App with TypeScriptl](/tutorials/typescript/work-queue-slack-app/build) +- [Build a Work Queue Slack App with TypeScript](/tutorials/typescript/work-queue-slack-app/build) - [Deploy a Typescript Slack App with TypeScript to DigitalOcean using Temporal Cloud](/tutorials/typescript/work-queue-slack-app/deploy)