{"id":552,"date":"2024-12-30T22:23:12","date_gmt":"2024-12-30T22:23:12","guid":{"rendered":"https:\/\/bendauphinee.com\/writing\/?page_id=552"},"modified":"2025-01-07T22:37:00","modified_gmt":"2025-01-07T22:37:00","slug":"technical-design","status":"publish","type":"page","link":"https:\/\/bendauphinee.com\/writing\/building-tailgunner\/project-plan\/technical-design\/","title":{"rendered":"Technical Design"},"content":{"rendered":"\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>This page is for the technical documentation related to our project.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">API Endpoints<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Action<\/th><th>API URL<\/th><th>Verb<\/th><\/tr><\/thead><tbody><tr><td>Create a template<\/td><td><code>\/api\/v1\/template<\/code><\/td><td>POST<\/td><\/tr><tr><td>Get template (metadata and fields)<\/td><td><code>\/api\/v1\/template<\/code>\/{id}<\/td><td>GET<\/td><\/tr><tr><td>Update a template (metadata and fields)<\/td><td><code>\/api\/v1\/<code>template<\/code><\/code>\/{id}<\/td><td>PUT<\/td><\/tr><tr><td>Delete a template<\/td><td><code>\/api\/v1\/<code>template<\/code><\/code>\/{id}<\/td><td>DELETE<\/td><\/tr><tr><td>Clone a template<\/td><td><code>\/api\/v1\/<code>template<\/code><\/code><\/td><td>POST<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div class=\"wp-block-group has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-33c87a82ddcab83fe58d6287284d7e33 has-global-padding is-layout-constrained wp-container-core-group-is-layout-86dba5ee wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">\n<p><strong>Action<\/strong>: Create a template<\/p>\n\n\n\n<p><strong>URL \/ Verb<\/strong>: <code>\/api\/v1\/template<\/code> : POST<\/p>\n\n\n\n<p><strong>Payload<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JSON<\/span><span role=\"button\" tabindex=\"0\" data-code=\"{\n  &quot;name&quot;: &quot;String; The name of the template&quot;\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">&quot;name&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;String; The name of the template&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>Response<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">HTTP<\/span><span role=\"button\" tabindex=\"0\" data-code=\"Status: 201\nLocation: https:\/\/tailgunner.app\/api\/v1\/template\/{id}\nContent-Type: application\/json\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">Status:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">201<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">Location:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">https:\/\/tailgunner.app\/api\/v1\/template\/{id}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">Content-Type:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">application\/json<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JSON<\/span><span role=\"button\" tabindex=\"0\" data-code=\"{\n  &quot;id&quot;: &quot;Integer; The ID of the template we created&quot;\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">&quot;id&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Integer; The ID of the template we created&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Data Structures<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<div class=\"wp-block-group has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-a4fe538fdbc04459ea553e3e77c3a562 is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">\n<p id=\"table_templates\"><strong>Table: templates<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Field Name<\/th><th>Field Type<\/th><\/tr><\/thead><tbody><tr><td>id<\/td><td>Primary Key<\/td><\/tr><tr><td>user_id<\/td><td>Foreign Key, Index<\/td><\/tr><tr><td>title<\/td><td>String<\/td><\/tr><tr><td>description<\/td><td>Text, Nullable<\/td><\/tr><tr><td>created_at<\/td><td>Timestamp<\/td><\/tr><tr><td>updated_at<\/td><td>Timestamp<\/td><\/tr><tr><td>deleted_at<\/td><td>Timestamp<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<div class=\"wp-block-group has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-c7753fd234d37979e181bf029a748f99 is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">\n<p id=\"table_template_fields\"><strong>Table: template_fields<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Field Name<\/th><th>Field Type<\/th><\/tr><\/thead><tbody><tr><td>id<\/td><td>Primary Key<\/td><\/tr><tr><td>template_id<\/td><td>Foreign Key, Index<\/td><\/tr><tr><td>label<\/td><td>String<\/td><\/tr><tr><td>name<\/td><td>String<\/td><\/tr><tr><td>type<\/td><td>String<\/td><\/tr><tr><td>order<\/td><td>Integer<\/td><\/tr><tr><td>extended_options<\/td><td>Text, Nullable<\/td><\/tr><tr><td>created_at<\/td><td>Timestamp<\/td><\/tr><tr><td>updated_at<\/td><td>Timestamp<\/td><\/tr><tr><td>deleted_at<\/td><td>Timestamp<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">System Diagrams<\/h2>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-thumbnail\"><a href=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2024\/12\/Tailgunner-System-Diagram-2024-12.png\" data-rel=\"lightbox-gallery-8VQPJtNe\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" data-id=\"515\" src=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2024\/12\/Tailgunner-System-Diagram-2024-12-150x150.png\" alt=\"\" class=\"wp-image-515\"\/><\/a><figcaption class=\"wp-element-caption\">Flowchart: Create New Template<\/figcaption><\/figure>\n<\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Cards<\/h2>\n\n\n\n<div class=\"wp-block-group has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-3781e9cdae1b1f4f4ab4c8958ee65800 has-global-padding is-layout-constrained wp-container-core-group-is-layout-9597dc02 wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">\n<p class=\"has-contrast-color has-accent-3-background-color has-text-color has-background has-link-color wp-elements-cd0484a5e3638d1878cf19857bf956b2\" style=\"padding-top:0;padding-right:0.3rem;padding-bottom:0;padding-left:0.3rem\"><strong>Card<\/strong>: US1-C1<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-4bf8fa03559180f6a65d7015bc498d5b\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Title<\/h4>\n\n\n\n<p>Create database tables<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-208c9d0f6b2264867b69c2622d7d9968\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Type<\/h4>\n\n\n\n<p>Task<\/p>\n<\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-c2d2f57ca0c39c3684d432537b97ceee\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Description<\/h4>\n\n\n\n<p class=\"has-medium-font-size\">Create the database tables required to support creating a template and store their fields.<\/p>\n\n\n\n<p><strong>Acceptance Criteria<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The database tables from the defined data model exist.<\/li>\n\n\n\n<li>The models required to access these tables exist and are working.<\/li>\n<\/ul>\n\n\n\n<p><strong>Details<\/strong><\/p>\n\n\n\n<p>See the tables documented in <a href=\"https:\/\/bendauphinee.com\/writing\/building-tailgunner\/project-plan\/technical-design\/#table_templates\" data-type=\"page\" data-id=\"552\">the technical plan<\/a>.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-95f6958ffcabc8cc60f61655bf8163b1 has-global-padding is-layout-constrained wp-container-core-group-is-layout-9597dc02 wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">\n<p class=\"has-contrast-color has-accent-3-background-color has-text-color has-background has-link-color wp-elements-83bbfd4638157ea6a53a4ed354de16ed\" style=\"padding-top:0;padding-right:0.3rem;padding-bottom:0;padding-left:0.3rem\"><strong>Card<\/strong>: US1-C2<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-4bf8fa03559180f6a65d7015bc498d5b\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Title<\/h4>\n\n\n\n<p>Create template list page<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-208c9d0f6b2264867b69c2622d7d9968\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Type<\/h4>\n\n\n\n<p>Story<\/p>\n<\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-c2d2f57ca0c39c3684d432537b97ceee\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Description<\/h4>\n\n\n\n<p class=\"has-medium-font-size\">As a business owner, I want a page that will list all templates I own, so that I can manage and work with them.<\/p>\n\n\n\n<p><strong>Acceptance Criteria<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A tool exists to list all templates the business owner is allowed to see.<\/li>\n<\/ul>\n\n\n\n<p><strong>Details<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create a page to list the templates: <a href=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2024\/12\/Tailgunner-Template-List-Template-List-scaled.jpeg\" target=\"_blank\" rel=\"noreferrer noopener\" data-rel=\"lightbox-gallery-8VQPJtNe\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\">Mockup<\/a><\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-781664196e2006396d26241bf57c8255 has-global-padding is-layout-constrained wp-container-core-group-is-layout-9597dc02 wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">\n<p class=\"has-contrast-color has-accent-3-background-color has-text-color has-background has-link-color wp-elements-f26b1101c9421ad49f3b31ecf5418c10\" style=\"padding-top:0;padding-right:0.3rem;padding-bottom:0;padding-left:0.3rem\"><strong>Card<\/strong>: US1-C3<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-4bf8fa03559180f6a65d7015bc498d5b\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Title<\/h4>\n\n\n\n<p>Create tool to add new template<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-208c9d0f6b2264867b69c2622d7d9968\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Type<\/h4>\n\n\n\n<p>Story<\/p>\n<\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-c2d2f57ca0c39c3684d432537b97ceee\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Description<\/h4>\n\n\n\n<p class=\"has-medium-font-size\">As a business owner, I want a way to add a new template, so that I can create a new data set.<\/p>\n\n\n\n<p><strong>Acceptance Criteria<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>There is a way from the template list page to open the template add tool.<\/li>\n\n\n\n<li>The business owner is able to create new templates that they own.<\/li>\n\n\n\n<li>New templates show up in the template list.<\/li>\n<\/ul>\n\n\n\n<p><strong>Details<\/strong><\/p>\n\n\n\n<p>See the system diagram for <a href=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2024\/12\/Tailgunner-System-Diagram-2024-12.png\" target=\"_blank\" rel=\"noreferrer noopener\" data-rel=\"lightbox-gallery-8VQPJtNe\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\">creating a new template<\/a>.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-c658e245c3e64647409f8f8a614653ff has-global-padding is-layout-constrained wp-container-core-group-is-layout-9597dc02 wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">\n<p class=\"has-contrast-color has-accent-3-background-color has-text-color has-background has-link-color wp-elements-b0a9e98e2beebf2c46a31bc2d1dee722\" style=\"padding-top:0;padding-right:0.3rem;padding-bottom:0;padding-left:0.3rem\"><strong>Card<\/strong>: US1-C4<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-4bf8fa03559180f6a65d7015bc498d5b\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Title<\/h4>\n\n\n\n<p>Set up production server and deployment<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-208c9d0f6b2264867b69c2622d7d9968\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Type<\/h4>\n\n\n\n<p>Task<\/p>\n<\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-c2d2f57ca0c39c3684d432537b97ceee\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Description<\/h4>\n\n\n\n<p class=\"has-medium-font-size\">Create a production webserver, and implement a deployment workflow to get our code into production.<\/p>\n\n\n\n<p><strong>Acceptance Criteria<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A server exists for <code>tailgunner.app<\/code>, running the latest main branch code.<\/li>\n\n\n\n<li>New merges to main are deployed to the production server.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>This page is for the technical documentation related to our project. API Endpoints Action API URL Verb Create a template \/api\/v1\/template POST Get template (metadata and fields) \/api\/v1\/template\/{id} GET Update a template (metadata and fields) \/api\/v1\/template\/{id} PUT Delete a template \/api\/v1\/template\/{id} DELETE Clone a template \/api\/v1\/template POST Action: Create a template URL \/ Verb: \/api\/v1\/template [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":316,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-552","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/pages\/552","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/comments?post=552"}],"version-history":[{"count":7,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/pages\/552\/revisions"}],"predecessor-version":[{"id":671,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/pages\/552\/revisions\/671"}],"up":[{"embeddable":true,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/pages\/316"}],"wp:attachment":[{"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/media?parent=552"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}