From b734d11997dfb7a0f4ab1ea4c2c512810bde628f Mon Sep 17 00:00:00 2001 From: ivynya Date: Tue, 15 Aug 2023 13:20:03 -0700 Subject: [PATCH] repo: Merge branch 'v3' --- .github/CHANGELOG.md | 15 ++++ .github/MIGRATION.md | 50 +++++++++++- .github/README.md | 92 ++++++++++++++-------- .github/v2_example.jpg | Bin 40471 -> 0 bytes .github/v3_template.jpg | Bin 0 -> 206387 bytes .github/workflows/build.yml | 26 +++++++ .gitignore | 3 +- .vscode/settings.json | 8 +- Dockerfile | 20 ++--- api/v1.ts | 35 --------- api/v2.ts | 105 ------------------------- cmd/analytics/buffer.go | 58 ++++++++++++++ cmd/analytics/main.go | 30 ++++++++ cmd/analytics/v1.go | 41 ++++++++++ cmd/analytics/v2.go | 149 ++++++++++++++++++++++++++++++++++++ cmd/analytics/v3.go | 105 +++++++++++++++++++++++++ deps.ts | 5 -- go.mod | 22 ++++++ go.sum | 97 +++++++++++++++++++++++ internal/notion/notion.go | 104 +++++++++++++++++++++++++ internal/notion/result.go | 27 +++++++ internal/notion/types.go | 54 +++++++++++++ main.ts | 14 ---- notion/createPage.ts | 22 ------ notion/getPage.ts | 14 ---- notion/queryDatabase.ts | 24 ------ notion/updatePage.ts | 63 --------------- pkg/create_kpi.go | 28 +++++++ pkg/find_campaign.go | 41 ++++++++++ pkg/update_interactions.go | 37 +++++++++ pkg/update_visits.go | 43 +++++++++++ schema/buffer.ts | 7 -- 32 files changed, 1002 insertions(+), 337 deletions(-) create mode 100644 .github/CHANGELOG.md delete mode 100644 .github/v2_example.jpg create mode 100644 .github/v3_template.jpg create mode 100644 .github/workflows/build.yml delete mode 100644 api/v1.ts delete mode 100644 api/v2.ts create mode 100644 cmd/analytics/buffer.go create mode 100644 cmd/analytics/main.go create mode 100644 cmd/analytics/v1.go create mode 100644 cmd/analytics/v2.go create mode 100644 cmd/analytics/v3.go delete mode 100644 deps.ts create mode 100644 go.mod create mode 100644 go.sum create mode 100644 internal/notion/notion.go create mode 100644 internal/notion/result.go create mode 100644 internal/notion/types.go delete mode 100644 main.ts delete mode 100644 notion/createPage.ts delete mode 100644 notion/getPage.ts delete mode 100644 notion/queryDatabase.ts delete mode 100644 notion/updatePage.ts create mode 100644 pkg/create_kpi.go create mode 100644 pkg/find_campaign.go create mode 100644 pkg/update_interactions.go create mode 100644 pkg/update_visits.go delete mode 100644 schema/buffer.ts diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md new file mode 100644 index 0000000..33b3b9e --- /dev/null +++ b/.github/CHANGELOG.md @@ -0,0 +1,15 @@ + +# Changelog + +### Analytics V3 +1. Service now written in Go for resource efficiency and speed. +2. New `GET` `/v3/campaign/:id/interaction/:iID` endpoint to get campaign data for a specific interaction +3. JSON responses are now returned in streamlined Page schema +4. Deprecated V1 API - will continue to function but will be removed in a future release (see Migration Guide) + +### Analytics V2 +1. New endpoints and database schema to handle Interactions, a granular way to track campaign performance +2. New endpoint to get campaign data without creating a visit + +### Analytics V1 +1. Initial release \ No newline at end of file diff --git a/.github/MIGRATION.md b/.github/MIGRATION.md index a3fe68a..0d5f72b 100644 --- a/.github/MIGRATION.md +++ b/.github/MIGRATION.md @@ -1,12 +1,58 @@ -# Analytics V1 to V2 Migration +# Migration Guide +This migration guide is a comprehensive guide to the changes you need to make in Notion and in your code to upgrade your analytics version. + +## V2 -> V3 Migration + +### In Notion +V3 uses the exact same database format as V2, so you can keep your existing Notion database and integration. + +### In Code +You need to update any services calling the analytics API. +1. All V2 endpoints have a V3 endpoint that is functionally equivalent, so you can just update the endpoint from /v2/ to /v3/ as shown below. + +| method | old endpoint | new endpoint | +|---|---|---| +| GET | `/v2/campaign/:id` | `/v3/campaign/:id` | +| POST | `/v2/campaign/:id` | `/v3/campaign/:id` | +| POST | `/v2/campaign/:id/interaction` | `/v3/campaign/:id/interaction` | +| POST | `/v2/campaign/:id/interaction/:interactionId` | `/v3/campaign/:id/interaction/:interactionId` | +| POST | `/v2/campaign/:id/visit/:interactionId` | `/v3/campaign/:id/visit/:interactionId` | + +2. If you use JSON responses from the API (If `Public`=`True` for any of your campaigns), then you need to alter your code to use the new response schema as shown below. If you aren't using Public campaigns, then successes will continue returning 204 status codes and you can ignore this step. + +| property name | type | +|---|---| +| `id` | `string` | +| `campaign_id` | `string` | +| `parent_campaigns` | `string[]` | +| `interact` | `string` | +| `public` | `string` | +| `ref_visits` | `number` | +| `visits` | `number` | +| `interactions` | `number` | + +You can find the documentation on the rest of the new endpoints in the README. + +--- + +## V1 -> V2 Migration + +### In Notion Using your existing Notion database: 1. Create an property of type `Number` named `Interactions`. 2. Create a property of type `Select` named `Interact` with the options `Enabled`, `Disabled`, and `Dynamic`. 3. Ensure you have a property called `CreatedBy` of type `Created by`. 4. Enable your database's `Subtasks` feature (using the `ParentCampaign` and `SubCampaigns` property names respectively) for better visual organization. Alternatively, just ensure the `ParentCampaign` of type `Relation` property exists. -Then, you can deploy your new Analytics instance (example instructions in README) and start using the new APIs, documented there as well. +### In Code +The only API endpoint in V1 is forward-compatible with V2, so you can just update the endpoint from /v1/ to /v2/ as shown below. + +| method | old endpoint | new endpoint | +|---|---|---| +| POST | `/v1/campaign/:id` | `/v2/campaign/:id` | + +You can find the documentation on the rest of the new endpoints in the README. Your new Analytics instance and database format is still compatible with your `redirect` instance, if you are running the two alongside each other. \ No newline at end of file diff --git a/.github/README.md b/.github/README.md index 2ee6097..8c1f6d4 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1,19 +1,20 @@ # analytics -Notion-integrated analytics API with interaction tracking. Features user-definable and app-controlled management of KPIs. -> ⚠️ Are you an Analytics V1 user? See the [V2 migration guide](./MIGRATION.md) to see how you can preserve your existing data and make use of the new Interactions API and App-Controlled Campaigns. The V1 api will continue to function as-is. +![https://img.shields.io/github/v/release/ivynya/analytics?label=version](https://img.shields.io/github/v/release/ivynya/analytics?label=version) -## Using the Notion Template +Notion-integrated analytics solution with interaction tracking. Features user-definable and app-controlled management of different campaigns and KPIs by API and visually through a Notion database. + +> ⚠️ Are you an Analytics V1 or V2 user? See the [migration guide](./MIGRATION.md) to see how you can preserve your existing data and make use of new features and performance improvements in V3. No rush, though! V1 and V2 API endpoints are still supported and functional for now. -To get started, duplicate this Notion page template: [ivy.direct/template/analytics/v2](https://ivy.direct/template/analytics/v2) +## Using the Notion Template -> ⚠️ The Analytics V2 template is compatible with Analytics V1 and is the recommended default. However, if you only want V1 features, you can use the old template: [ivy.direct/template/analytics/v1](https://ivy.direct/template/analytics/v1) +To get started, duplicate this Notion page template: [ivy.direct/template/analytics/v3](https://ivy.direct/template/analytics/v3) -[![Notion Template](https://github.com/ivynya/analytics/raw/main/.github/v2_template.jpg)](https://ivy.direct/template/analytics/v2) +[![Notion Template](./v3_template.jpg)](https://ivy.direct/template/analytics/v3) Do not edit or delete any of the property names as the API requires these to function. You can add additional properties for organizational purposes, or create views that hide the properties you don't need instead. -### API V2 Property Defintions +### V3 Notion Property Defintions | Property | Description | | --- | --- | | `Campaign` | A friendly name for the campaign. Can be anything. | @@ -28,31 +29,60 @@ Do not edit or delete any of the property names as the API requires these to fun | `SubCampaigns` (hidden by default) | Any associated sub-campaigns. Not used by the API directly. | | `CreatedBy` (hidden by default) | Shows who created this campaign (you, another user, or the Analytics API) | -## Hosting the API - -### With Deno Deploy -1. [Create a new Notion integration](https://www.notion.so/my-integrations) with all permissions, copy the API token, and invite it to your duplicated Notion page. If you don't want to use the App-Controlled Campaigns feature, you can safely leave out the Insert Content permission. -2. Fork this repository's `/deployable` branch and create a new automatic [Deno Deploy](https://deno.com/deploy) instance from it, adding the `NOTION_TOKEN` (from your integration) and `NOTION_DB_ID` (from your duplicated Notion page's ID: see [Notion's guide on how to find this](https://developers.notion.com/docs/create-a-notion-integration#step-3-save-the-database-id)) as environment variables -3. Make a `POST` request to `https://YOUR-SUBDOMAIN-HERE.deno.dev/v2/campaign/portfolio-github` to see it work. +## Hosting the Analytics API +1. [Create a new Notion integration](https://www.notion.so/my-integrations) with all permissions, copy the API token, and invite it to your duplicated Notion page. +2. Pull the Docker image artifact from GitHub Container Registry +3. Clone this repo and create a `.env` file with the ID and token, according to `.env.example` +4. Run the Docker container and pass in the environment variables: `docker run -p 3000:3000 --env-file .env ivynya/analytics` +5. Make a `POST` request to `http://localhost:3000/v3/campaign/portfolio-github` to see it work. -### As Docker Container -1. [Create a new Notion integration](https://www.notion.so/my-integrations) with all permissions, copy the API token, and invite it to your duplicated Notion page. If you don't want to use the App-Controlled Campaigns feature, you can safely leave out the Insert Content permission. -2. Clone this repo and create a `.env` file with the ID and token, according to `.env.example` -3. Run `docker build -t analytics .` and `docker run -p 8000:8000 -d analytics` -4. Make a `POST` request to `http://localhost:8000/v2/campaign/portfolio-github` to see it work. -5. If you don't want to build the container with your secrets, you can also use Docker environment flags to pass these values in at runtime. +## V3 API - Endpoints +The following API endpoints are described in the table below. Each endpoint may return one of the listed HTTP status codes in the `Returns` column, as well as the additional possibility of a `200 OK` (described by the Standard Response Protocol further below) or a `500` error if things go catastrophically wrong. -## API Usage | Endpoint | Description | Returns | | --- | --- | --- | -| `GET /v2/campaign/:CampaignID` | Gets campaign info as JSON response. | `200` or `400` if campaign not found or Public = false | -| `POST /v2/campaign/:CampaignID` | Registers +1 Visit. If the campaign is a sub-campaign, the parent will also be updated with +1 RefVisit and +1 Visit. | `204` or `400` if campaign not found | -| `POST /v2/campaign/:CampaignID /interact` | Registers +1 Interaction. If the campaign is a sub-campaign, the parent will also be updated with +1 Interaction. | `204` or `400` if campaign not found or Interact = Disabled | -| `POST /v2/campaign/:CampaignID /interact/:InteractionID` | Creates a sub-campaign for :CampaignID with default values. If exists already, registers +1 interaction. | `204` or `400` if campaign not found | -| `POST /v2/campaign/:CampaignID /visit/:InteractionID` | Creates a sub-campaign for :CampaignID with default values. If exists already, registers +1 visit. | `204` or `400` if campaign not found | +| `GET /v3/campaign/:CampaignID` | Gets campaign info as JSON response. | `200`, `204`, `400` SRP(Campaign) | +| `POST /v3/campaign/:CampaignID` | Registers +1 Visit. If the campaign is a sub-campaign, the parent will also be updated with +1 RefVisit and +1 Visit. | `200`, `204`, `400` SRP(Campaign) | +| `POST /v3/campaign/:CampaignID /interaction` | Registers +1 Interaction. If the campaign is a sub-campaign, the parent will also be updated with +1 Interaction. | `200`, `204`, `400` SRP(Campaign) | +| `GET /v3/campaign/:CampaignID /interaction/:InteractionID` | Gets interaction info as JSON response. | `200`, `204`, `400` SRP(Subcampaign) | +| `POST /v3/campaign/:CampaignID /interact/:InteractionID` | Creates a sub-campaign for :CampaignID with default values. If exists already, registers +1 interaction. | `200`, `204`, `400` SRP(Subcampaign) | +| `POST /v3/campaign/:CampaignID /visit/:InteractionID` | Creates a sub-campaign for :CampaignID with default values. If exists already, registers +1 visit. | `200`, `204`, `400` SRP(Subcampaign) | + +After Analytics makes an edit, you can see a summary of all unread changes in the Notion history for the page. + +## V3 API - Standard Response Protocol (SRP) + +The standard response protocol is a flow that describes potential responses from the API if the given Campaign or Interaction is set to `Public` = `True`or not in the Notion database. + +For **SRP(Campaign)** endpoints described above, if `Public` is `True` and the API request is successful, the endpoint will return a `200 OK` response with the following JSON schema describing the `Campaign` that corresponds to the `:CampaignID` called: -After Analytics makes an edit, you can see a summary of all unread changes as a Notion update (if you follow the page, which is true by default): -[![Notion Update](./v2_example.jpg)](https://ivy.direct/template-analytics) +```ts +{ + "ID": string // Notion ID of the campaign + "CampaignID": string, // User-defined ID of the campaign + "Visits": number, // Total visits to the campaign + "RefVisits": number, // Total visits to the campaign from sub-campaigns + "Interactions": number, // Total interactions with the campaign + "Public": string, // "True" or "False" + "Interact": "Dynamic", // "Dynamic" "Enabled" or "Disabled" - Dynamic allows API requests to create sub-campaigns to track interactions, Enabled allows API requests to track interactions, Disabled does not allow API requests to track interactions at all +} +``` + +If the campaign is not public (`Public` = `False`), and the API request was otherwise successful, the API will return a `204 No Content` response. + +For **SRP(Interaction)** endpoints described in the table above, the exact same response flow and JSON schema are used - except, instead of describing `:CampaignID`, it describes the campaign object represented by `:CampaignID-:InteractionID` (`:InteractionID` subcampaign of `:CampaignID`) instead. + +## API Support Matrix + +The following table shows which Analytics release supports which API versions. Use this table to inform your decision on whether or not you can upgrade to a newer version of Analytics while still using old API versions. + +**❌ = Not Supported | ✅ = Supported | ⚠️ = Deprecated, Functional** + +| API Version | Analytics V1 | Analytics V2 | Analytics V3 | +| --- | --- | --- | --- | +| V1 | ✅ | ✅ | ⚠️ | +| V2 | ❌ | ✅ | ⚠️ | +| V3 | ❌ | ❌ | ✅ | ## Suggested Usage I use top-level campaigns to track a project as a whole (total visits, referrals to it, and interactions on that project) in combination with my [redirect](https://github.com/ivynya/redirect) service. @@ -64,9 +94,11 @@ Finally, for items that require dynamic tracking, I use the `Interact` property These analytics hits are typically done server-side to prevent being blocked by scripts or slowing down page loads. Because no "creepy" or personally-identifiable data (that I wouldn't be able to use anyway) like location, IP, device specifications, mouse cursor movement, etc etc is collected - only page hit numbers and interactions are - this is a great way to track user behavior without being invasive. ## Compatibility with [ivynya/redirect](https://github.com/ivynya/redirect) -Analytics V2 remains compatible with `redirect` to track visits for dynamic redirects, managed from Notion. See the `redirect` GitHub page for setup and usage. +Analytics V3 remains compatible with `redirect` to track visits for dynamic redirects, managed from Notion. See the `redirect` GitHub page for setup and usage. ## Licensing & Contributing -Contributions are welcome! Please first open an issue on this repository. +Contributions are welcome! Please first open an issue on this repository before making a pull request. + +To run the project locally, you need Go installed (tested on 1.20+). Create a .env file according to the .env.example and then source it into your environment. Then, run `go run ./cmd/analytics` to start the server on localhost:3000. -This repository lives under MIT license. +This repository lives under MIT license. \ No newline at end of file diff --git a/.github/v2_example.jpg b/.github/v2_example.jpg deleted file mode 100644 index 21d3cec1788d0b3abb065be032ed05e7c39e366c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40471 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 oaE=dWnWU#>?tLpwR(}3pA*gy0C17K6KmH+?% diff --git a/.github/v3_template.jpg b/.github/v3_template.jpg new file mode 100644 index 0000000000000000000000000000000000000000..565db57fc3a72f39e01c2061d71ab1daf2bf3c0c GIT binary patch literal 206387 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%0A?>U4QNYT)Jo!G&|zJ|=XSlo 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 literal 0 HcmV?d00001 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..2d46e2f --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,26 @@ +name: Build and Push Docker Image to GHCR + +on: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Login to GHCR + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build Docker image + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: ghcr.io/${{ github.repository }}/analytics:latest + diff --git a/.gitignore b/.gitignore index 34b44fa..1c6e718 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ -.env -notion/cache.json +.env \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 41cffb2..c64d63c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { - "deno.enable": true, - "deno.suggest.imports.hosts": { - "https://deno.land": true - } + "go.toolsEnvVars": { + "GO111MODULE": "on" + }, + "dotenv.enableAutocloaking": false } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index f2a4918..dd1b8dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,14 @@ - -FROM denoland/deno:alpine-1.23.1 - -EXPOSE 8000 - +# Use the official Golang image as the base image +FROM golang:1.21-alpine as builder WORKDIR /app - -COPY deps.ts . COPY . . +RUN go build ./cmd/analytics -RUN deno cache deps.ts -RUN deno cache main.ts +# Use slim alpine image for production +FROM alpine:3.18 as production +WORKDIR /app +COPY --from=builder /app/analytics . +EXPOSE 3000 -CMD ["run", "-A", "main.ts"] \ No newline at end of file +# Run the Go program when the container starts +CMD ["./analytics"] diff --git a/api/v1.ts b/api/v1.ts deleted file mode 100644 index bd7a330..0000000 --- a/api/v1.ts +++ /dev/null @@ -1,35 +0,0 @@ - -import { Router } from "../deps.ts"; -import { getPage } from "../notion/getPage.ts"; -import { queryDatabase } from "../notion/queryDatabase.ts"; -import { updateVisits } from "../notion/updatePage.ts"; - -const db = await queryDatabase(); -const buffer: { [id: string]: number } = {}; -db.forEach(page => { - buffer[page.id] = 0; -}); - -setInterval(async () => { - const queue = Object.keys(buffer).filter(id => buffer[id] > 0); - const pages = await Promise.all(queue.map(id => getPage(id))); - await Promise.all(pages.map(page => updateVisits(page, buffer[page.id]))); - Object.keys(buffer).forEach(id => buffer[id] = 0); -}, 5000); - -export const api = new Router(); -api - .post("/v1/campaign/:id", async ctx => { - const campaigns = await queryDatabase(); - const campaign = campaigns.find(c => c.CampaignID === ctx.params.id); - if (campaign) { - console.log(`[v1]: ${ctx.params.id}`) - buffer[campaign.id]++; - if (campaign.Public.name == "True") - ctx.response.body = campaign; - else ctx.response.status = 204; - } else { - ctx.response.status = 400; - ctx.response.body = "Campaign not found"; - } - }); \ No newline at end of file diff --git a/api/v2.ts b/api/v2.ts deleted file mode 100644 index e2cccdf..0000000 --- a/api/v2.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { Router } from "../deps.ts"; -import { createPage } from "../notion/createPage.ts"; -import { getPage } from "../notion/getPage.ts"; -import { queryDatabase } from "../notion/queryDatabase.ts"; -import { updateInteractions, updateVisits } from "../notion/updatePage.ts"; -import type { Buffer } from "../schema/buffer.ts"; - -const db = await queryDatabase(); -const buffer: Buffer = {}; -db.forEach((page) => { - buffer[page.id] = { - visits: 0, - interactions: 0, - }; -}); - -setInterval(() => { - Object.keys(buffer) - .filter((id) => buffer[id].interactions > 0 || buffer[id].visits > 0) - .map(async (id) => { - const page = await getPage(id); - await updateInteractions(page, buffer[id].interactions) - await updateVisits(page, buffer[id].visits); - buffer[id].interactions = 0; - buffer[id].visits = 0; - }); -}, 5000); - -export const api = new Router(); -api - .get("/v2/campaign/:id", async (ctx) => { - const campaign = (await queryDatabase()).find((c) => c.CampaignID === ctx.params.id); - if (!campaign || campaign.Public.name != "True") { - ctx.response.status = 400; - ctx.response.body = "Campaign not found"; - } - ctx.response.body = JSON.stringify(campaign); - console.log(`[v2]: GET ${ctx.params.id}`); - }) - .post("/v2/campaign/:id", async (ctx) => { - const campaign = (await queryDatabase()).find((c) => c.CampaignID === ctx.params.id); - if (!campaign) { - ctx.response.status = 400; - ctx.response.body = "Campaign not found"; - } - console.log(`[v2]: ${ctx.params.id}`); - buffer[campaign.id].visits++; - if (campaign.Public.name == "True") - ctx.response.body = campaign; - else ctx.response.status = 204; - }) - .post("/v2/campaign/:id/interaction", async (ctx) => { - const campaign = (await queryDatabase()).find((c) => c.CampaignID === ctx.params.id); - if (!campaign) { - ctx.response.status = 400; - ctx.response.body = "Campaign not found"; - } - console.log(`[v2]: ${ctx.params.id}::${ctx.params.iid}`); - buffer[campaign.id].interactions++; - if (campaign.Public.name == "True") - ctx.response.body = campaign; - else ctx.response.status = 204; - }) - .post("/v2/campaign/:id/interaction/:iid", async (ctx) => { - const campaign = (await queryDatabase()).find((c) => c.CampaignID === ctx.params.id); - if (!campaign || campaign.Interact.name != "Dynamic") { - ctx.response.status = 400; - ctx.response.body = "Cannot create interaction for this campaign" - return; - } - const interactionID = `${ctx.params.id}-${ctx.params.iid}`; - const interaction = (await queryDatabase()).find((c) => c.CampaignID === interactionID); - if (interaction) { - console.log(`[v2]: ${ctx.params.id}::${ctx.params.iid}`); - if (!buffer[interaction.id]) buffer[interaction.id] = { visits: 0, interactions: 0, }; - buffer[interaction.id].interactions++; - ctx.response.status = 204; - return; - } - console.log(`[v2]: ${ctx.params.id}++${ctx.params.iid}`); - const res = await createPage(ctx.params.iid, campaign.CampaignID, campaign.id); - if (res.ok) ctx.response.status = 204; - else ctx.response.status = 400; - }) - .post("/v2/campaign/:id/visit/:iid", async (ctx) => { - const campaign = (await queryDatabase()).find((c) => c.CampaignID === ctx.params.id); - if (!campaign || campaign.Interact.name != "Dynamic") { - ctx.response.status = 400; - ctx.response.body = "Cannot create visit for this campaign" - return; - } - const interactionID = `${ctx.params.id}-${ctx.params.iid}`; - const interaction = (await queryDatabase()).find((c) => c.CampaignID === interactionID); - if (interaction) { - console.log(`[v2]: ${ctx.params.id}~~${ctx.params.iid}`); - if (!buffer[interaction.id]) buffer[interaction.id] = { visits: 0, interactions: 0, }; - buffer[interaction.id].visits++; - ctx.response.status = 204; - return; - } - console.log(`[v2]: ${ctx.params.id}++${ctx.params.iid}`); - const res = await createPage(ctx.params.iid, campaign.CampaignID, campaign.id); - if (res.ok) ctx.response.status = 204; - else ctx.response.status = 400; - }); \ No newline at end of file diff --git a/cmd/analytics/buffer.go b/cmd/analytics/buffer.go new file mode 100644 index 0000000..90c550f --- /dev/null +++ b/cmd/analytics/buffer.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + "log" + "time" + + analytics "github.com/ivynya/analytics/pkg" +) + +type Buffer map[string]BufferData +type BufferData struct { + Visits int + Interactions int +} + +var buffer = make(Buffer) + +// Queues update to campaign with nID and visits/interactions +func bufferData(nID string, visits int, interactions int) { + if visits <= 0 && interactions <= 0 { + return + } + + if _, ok := buffer[nID]; ok { + buffer[nID] = BufferData{ + Visits: buffer[nID].Visits + visits, + Interactions: buffer[nID].Interactions + interactions, + } + } else { + buffer[nID] = BufferData{ + Visits: visits, + Interactions: interactions, + } + } +} + +// Goroutine that pushes updates to Notion every 10 seconds +func bufferFlushLoop() { + for { + time.Sleep(10 * time.Second) + if len(buffer) > 0 { + log.Println("[UPD] " + fmt.Sprint(len(buffer)) + " campaigns") + } + + for nID, data := range buffer { + err := analytics.UpdateVisits(nID, data.Visits, false) + if err != nil { + log.Println("[ERR] " + err.Error()) + } + err = analytics.UpdateInteractions(nID, data.Interactions) + if err != nil { + log.Println("[ERR] " + err.Error()) + } + delete(buffer, nID) + } + } +} diff --git a/cmd/analytics/main.go b/cmd/analytics/main.go new file mode 100644 index 0000000..5e526ff --- /dev/null +++ b/cmd/analytics/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "log" + "os" + + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/cors" + _ "github.com/joho/godotenv/autoload" +) + +func main() { + go bufferFlushLoop() + + app := fiber.New() + app.Use(cors.New()) + + log.Println("[analytics] creating routers...") + + createRouterV1(app) + createRouterV2(app) + createRouterV3(app) + + tokenPresent := os.Getenv("NOTION_TOKEN") != "" + log.Println("[analytics] $NOTION_DB_ID:", os.Getenv("NOTION_DB_ID")) + log.Println("[analytics] $NOTION_TOKEN:", tokenPresent) + log.Println("[analytics] starting fiber on port 3000") + + log.Fatal(app.Listen(":3000")) +} diff --git a/cmd/analytics/v1.go b/cmd/analytics/v1.go new file mode 100644 index 0000000..f66373f --- /dev/null +++ b/cmd/analytics/v1.go @@ -0,0 +1,41 @@ +package main + +import ( + "encoding/json" + "log" + + "github.com/gofiber/fiber/v2" + analytics "github.com/ivynya/analytics/pkg" +) + +func createRouterV1(a *fiber.App) fiber.Router { + v1 := a.Group("/v1") + + // Deprecated - will be removed in analytics v4 + // Functionally identical to /v2/campaign/:cID (use instead) + v1.Post("/campaign/:cID", func(c *fiber.Ctx) error { + log.Println("[ERR] Deprecated call: /v1/campaign/" + c.Params("cID")) + cID := c.Params("cID") + campaign, err := analytics.FindCampaignByCID(cID) + if err != nil { + return c.Status(400).SendString("Campaign not found") + } + bufferData(campaign.NotionID, 1, 0) + + if campaign.Public == "True" { + unformattedCampaign, err := v2FindCampaignByCIDWithoutConvert(cID) + if err != nil { + return c.Status(400).SendString("Campaign not found") + } + jso, err := json.Marshal(unformattedCampaign) + if err != nil { + return c.Status(500).SendString("Internal server error") + } + return c.SendString(string(jso)) + } + + return c.SendStatus(204) + }) + + return v1 +} diff --git a/cmd/analytics/v2.go b/cmd/analytics/v2.go new file mode 100644 index 0000000..64f3b46 --- /dev/null +++ b/cmd/analytics/v2.go @@ -0,0 +1,149 @@ +package main + +import ( + "encoding/json" + "errors" + + "github.com/gofiber/fiber/v2" + "github.com/ivynya/analytics/internal/notion" + analytics "github.com/ivynya/analytics/pkg" +) + +func createRouterV2(a *fiber.App) fiber.Router { + v2 := a.Group("/v2") + + // Returns a campaign if it is public as PageResult form + v2.Get("/campaign/:cID", func(c *fiber.Ctx) error { + cID := c.Params("cID") + campaign, err := analytics.FindCampaignByCID(cID) + if err != nil || campaign.Public != "True" { + return c.Status(400).SendString("Campaign not found") + } + unformattedCampaign, err := v2FindCampaignByCIDWithoutConvert(cID) + if err != nil { + return c.Status(400).SendString("Campaign not found") + } + jso, err := json.Marshal(unformattedCampaign) + if err != nil { + return c.Status(500).SendString("Internal server error") + } + return c.SendString(string(jso)) + }) + + // Increments visits and returns if public as PageResult / 204 + v2.Post("/campaign/:cID", func(c *fiber.Ctx) error { + cID := c.Params("cID") + campaign, err := analytics.FindCampaignByCID(cID) + if err != nil { + return c.Status(400).SendString("Campaign not found") + } + bufferData(campaign.NotionID, 1, 0) + + if campaign.Public == "True" { + unformattedCampaign, err := v2FindCampaignByCIDWithoutConvert(cID) + if err != nil { + return c.Status(400).SendString("Campaign not found") + } + jso, err := json.Marshal(unformattedCampaign) + if err != nil { + return c.Status(500).SendString("Internal server error") + } + return c.SendString(string(jso)) + } + + return c.SendStatus(204) + }) + + // Increments interactions and returns if public as PageResult / 204 + v2.Post("/campaign/:cID/interaction", func(c *fiber.Ctx) error { + cID := c.Params("cID") + campaign, err := analytics.FindCampaignByCID(cID) + if err != nil { + return c.Status(400).SendString("Campaign not found") + } + bufferData(campaign.NotionID, 0, 1) + + if campaign.Public == "True" { + unformattedCampaign, err := v2FindCampaignByCIDWithoutConvert(cID) + if err != nil { + return c.Status(400).SendString("Campaign not found") + } + jso, err := json.Marshal(unformattedCampaign) + if err != nil { + return c.Status(500).SendString("Internal server error") + } + return c.SendString(string(jso)) + } + + return c.SendStatus(204) + }) + + // If parent dynamic, create/increment KPI interaction and returns 204 + v2.Post("/campaign/:cID/interaction/:iID", func(c *fiber.Ctx) error { + cID := c.Params("cID") + campaign, err := analytics.FindCampaignByCID(cID) + if err != nil { + return c.Status(400).SendString("Campaign not found") + } + if campaign.Interact != "Dynamic" { + return c.Status(400).SendString("Cannot create interaction for campaign") + } + iID := c.Params("cID") + "-" + c.Params("iID") + interaction, err := analytics.FindCampaignByCID(iID) + if err == nil { + bufferData(interaction.NotionID, 0, 1) + return c.SendStatus(204) + } else { + err := analytics.CreatePage(iID, cID, campaign.NotionID) + if err != nil { + return c.Status(400).SendString("Failed creating KPI") + } + return c.SendStatus(204) + } + }) + + // If parent dynamic, create/increment KPI visit and returns 204 + v2.Post("/campaign/:cID/visit/:iID", func(c *fiber.Ctx) error { + cID := c.Params("cID") + campaign, err := analytics.FindCampaignByCID(cID) + if err != nil { + return c.Status(400).SendString("Campaign not found") + } + if campaign.Interact != "Dynamic" { + return c.Status(400).SendString("Cannot create interaction for campaign") + } + iID := c.Params("cID") + "-" + c.Params("iID") + interaction, err := analytics.FindCampaignByCID(iID) + if err == nil { + bufferData(interaction.NotionID, 1, 0) + return c.SendStatus(204) + } else { + err := analytics.CreatePage(iID, cID, campaign.NotionID) + if err != nil { + return c.Status(400).SendString("Failed creating KPI") + } + return c.SendStatus(204) + } + }) + + return v2 +} + +// This is a private bridge function for v1/v2 API endpoints +// since the v2 API endpoints need to return the unformatted +// notion.PageResult instead of the formatted notion.Campaign +func v2FindCampaignByCIDWithoutConvert(cID string) (notion.PageResult, error) { + db, err := notion.FetchDatabase() + if err != nil { + return notion.PageResult{}, err + } + + for _, pageResult := range db.Results { + page := notion.ConvertPageResult(pageResult) + if page.CampaignID == cID { + return pageResult, nil + } + } + + return notion.PageResult{}, errors.New("campaign not found") +} diff --git a/cmd/analytics/v3.go b/cmd/analytics/v3.go new file mode 100644 index 0000000..cd51bf4 --- /dev/null +++ b/cmd/analytics/v3.go @@ -0,0 +1,105 @@ +package main + +import ( + "encoding/json" + + "github.com/gofiber/fiber/v2" + "github.com/ivynya/analytics/internal/notion" + analytics "github.com/ivynya/analytics/pkg" +) + +func createRouterV3(a *fiber.App) fiber.Router { + v3 := a.Group("/v3") + + // Returns a campaign if it is public as a Page + // 0, 0 = visits/interactions (read-only) + v3.Get("/campaign/:cID", func(c *fiber.Ctx) error { + return v3UpdateCampaign(c, 0, 0) + }) + + // Increment campaign visits + // 1, 0 = visits/interactions (+1 visit, 0 interactions) + v3.Post("/campaign/:cID", func(c *fiber.Ctx) error { + return v3UpdateCampaign(c, 1, 0) + }) + + // Increment campaign interactions + // 0, 1 = visits/interactions (0 visits, +1 interaction) + v3.Post("/campaign/:cID/interaction", func(c *fiber.Ctx) error { + return v3UpdateCampaign(c, 0, 1) + }) + + // Returns an KPI if it is public as a Page + // 0, 0 = visits/interactions (read-only) + v3.Get("/campaign/:cID/interaction/:iID", func(c *fiber.Ctx) error { + return v3UpdateInteraction(c, 0, 0) + }) + + // Create/increment KPI interaction + // 0, 1 = visits/interactions (0 visits, +1 interaction) + v3.Post("/campaign/:cID/interaction/:iID", func(c *fiber.Ctx) error { + return v3UpdateInteraction(c, 0, 1) + }) + + // Create/increment KPI visit + // 1, 0 = visits/interactions (+1 visit, 0 interactions) + v3.Post("/campaign/:cID/visit/:iID", func(c *fiber.Ctx) error { + return v3UpdateInteraction(c, 1, 0) + }) + + return v3 +} + +// If the campaign exists, buffer the data and return v3ResponseProtocol +// On error (campaign does not exist), return 400 +func v3UpdateCampaign(c *fiber.Ctx, visits int, interactions int) error { + campaign, err := analytics.FindCampaignByCID(c.Params("cID")) + if err != nil { + return c.Status(400).SendString("Campaign not found") + } + bufferData(campaign.NotionID, visits, interactions) + return v3ResponseProtocol(c, campaign) +} + +// If the interaction exists, buffer the data and return v3ResponseProtocol +// If the interaction does not exist, create it and return 204 +// On error (campaign does not exist, is not Dynamic), return 400 +func v3UpdateInteraction(c *fiber.Ctx, visits int, interactions int) error { + cID := c.Params("cID") + campaign, err := analytics.FindCampaignByCID(cID) + if err != nil { + return c.Status(400).SendString("Campaign does not exist") + } + if campaign.Interact == "Disabled" { + return c.Status(400).SendString("Campaign interactions disabled") + } + iID := c.Params("cID") + "-" + c.Params("iID") + interaction, err := analytics.FindCampaignByCID(iID) + if err == nil { + bufferData(interaction.NotionID, visits, interactions) + return v3ResponseProtocol(c, campaign) + } else { + if campaign.Interact != "Dynamic" { + return c.Status(400).SendString("Campaign dynamic interactions disabled") + } + err := analytics.CreatePage(iID, cID, campaign.NotionID) + if err != nil { + return c.Status(400).SendString("Failed creating KPI") + } + return c.SendStatus(204) + } +} + +// If the campaign is public, return the campaign as JSON (Page) +// If the campaign is not public, return 204 +func v3ResponseProtocol(c *fiber.Ctx, campaign notion.Page) error { + if campaign.Public == "True" { + jso, err := json.Marshal(campaign) + if err != nil { + return c.Status(500).SendString("Internal server error") + } + return c.SendString(string(jso)) + } else { + return c.SendStatus(204) + } +} diff --git a/deps.ts b/deps.ts deleted file mode 100644 index f48cac8..0000000 --- a/deps.ts +++ /dev/null @@ -1,5 +0,0 @@ - -import "https://deno.land/x/dotenv@v3.1.0/load.ts"; - -export { flattenQuery, flattenPage } from "https://deno.land/x/notion_flatten@v0.2.1/mod.ts"; -export { Application, Router } from 'https://deno.land/x/oak@v10.6.0/mod.ts'; \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f141f40 --- /dev/null +++ b/go.mod @@ -0,0 +1,22 @@ +module github.com/ivynya/analytics + +go 1.20 + +replace github.com/ivynya/analytics/internal => ../internal + +require github.com/gofiber/fiber/v2 v2.48.0 + +require ( + github.com/andybalholm/brotli v1.0.5 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/joho/godotenv v1.5.1 + github.com/klauspost/compress v1.16.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.48.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + golang.org/x/sys v0.11.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..fb86862 --- /dev/null +++ b/go.sum @@ -0,0 +1,97 @@ +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/gofiber/fiber/v2 v2.43.0 h1:yit3E4kHf178B60p5CQBa/3v+WVuziWMa/G2ZNyLJB0= +github.com/gofiber/fiber/v2 v2.43.0/go.mod h1:mpS1ZNE5jU+u+BA4FbM+KKnUzJ4wzTK+FT2tG3tU+6I= +github.com/gofiber/fiber/v2 v2.48.0 h1:cRVMCb9aUJDsyHxGFLwz/sGzDggdailZZyptU9F9cU0= +github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= +github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= +github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 h1:rmMl4fXJhKMNWl+K+r/fq4FbbKI+Ia2m9hYBLm2h4G4= +github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94/go.mod h1:90zrgN3D/WJsDd1iXHT96alCoN2KJo6/4x1DZC3wZs8= +github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d/go.mod h1:Gy+0tqhJvgGlqnTF8CVGP0AaGRjwBtXs/a5PA0Y3+A4= +github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee h1:8Iv5m6xEo1NR1AvpV+7XmhI4r39LGNzwUL4YpMuL5vk= +github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee/go.mod h1:qwtSXrKuJh/zsFQ12yEE89xfCrGKK63Rr7ctU/uCo4g= +github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw= +github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.45.0 h1:zPkkzpIn8tdHZUrVa6PzYd0i5verqiPSkgTd3bSUcpA= +github.com/valyala/fasthttp v1.45.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasthttp v1.48.0 h1:oJWvHb9BIZToTQS3MuQ2R3bJZiNSa2KiNdeI8A+79Tc= +github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/notion/notion.go b/internal/notion/notion.go new file mode 100644 index 0000000..6aa2334 --- /dev/null +++ b/internal/notion/notion.go @@ -0,0 +1,104 @@ +package notion + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "net/http" + "os" + "time" +) + +var ( + databaseCache DatabaseResult + databaseCacheSet time.Time +) + +const CACHE_TIMEOUT = 1 * time.Minute + +func FetchDatabase() (DatabaseResult, error) { + if time.Since(databaseCacheSet) < CACHE_TIMEOUT { + return databaseCache, nil + } + + db_id := os.Getenv("NOTION_DB_ID") + url := "https://api.notion.com/v1/databases/" + db_id + "/query" + client := &http.Client{} + req, _ := http.NewRequest("POST", url, nil) + req.Header.Add("Authorization", "Bearer "+os.Getenv("NOTION_TOKEN")) + req.Header.Add("Notion-Version", "2022-06-28") + + res, err := client.Do(req) + if err != nil { + return DatabaseResult{}, err + } + defer res.Body.Close() + + var j DatabaseResult + err = json.NewDecoder(res.Body).Decode(&j) + if err != nil { + return DatabaseResult{}, err + } + + databaseCache = j + databaseCacheSet = time.Now() + + return j, nil +} + +func CreatePage(body string) error { + url := "https://api.notion.com/v1/pages" + client := &http.Client{} + req, _ := http.NewRequest("POST", url, bytes.NewBuffer([]byte(body))) + req.Header.Add("Authorization", "Bearer "+os.Getenv("NOTION_TOKEN")) + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Notion-Version", "2022-06-28") + _, err := client.Do(req) + if err != nil { + return err + } + return nil +} + +func FetchPage(id string) (Page, error) { + url := "https://api.notion.com/v1/pages/" + id + client := &http.Client{} + req, _ := http.NewRequest("GET", url, nil) + req.Header.Add("Authorization", "Bearer "+os.Getenv("NOTION_TOKEN")) + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Notion-Version", "2022-06-28") + + res, err := client.Do(req) + if err != nil { + return Page{}, err + } + defer res.Body.Close() + + var j PageResult + err = json.NewDecoder(res.Body).Decode(&j) + if err != nil { + return Page{}, err + } + + return ConvertPageResult(j), nil +} + +func UpdatePage(id string, body string) error { + url := "https://api.notion.com/v1/pages/" + id + client := &http.Client{} + req, _ := http.NewRequest("PATCH", url, bytes.NewBuffer([]byte(body))) + req.Header.Add("Authorization", "Bearer "+os.Getenv("NOTION_TOKEN")) + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Notion-Version", "2022-06-28") + + res, err := client.Do(req) + if err != nil { + return err + } + if res.StatusCode != 200 { + return errors.New("notion " + fmt.Sprint(res.StatusCode)) + } + + return nil +} diff --git a/internal/notion/result.go b/internal/notion/result.go new file mode 100644 index 0000000..cb15cae --- /dev/null +++ b/internal/notion/result.go @@ -0,0 +1,27 @@ +package notion + +func ConvertPageResult(p PageResult) Page { + // Get the campaign ID from the result + campaignID := "" + for _, richText := range p.Properties.CampaignID.RichText { + campaignID += richText.PlainText + } + + // Get the parent campaign IDs from the result + parentIDs := make([]string, len(p.Properties.ParentCampaign.Relation)) + for i, campaign := range p.Properties.ParentCampaign.Relation { + parentIDs[i] = campaign.ID + } + + // Return the formatted page object + return Page{ + NotionID: p.ID, + CampaignID: campaignID, + ParentCampaigns: parentIDs, + Interact: p.Properties.Interact.Select.Name, + Public: p.Properties.Public.Select.Name, + Visits: p.Properties.Visits.Number, + RefVisits: p.Properties.RefVisits.Number, + Interactions: p.Properties.Interactions.Number, + } +} diff --git a/internal/notion/types.go b/internal/notion/types.go new file mode 100644 index 0000000..11255f2 --- /dev/null +++ b/internal/notion/types.go @@ -0,0 +1,54 @@ +package notion + +type DatabaseResult struct { + Results []PageResult `json:"results"` + NextCursor string `json:"next_cursor"` + HasMore bool `json:"has_more"` +} + +type PageResult struct { + ID string `json:"id"` + Properties struct { + CampaignID struct { + RichText []struct { + PlainText string `json:"plain_text"` + } `json:"rich_text"` + } `json:"CampaignID"` + RefVisits struct { + Number int `json:"number"` + } `json:"RefVisits"` + Visits struct { + Number int `json:"number"` + } `json:"Visits"` + Interactions struct { + Number int `json:"number"` + } `json:"Interactions"` + ParentCampaign struct { + Relation []struct { + ID string `json:"id"` + } `json:"relation"` + HasMore bool `json:"has_more"` + } `json:"ParentCampaign"` + Interact struct { + Select struct { + Name string `json:"name"` + } `json:"select"` + } `json:"Interact"` + Public struct { + Select struct { + Name string `json:"name"` + } `json:"select"` + } `json:"Public"` + } `json:"properties"` +} + +type Page struct { + NotionID string `json:"id"` + CampaignID string `json:"campaign_id"` + ParentCampaigns []string `json:"parent_campaigns"` + Interact string `json:"interact"` + Public string `json:"public"` + Visits int `json:"visits"` + RefVisits int `json:"ref_visits"` + Interactions int `json:"interactions"` +} diff --git a/main.ts b/main.ts deleted file mode 100644 index eece28b..0000000 --- a/main.ts +++ /dev/null @@ -1,14 +0,0 @@ - -import { Application } from "./deps.ts"; -import { api as api_v1 } from "./api/v1.ts"; -import { api as api_v2 } from "./api/v2.ts"; - -const app = new Application(); - -app.use(api_v1.routes()); -app.use(api_v1.allowedMethods()); -app.use(api_v2.routes()); -app.use(api_v2.allowedMethods()); - -console.log("[EVT] Listening http://localhost:8000"); -await app.listen({ port: 8000 }); \ No newline at end of file diff --git a/notion/createPage.ts b/notion/createPage.ts deleted file mode 100644 index 6fd1f54..0000000 --- a/notion/createPage.ts +++ /dev/null @@ -1,22 +0,0 @@ - -export async function createPage(name: string, parentName: string, parentID: string|undefined) { - return await fetch(`https://api.notion.com/v1/pages`, { - method: "POST", - headers: { - "Authorization": `Bearer ${Deno.env.get("NOTION_TOKEN")}`, - "Content-Type": "application/json", - "Notion-Version": "2022-06-28" - }, - body: JSON.stringify({ - "parent": { "database_id": Deno.env.get("NOTION_DB_ID") }, - "properties": { - "Campaign": { "title": [{ "text": { "content": name } }] }, - "CampaignID": { "rich_text": [{ "text": { "content": parentName + "-" + name } }] }, - "ParentCampaign": parentID ? { "relation": [{ "id": parentID }] } : undefined, - "Visits": { "number": 0 }, - "RefVisits": { "number": 0 }, - "Interactions": { "number": 0 } - } - }) - }); -} \ No newline at end of file diff --git a/notion/getPage.ts b/notion/getPage.ts deleted file mode 100644 index 2dd22d9..0000000 --- a/notion/getPage.ts +++ /dev/null @@ -1,14 +0,0 @@ - -import { flattenPage } from "../deps.ts"; - -export async function getPage(id: string) { - const res = await (await fetch(`https://api.notion.com/v1/pages/${id}`, { - method: "GET", - headers: { - "Authorization": `Bearer ${Deno.env.get("NOTION_TOKEN")}`, - "Notion-Version": "2021-08-16" - } - })).json(); - - return flattenPage(res); -} \ No newline at end of file diff --git a/notion/queryDatabase.ts b/notion/queryDatabase.ts deleted file mode 100644 index 7085b82..0000000 --- a/notion/queryDatabase.ts +++ /dev/null @@ -1,24 +0,0 @@ - -import { flattenQuery } from "../deps.ts"; - -const cachePath = `${Deno.cwd()}/notion/cache.json`; -let lastUpdated = new Date(0); - -export async function queryDatabase(): Promise { - if (lastUpdated.getTime() + 10000 > Date.now()) - return JSON.parse(await Deno.readTextFile(cachePath)); - else lastUpdated = new Date(); - - const id = Deno.env.get("NOTION_DB_ID"); - const res = await (await fetch(`https://api.notion.com/v1/databases/${id}/query`, { - method: "POST", - headers: { - "Authorization": `Bearer ${Deno.env.get("NOTION_TOKEN")}`, - "Notion-Version": "2021-08-16" - } - })).json(); - - const flatRes = flattenQuery(res); - await Deno.writeTextFile(cachePath, JSON.stringify(flatRes)); - return flatRes; -} diff --git a/notion/updatePage.ts b/notion/updatePage.ts deleted file mode 100644 index f96883b..0000000 --- a/notion/updatePage.ts +++ /dev/null @@ -1,63 +0,0 @@ - -import { getPage } from "./getPage.ts"; - -function genVisit(num: number) { - return { "properties": { - "Visits": { "number": num } } - }; -} - -function genRefVisit(num: number, refNum: number) { - return { - "properties": { - "Visits": { "number": num }, - "RefVisits": { "number": refNum } - } - }; -} - -export function updateInteractions(page: any, num: number) { - if (page.ParentCampaign?.length > 0) { - page.ParentCampaign.forEach(async (obj: {id: string}) => { - const parentPage = await getPage(obj.id); - await updateInteractions(parentPage, num); - }) - } - - const i = page.Interactions + num; - return fetch(`https://api.notion.com/v1/pages/${page.id}`, { - body: JSON.stringify({ - "properties": { - "Interactions": { "number": i }, - }, - }), - method: "PATCH", - headers: { - "Authorization": `Bearer ${Deno.env.get("NOTION_TOKEN")}`, - "Content-Type": "application/json", - "Notion-Version": "2021-08-16", - }, - }); -} - - -export function updateVisits(page: any, num: number, ref=false) { - if (page.ParentCampaign?.length > 0) { - page.ParentCampaign.forEach(async (obj: {id: string}) => { - const parentPage = await getPage(obj.id); - await updateVisits(parentPage, num, true); - }) - } - - const v = page.Visits + num; - const rV = page.RefVisits + num; - return fetch(`https://api.notion.com/v1/pages/${page.id}`, { - body: JSON.stringify(ref ? genRefVisit(v, rV) : genVisit(v)), - method: "PATCH", - headers: { - "Authorization": `Bearer ${Deno.env.get("NOTION_TOKEN")}`, - "Content-Type": "application/json", - "Notion-Version": "2021-08-16" - } - }); -} \ No newline at end of file diff --git a/pkg/create_kpi.go b/pkg/create_kpi.go new file mode 100644 index 0000000..3179fd9 --- /dev/null +++ b/pkg/create_kpi.go @@ -0,0 +1,28 @@ +package analytics + +import ( + "fmt" + "os" + + "github.com/ivynya/analytics/internal/notion" +) + +// Create a new campaign page in Notion given CampaignID +// and ParentCampaignID with parent campaign's NotionID +func CreatePage(cID string, parentCID string, parentNID string) error { + body := fmt.Sprintf(` + { + "parent": { "database_id": "%s" }, + "properties": { + "Campaign": { "title": [{ "text": { "content": %s } }] }, + "CampaignID": { "rich_text": [{ "text": { "content": %s-%s } }] }, + "ParentCampaign": { "relation": [{ "id": { "content": "%s" } }] }, + "Visits": { "number": 0 }, + "RefVisits": { "number": 0 }, + "Interactions": { "number": 0 } + } + } + `, os.Getenv("NOTION_DB_ID"), cID, parentCID, cID, parentNID) + + return notion.CreatePage(body) +} diff --git a/pkg/find_campaign.go b/pkg/find_campaign.go new file mode 100644 index 0000000..5e83a93 --- /dev/null +++ b/pkg/find_campaign.go @@ -0,0 +1,41 @@ +package analytics + +import ( + "errors" + + "github.com/ivynya/analytics/internal/notion" +) + +// Find a campaign by its CampaignID property +func FindCampaignByCID(cID string) (notion.Page, error) { + db, err := notion.FetchDatabase() + if err != nil { + return notion.Page{}, err + } + + for _, pageResult := range db.Results { + page := notion.ConvertPageResult(pageResult) + if page.CampaignID == cID { + return page, nil + } + } + + return notion.Page{}, errors.New("campaign not found") +} + +// Find a campaign by its NotionID/raw ID property +func FindCampaignByNID(nID string) (notion.Page, error) { + db, err := notion.FetchDatabase() + if err != nil { + return notion.Page{}, err + } + + for _, pageResult := range db.Results { + page := notion.ConvertPageResult(pageResult) + if page.NotionID == nID { + return page, nil + } + } + + return notion.Page{}, errors.New("campaign not found") +} diff --git a/pkg/update_interactions.go b/pkg/update_interactions.go new file mode 100644 index 0000000..bf71305 --- /dev/null +++ b/pkg/update_interactions.go @@ -0,0 +1,37 @@ +package analytics + +import ( + "fmt" + + "github.com/ivynya/analytics/internal/notion" +) + +// Update interactions of a campaign, along with any parent campaigns +func UpdateInteractions(nID string, num int) error { + campaign, err := notion.FetchPage(nID) + if err != nil { + return err + } + + if len(campaign.ParentCampaigns) > 0 { + for _, parentNID := range campaign.ParentCampaigns { + err := UpdateInteractions(parentNID, num) + if err != nil { + return err + } + } + } + + v := campaign.Interactions + num + bodyString := fmt.Sprintf(` + { "properties": { + "Interactions": { "number": %d } + } }`, v) + + err = notion.UpdatePage(nID, bodyString) + if err != nil { + return err + } + + return nil +} diff --git a/pkg/update_visits.go b/pkg/update_visits.go new file mode 100644 index 0000000..c77646c --- /dev/null +++ b/pkg/update_visits.go @@ -0,0 +1,43 @@ +package analytics + +import ( + "fmt" + + "github.com/ivynya/analytics/internal/notion" +) + +// Update vists of a campaign, along with any parent campaigns +// If ref is true, will update ref visits of the campaign +func UpdateVisits(nID string, num int, ref bool) error { + campaign, err := notion.FetchPage(nID) + if err != nil { + return err + } + + if len(campaign.ParentCampaigns) > 0 { + for _, parentNID := range campaign.ParentCampaigns { + err := UpdateVisits(parentNID, num, true) + if err != nil { + return err + } + } + } + + v := campaign.Visits + num + r := campaign.RefVisits + if ref { + r += num + } + bodyString := fmt.Sprintf(` + { "properties": { + "Visits": { "number": %d }, + "RefVisits": { "number": %d } + } }`, v, r) + + err = notion.UpdatePage(nID, bodyString) + if err != nil { + return err + } + + return nil +} diff --git a/schema/buffer.ts b/schema/buffer.ts deleted file mode 100644 index fc94f4b..0000000 --- a/schema/buffer.ts +++ /dev/null @@ -1,7 +0,0 @@ - -export interface Buffer { - [id: string]: { - visits: number - interactions: number - } -} \ No newline at end of file