# Epic 3: Pre-Deployment, URL Generation & Interlinking ## Epic Goal To loop through each article in a batch, validate/create its cloud target, generate its final URL, and then inject all required interlinks (batch "wheel," home page, and tiered) into the HTML content before deployment. ## Stories ### Story 3.1: Generate and Validate Article URLs **As a developer**, I want to loop through every article in my batch, validate or create its specific cloud bucket, and generate its final public URL, so that I have a definitive list of all new URLs before I try to interlink them. **Acceptance Criteria** A script iterates through each new article in the batch. * A script iterates through each new article in the batch. * For each article, it identifies the target cloud bucket (one bucket per article). * It checks if that specific bucket exists and is accessible. * If the bucket does not exist, it creates it. * If bucket validation/creation fails for any article, the script halts with a clear error for that article. * Using the bucket's base URL and the FQDN mapping logic, it constructs the final, absolute URL for the article. * The script outputs a complete list/map of all newly generated URLs for the batch (e.g., `[{ title: 'Article 1', url: '...' }, { title: 'Article 2', url: '...' }]`). ### Story 3.2: Find Tiered Links **As a developer**, I want a module that finds all required *tiered* links (money site or lower-tier) based on the current batch's tier, so I have them ready for injection. **Acceptance Criteria:** * The module checks the current batch's Tier. * **If Tier 1:** It gets the `money_site_url` from the project settings. * **If Tier 2 or higher:** It queries the `urls` table for 2-4 random URLs from the tier immediately below it (e.g., a T2 batch gets T1 URLs). * It returns an object containing the required links (e.g., `{ money_site_url: '...' }` or `{ lower_tier_urls: [...] }`). ### Story 3.3: Content Interlinking Injection **As a User**, I want the system to inject all required links (batch "wheel", home page, and tiered/money site) into each new article using the finalized URL list. **Acceptance Criteria:** * A script takes the raw HTML content (from Epic 2), the list of new URLs (from 3.1), the tiered links (from 3.2), and the `project` JSON (for anchor text). * **Wheel/Home Page Links:** * For each article in the `new_article_urls` list, it injects a "next" and "previous" link. * The "next" link points to the next article in the list. **The last article's "next" link must loop back and point to the first article.** * The "previous" link points to the previous article in the list. **The first article's "previous" link must loop back and point to the last article.** * Each article must also contain a link to its bucket's **home page** (derived from its URL in 3.1). * **Tiered/Anchor Text Links:** * It loads the anchor text lists (T1, T2, etc.) from the `project` JSON. * **If Tier 1:** It scans the HTML for anchor text from the T1 list and links the first instance to the `money_site_url`. * **If Tier 2 or higher:** It scans the HTML for anchor text from the appropriate tier's list. For each of the 2-4 anchor texts found, it inserts a link to one of the `lower_tier_urls`. * The script produces the **final, fully interlinked HTML content,** ready for deployment in Epic 4.