Compare commits

...

2065 commits
v1.3.0 ... main

Author SHA1 Message Date
Nevo David
09088a5391 Merge remote-tracking branch 'origin/main'
Some checks failed
Build / build (22.12.0) (push) Has been cancelled
Code Quality Analysis / Analyze (javascript-typescript) (push) Has been cancelled
2026-05-18 20:49:30 +07:00
Nevo David
faeb89853b feat: threads error 2026-05-18 20:32:45 +07:00
Nevo David
6fc51da7e3
Merge pull request #1538 from gitroomhq/feat/list-view-post-filters
Add state filter (all/scheduled/draft/published) to list view
2026-05-18 20:24:39 +07:00
Santosh Bhandari
415c9c4ba8
Merge pull request #1537 from gitroomhq/tiktok-info
Show TikTok title/content restriction notice for video posts
2026-05-18 10:29:12 +00:00
Santosh Bhandari
e19c855da6
Merge pull request #1539 from gitroomhq/fix/tiktok-pending-share-error-message
Clarify TikTok pending-share error mentions the 24-hour window
2026-05-18 10:27:59 +00:00
Santosh Bhandari
7e0bb7075e fix: clarify TikTok pending-share error mentions 24-hour window
Some checks failed
Build / build (22.12.0) (push) Has been cancelled
TikTok's spam_risk_too_many_pending_share limit applies per 24-hour
period; the previous message did not state the window.
2026-05-18 15:28:03 +05:45
Nevo David
0b3328daeb feat: pinterest fixes 2026-05-18 16:39:38 +07:00
Santosh Bhandari
4811741e63 feat: filter list view by post state (all/scheduled/draft/published)
Adds a state filter to the calendar list view so users can see all
posts (default) or narrow to scheduled, draft, or published. The
backend repository now switches its WHERE/orderBy off the new query
param; 'all' includes ERROR posts so failed publishes remain visible.
2026-05-18 15:21:28 +05:45
Santosh Bhandari
7dda2812d7 feat: add TikTok restriction notice for video posts
Show an inline warning explaining title/content limitations for
direct-post vs upload-only video modes on TikTok.
2026-05-18 14:44:25 +05:45
Nevo David
2316a45388 feat: upgrade nextjs due to security risks 2026-05-18 13:55:12 +07:00
Nevo David
38b0ac8c70 feat: update nestjs 2026-05-15 16:15:50 +07:00
Nevo David
17fa64726c feat: tracking 2026-05-14 18:10:01 +07:00
Nevo David
03ddef66e2 feat: trial tracker 2026-05-14 17:43:42 +07:00
Nevo David
0dce16029e feat: google tag 2026-05-14 17:32:54 +07:00
Nevo David
03aa6b13dd Merge remote-tracking branch 'origin/main' 2026-05-14 16:51:27 +07:00
Nevo David
630602858e feat: gtm 2026-05-14 16:50:01 +07:00
Nevo David
715d3e40fd
Merge pull request #1514 from gitroomhq/feat/creation-method-tracking
feat: track post creation method (WEB/API/MCP/AUTOPOST)
2026-05-14 12:40:16 +07:00
Santosh Bhandari
e63d6d2cf2 feat: restrict public API creation methods to CLI and API 2026-05-14 10:06:58 +05:45
Nevo David
f2ebadab9e
Merge pull request #1515 from gitroomhq/feat/has-extension-helper
feat: hasExtension helper for media type detection
2026-05-14 11:13:36 +07:00
Nevo David
1677714670
Merge branch 'main' into feat/has-extension-helper 2026-05-14 11:13:12 +07:00
Enno Gelhaus
b4635f026b
feat: increase default api rate limit to 90 2026-05-13 17:43:22 +02:00
Nevo David
5f2f5581b2 feat: 3d secure fix 2026-05-13 19:53:53 +07:00
Nevo David
7cc3d9bd78 feat: stripe fix 2026-05-13 09:01:22 +07:00
Nevo David
d2c1eabc8b feat: fix workflow after sleep 2026-05-12 23:57:13 +07:00
Nevo David
4ee5231cb2 Merge remote-tracking branch 'origin/main' 2026-05-12 23:34:02 +07:00
Nevo David
16abf0dc9a feat: posting if no subscription 2026-05-12 23:33:49 +07:00
Enno Gelhaus
86368d7b7b
feat: upgrade ci pnpm 2026-05-12 15:13:56 +02:00
Nevo David
e986d9e493 feat: strip links 2026-05-12 19:51:23 +07:00
Santosh Bhandari
aa0c16b648 feat: accept CLI creation method via public API 2026-05-12 17:25:10 +05:45
Santosh Bhandari
510f396389 feat: show creation method badge only when impersonating 2026-05-12 17:06:29 +05:45
Santosh Bhandari
80b6bdcabe feat: hasExtension helper for media type detection 2026-05-12 16:23:11 +05:45
Santosh Bhandari
e153ab0a9b feat: track post creation method (WEB/API/MCP/AUTOPOST) 2026-05-12 14:41:59 +05:45
Nevo David
cf0ab36a23 feat: deletedAt integrations ignore 2026-05-12 13:27:58 +07:00
Nevo David
009bd36528 feat: fix tiktok url ownership error 2026-05-11 17:50:14 +07:00
Nevo David
905392513f feat: no post 2026-05-11 14:16:08 +07:00
Nevo David
7be292094a feat: no post 2026-05-11 14:15:33 +07:00
Nevo David
6e55eb3b92 feat: more cover for pending queues 2026-05-11 13:57:46 +07:00
Nevo David
39f2a176e1 Merge remote-tracking branch 'origin/main' 2026-05-11 11:19:41 +07:00
Nevo David
638b071283 feat: corrupted file 2026-05-11 11:19:02 +07:00
Nevo David
060c77a68c
Merge pull request #1488 from gitroomhq/fix/ui-modal-max-width
Some checks failed
Build / build (22.12.0) (push) Has been cancelled
Code Quality Analysis / Analyze (javascript-typescript) (push) Has been cancelled
ui: update the modal such that for long text won't cause overflow
2026-05-07 10:40:39 +07:00
Nevo David
d4405906bd
Merge pull request #1489 from gitroomhq/feat/ui-notification-time
feat: update notification list to be scrollable and added time
2026-05-07 10:40:21 +07:00
Nevo David
c8f1074f48
Merge pull request #1494 from gitroomhq/fix/registration-email-lowercase
fix: lowercase email on local registration
2026-05-06 12:10:52 +07:00
Santosh Bhandari
dcb1b0188a fix: lowercase email on local registration 2026-05-06 10:46:25 +05:45
Enno Gelhaus
22f436e72e
feat: simplify pr template 2026-05-04 21:00:24 +02:00
Enno Gelhaus
53f0967e67
feat: merge queue 2026-05-04 15:50:13 +02:00
Santosh Bhandari
18a1a80871 feat: update notification list to be scrollable and added time 2026-05-04 19:05:21 +05:45
Santosh Bhandari
a6967c8519 ui: update the modal such that for long text won't cause overflow 2026-05-04 18:41:34 +05:45
Enno Gelhaus
7e92764ad2
Merge pull request #1482 from gitroomhq/feat/contribute-checker
feat: contributor form
2026-05-04 10:29:58 +02:00
Enno Gelhaus
1bf32426c7
Update contribution form link in CONTRIBUTING.md 2026-05-04 10:29:09 +02:00
Enno Gelhaus
779764aa5d
Fix contribution form link in PR template
Updated contribution form link in PR template.
2026-05-04 10:28:48 +02:00
Nevo David
232ebb2528
Merge pull request #1483 from gitroomhq/fix/linkedin-gif-sharp-compress-removal
fix: remove processing GIF via sharp in linkedin
2026-05-04 15:03:25 +07:00
Santosh Bhandari
d056225053 fix: remove processing GIF via sharp in linkedin 2026-05-04 08:09:25 +05:45
Enno Gelhaus
e419e05f09
Apply suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-03 16:27:56 +02:00
Enno Gelhaus
47ce014204
feat: contributor form 2026-05-03 14:17:54 +02:00
Nevo David
9d14b0262d Merge remote-tracking branch 'origin/main' 2026-05-02 14:00:32 +07:00
Nevo David
971042a074 feat: shrink workflow payload 2026-05-02 14:00:09 +07:00
Nevo David
c3976e554f
Merge pull request #1479 from gitroomhq/fix/discord-provider-error-handler
fix: properly handle error in discord provider
2026-05-01 09:42:49 +07:00
Santosh Bhandari
ef111eb1c4 fix: update error message 2026-04-30 21:45:25 +05:45
Enno Gelhaus
3ee35a7348
feat: temporarily disable cache to fix build 2026-04-30 17:52:36 +02:00
Santosh Bhandari
d6bc6eb0ff fix: properly handle error in discord provider 2026-04-30 21:28:11 +05:45
Nevo David
0d98fc02fb feat: X errors and force upload
Some checks failed
Build / build (22.12.0) (push) Has been cancelled
Code Quality Analysis / Analyze (javascript-typescript) (push) Has been cancelled
2026-04-30 18:34:18 +07:00
Nevo David
7264c00298 feat: err 2026-04-30 17:44:06 +07:00
Nevo David
bb7cd46a4f feat: errors 2026-04-30 17:24:01 +07:00
Nevo David
7236213ea4 feat: fix xss
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-04-27 14:50:55 +07:00
Nevo David
4bdcfec3d7 Merge remote-tracking branch 'origin/main' 2026-04-27 13:36:56 +07:00
Nevo David
cdcf63bf6b feat: when creating a postiz app, allow localhost 2026-04-27 13:17:12 +07:00
Enno Gelhaus
fd6553196b
Merge pull request #1465 from mousaa/pr/x-url-env
feat: add X_URL env var to docker-compose and .env.example
2026-04-26 14:49:40 +02:00
Nevo David
90b2581048 feat: better information on use Postiz for developers 2026-04-26 15:04:01 +07:00
Nevo David
4e7864c929 feat: better MCP options 2026-04-26 14:58:19 +07:00
Ahmed Mousa
b91ffdc9c3 fix: remove duplicate X_URL entry in docker-compose
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-25 16:17:55 -04:00
Ahmed Mousa
d75662b56a feat: add X_URL to docker-compose and .env.example
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-25 16:13:58 -04:00
Nevo David
876be6f8c6 Merge remote-tracking branch 'origin/main' 2026-04-22 22:26:50 +07:00
Nevo David
071143dcb0 feat: security fix 2026-04-22 22:25:48 +07:00
Enno Gelhaus
da448012dd
feat: remove insecure & unnecessary workflow. 2026-04-22 16:20:52 +02:00
Nevo David
e51cae1614 feat: fix analytics 2026-04-22 13:09:39 +07:00
Nevo David
fa5d7f4c40 feat: fix pop 2026-04-22 11:09:42 +07:00
Nevo David
0b554e6844 Merge remote-tracking branch 'origin/main' 2026-04-20 12:27:13 +07:00
Nevo David
8951289426 feat: fix previous agent messages 2026-04-20 12:26:56 +07:00
Enno Gelhaus
ec4759e934
feat: include cloud in security scope 2026-04-20 03:11:24 +02:00
Enno Gelhaus
c61e061145
feat: security refinement 2026-04-19 23:09:01 +02:00
Enno Gelhaus
8cfb634b66
feat: security rewording 2026-04-19 23:00:16 +02:00
Enno Gelhaus
55a542485a
feat: security additions 2026-04-19 22:58:05 +02:00
Enno Gelhaus
0eddfb3304
feat: security policy changes
- Add Response Timelines
- Add Security Scope
- Modify maintainer list for security maintainers
2026-04-19 21:13:12 +02:00
Nevo David
88006a7614 feat: mobile app iframe 2026-04-19 13:48:15 +07:00
Nevo David
45e55c545d feat: add auth header 2026-04-18 19:53:19 +07:00
Nevo David
0a8fa5bff6 feat: fix bridge 2026-04-18 18:36:57 +07:00
Nevo David
65d23707ab feat: fix bridge 2026-04-18 18:20:18 +07:00
Nevo David
846954f059 feat: bridge fix 2026-04-18 18:00:22 +07:00
Nevo David
c79965718f feat: auth changes 2026-04-18 17:14:10 +07:00
Nevo David
027c9caa96 feat: fix check validity 2026-04-18 02:18:28 +07:00
Nevo David
8a7e8eb8f3 feat: empty object 2026-04-18 01:16:32 +07:00
Nevo David
71b2e2e793 feat: fix validity 2026-04-18 00:17:05 +07:00
Nevo David
2ae293916b feat: fix validity 2026-04-18 00:12:41 +07:00
Nevo David
e5947034ab feat: check validity 2026-04-17 23:53:29 +07:00
Nevo David
0ecca5298d feat: remove gap 2026-04-17 22:41:30 +07:00
Nevo David
7d9b99abf3 feat: provider edit preview 2026-04-17 21:55:47 +07:00
Nevo David
45bdf128e9 feat: oauth mobile callback 2026-04-17 18:02:54 +07:00
Nevo David
4e277ed32d feat: load first 2026-04-17 17:52:15 +07:00
Nevo David
5257f2fabe feat: redirect url 2026-04-17 17:34:34 +07:00
Nevo David
386fc7b049 feat: fix generation 2026-04-15 17:53:37 +07:00
Nevo David
ec8c0f6fb9 feat: search in media 2026-04-14 20:35:17 +07:00
Nevo David
eb0334d96d Merge remote-tracking branch 'origin/main' 2026-04-13 23:31:47 +07:00
Nevo David
288a4d428b feat: change post status 2026-04-13 23:31:08 +07:00
Enno Gelhaus
1145e51ea6
feat: sentry replay 2026-04-13 07:10:56 +02:00
Nevo David
3ea302202d feat: fix advisory
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-04-12 10:27:01 +07:00
Nevo David
e3b3b82fae feat: instagram better error 2026-04-10 20:17:38 +07:00
Nevo David
318e9da8d1 feat: refresh token, show error 2026-04-10 19:08:09 +07:00
Nevo David
186d3370e9 feat: instagram refresh fix 2026-04-10 18:33:19 +07:00
Nevo David
98c32c3da5 feat: subreddit posting fix with api 2026-04-10 16:27:34 +07:00
Nevo David
3e8a0ab817 feat: langchain upgrade
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-04-09 18:28:44 +07:00
Nevo David
6a06b210c2 Merge remote-tracking branch 'origin/main' 2026-04-09 18:11:21 +07:00
Nevo David
30e8b77709 feat: security fixes 2026-04-09 18:11:07 +07:00
Enno Gelhaus
59e535e258
fix: pr quality 2026-04-08 12:25:49 +02:00
Enno Gelhaus
a8918a6284
feat: update pr quality 2026-04-08 12:24:30 +02:00
Nevo David
26d7ffa0ed Merge remote-tracking branch 'origin/main' 2026-04-07 18:05:44 +07:00
Nevo David
c7867ab05e feat: download invoices 2026-04-07 18:05:30 +07:00
Nevo David
9b50a18f2d
Merge pull request #1383 from swaraj017/debug/youtube-refresh-token
fix(youtube): preserve existing refresh token to avoid daily re-auth
2026-04-07 10:57:28 +07:00
swaraj017
943293dc7d fix(youtube): preserve existing refresh token to avoid daily re-auth 2026-04-06 23:33:26 +05:30
Enno Gelhaus
61a563a06c
Merge pull request #1369 from fizikiukas/patch-1
Update Hostinger link in README.md
2026-04-04 13:14:39 +02:00
Enno Gelhaus
76676510f2
Merge branch 'main' of https://github.com/gitroomhq/postiz-app 2026-04-04 12:46:54 +02:00
Enno Gelhaus
af8d04002c
feat: gitignore 2026-04-04 12:46:50 +02:00
Nevo David
d16945a9e2 feat: fix cli + server openai token 2026-04-04 15:00:27 +07:00
Nevo David
fb43544bb2 feat: fix parseR 2026-04-04 12:56:05 +07:00
Nevo David
008deb0daf feat: update axios version 2026-04-04 12:05:11 +07:00
Nevo David
c5882d3eae feat: auto accept and json response 2026-04-03 22:52:02 +07:00
Nevo David
1bbfa8d603 feat: fix header for all agents 2026-04-03 22:25:24 +07:00
Nevo David
6bf80ff846 feat: upgrade mcp 2026-04-03 21:48:41 +07:00
Nevo David
f55cca519c feat: override 2026-04-03 19:39:29 +07:00
Nevo David
ac109bf564 feat: mcp with oauth 2026-04-03 19:17:19 +07:00
Nevo David
5d46a6cd34 feat: new mastra 2026-04-03 18:39:33 +07:00
Nevo David
507a006b9f Merge remote-tracking branch 'origin/main' 2026-04-03 13:34:36 +07:00
Nevo David
073479bc4a feat: pinterest, show more boards 2026-04-03 13:34:24 +07:00
Valentinas Čirba
687925bcbf
Update Hostinger link in README.md 2026-04-03 08:35:00 +03:00
Nevo David
2d434fe198
Merge pull request #1359 from gitroomhq/feat/orchestrator-sentry
Feat/orchestrator sentry
2026-04-02 14:33:13 +07:00
Enno Gelhaus
e97be93dc4
revert: add sentry to orchestrator appmodule 2026-04-01 20:40:53 +02:00
Enno Gelhaus
bb63a7c8a9
feat: add sentry to orchestrator appmodule 2026-04-01 20:34:57 +02:00
Enno Gelhaus
0f4db4a375
feat: add sentry in orchestrator 2026-04-01 20:32:13 +02:00
Nevo David
3a376f4a9c feat: health check for temporal 2026-03-31 23:12:12 +07:00
Nevo David
afda06bb6a feat: show port 2026-03-31 21:36:37 +07:00
Nevo David
1840a6db6d feat: remove whitespace 2026-03-31 21:13:36 +07:00
Nevo David
b0832740d0 feat: developers UI, description 2026-03-31 13:42:44 +07:00
Nevo David
40d9d11f72 feat: add developers sections for non paying customers 2026-03-31 12:00:11 +07:00
Nevo David
7b67b4a6b5 Merge remote-tracking branch 'origin/main' 2026-03-31 11:38:09 +07:00
Nevo David
8c03078086 feat: fix integrations + import option + reelfarm 2026-03-31 11:37:51 +07:00
Enno Gelhaus
5ae4c950db
feat: secure /webhooks with IsSafeWebhookUrl
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-03-29 17:56:45 +02:00
Nevo David
6f7a80f689 feat: steam url fix
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-03-29 13:41:13 +07:00
Nevo David
52f59bcfde feat: steam url fix 2026-03-29 13:40:05 +07:00
Nevo David
13fedeca8b feat: upload from url, prevent internal access 2026-03-29 12:32:59 +07:00
Nevo David
f55253d1ab feat: refresh channel fix 2026-03-29 10:14:24 +07:00
Nevo David
e6a019b778 feat: announcement 2026-03-27 09:47:43 +07:00
Nevo David
8bb1935834 feat: upgrade polotno 2026-03-26 20:51:06 +07:00
Nevo David
117dab594e feat: fix tiktok key 2026-03-26 11:35:04 +07:00
Nevo David
777ca3d329 feat: fix typing 2026-03-26 11:21:11 +07:00
Nevo David
666de6ac06 feat: import post 2026-03-26 11:11:55 +07:00
Nevo David
2786fbaeba feat(x): add with AI, paid partenership 2026-03-26 09:48:55 +07:00
Nevo David
6aa5bf3591 fix mention component 2026-03-26 00:50:55 +07:00
Nevo David
d8386efc52 fix: mark posts with errors 2026-03-25 23:00:12 +07:00
Nevo David
be5d871896 fix: autopost url
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-03-25 17:45:18 +07:00
Nevo David
0ad89ccd26 feat: protect webhooks 2026-03-25 17:39:24 +07:00
Nevo David
92b82837e9 feat: remove Image
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-03-25 16:51:13 +07:00
Nevo David
0c7000276d feat: change lang 2026-03-25 16:17:34 +07:00
Nevo David
a8c8428ae2 feat: fix direction 2026-03-25 16:08:30 +07:00
Nevo David
f675dd5179 feat: change dir 2026-03-25 15:57:46 +07:00
Nevo David
358bf62804 feat: layout 2026-03-25 15:17:35 +07:00
Nevo David
e621f965b5 feat: layout 2026-03-25 15:02:47 +07:00
Nevo David
072c6bac4a feat: fix language, dont cache cookies 2026-03-25 14:52:49 +07:00
Nevo David
c7a88b98bc feat: language switch 2026-03-25 14:42:00 +07:00
Nevo David
3bc3d004fa feat: language switch 2026-03-25 14:24:26 +07:00
Nevo David
afe06768fe feat: fix direction 2026-03-25 14:14:25 +07:00
Nevo David
41d48a81fd Merge remote-tracking branch 'origin/main' 2026-03-25 13:56:17 +07:00
Nevo David
b71297db57 feat: upgrade nextjs to the latest version 2026-03-25 13:55:45 +07:00
Enno Gelhaus
c280139917
feat: update security guidelines
- Add AI section
- Add PoC requirement
- Change reporting behavior
- Remove template
2026-03-23 18:31:23 +01:00
Nevo David
20053fc2f8
Remove Enterprise section from README
Removed the Postiz-as-a-service - Enterprise section from the README.
2026-03-22 13:32:31 +07:00
Nevo David
1aa47351a4 feat: revert all the mod changes 2026-03-22 10:23:52 +07:00
Nevo David
40c443ba96 feat: revert workflow| 2026-03-22 10:12:02 +07:00
Nevo David
cb8560e183 Merge remote-tracking branch 'origin/main' 2026-03-22 10:10:28 +07:00
Nevo David
9df6ab6b48 feat: tiktok 2026-03-22 10:10:14 +07:00
Enno Gelhaus
9a29793e2c
improve: sentry metrics 2026-03-21 23:30:20 +01:00
Enno Gelhaus
8d25914bd1
feat: sentry langchain 2026-03-21 23:07:42 +01:00
Enno Gelhaus
ac61be6454
fix: sentry metrics 2026-03-21 23:04:27 +01:00
Enno Gelhaus
8bbed0698d
Merge pull request #1331 from gitroomhq/feat/sentry-metrics
feat: a lot of sentry metrics
2026-03-21 22:34:22 +01:00
Enno Gelhaus
da995de88f
feat: security 2026-03-21 22:32:34 +01:00
Enno Gelhaus
1c04544c54
feat: a lot of sentry metrics 2026-03-21 22:18:28 +01:00
Enno Gelhaus
c539fa8cf4
feat: sentry v10.45 2026-03-21 14:46:29 +01:00
Nevo David
c164db76d9 Merge remote-tracking branch 'origin/main' 2026-03-21 16:32:48 +07:00
Nevo David
8dcfffff53 feat: added cus 2026-03-21 16:32:34 +07:00
Enno Gelhaus
b6d6b7283f
improve: PR Quality 2026-03-20 19:22:52 +01:00
Enno Gelhaus
33f3e552cb
fix: format in PR Quality 2026-03-20 19:16:55 +01:00
Enno Gelhaus
2f85198887
improve: PR Quality 2026-03-20 19:15:27 +01:00
Enno Gelhaus
2cd2911de2
Merge pull request #1326 from swaraj017/fix/redirect-register-to-login
fix: redirect /auth/register to /auth/login when registration is disabled
2026-03-20 16:27:10 +01:00
Enno Gelhaus
65939d3341
feat: improve PR Quality Workflow 2026-03-20 16:03:34 +01:00
Enno Gelhaus
eb14bd9f05
feat: Add AI section to PR Template 2026-03-20 15:58:25 +01:00
Enno Gelhaus
fa27e38ca0
feat: Add AI section to CONTRIBUTING.md 2026-03-20 15:57:17 +01:00
swaraj017
2f6896b332 fix: use correct DISABLE_REGISTRATION env variable 2026-03-18 14:59:17 +05:30
swaraj017
472ef851c2 fix: redirect /auth/register to /auth/login when registration is disabled 2026-03-18 12:45:43 +05:30
Nevo David
cf2a980dd8 feat: mewe
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-03-18 10:45:28 +07:00
Nevo David
2ae98a925a feat: fix adding integrations 2026-03-16 22:45:23 +07:00
Enno Gelhaus
e20565fb23
Add PR Quality workflow for pull request checks 2026-03-11 19:15:25 +01:00
Enno Gelhaus
3b79a74092
Merge pull request #1289 from Bramw2003/fix/skip-subscription-check-without-stripe
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
fix: skip subscription check when Stripe is not configured
2026-03-10 19:40:22 +01:00
Nevo David
08c3143647 feat: fix postiz oauth 2026-03-10 12:21:45 +07:00
Nevo David
41fcb08834 feat: postiz oauth fix 2026-03-10 12:05:21 +07:00
Nevo David
3d09e9f2c5 feat: fix oauth 2026-03-10 12:02:51 +07:00
Nevo David
f624321b43 feat: agent-media sso 2026-03-08 22:27:06 +07:00
Bram de Smidt
f1a32f243e
Merge branch 'main' into fix/skip-subscription-check-without-stripe 2026-03-06 19:46:52 +01:00
Nevo David
634bee898a feat: remove proxy 2026-03-06 21:44:35 +07:00
Nevo David
5e386155f9 feat: check proxy file 2026-03-06 21:26:55 +07:00
Nevo David
983286005a feat: change lock 2026-03-06 21:16:52 +07:00
Nevo David
3cf1cd05b3 feat: agent 2026-03-06 20:48:05 +07:00
Bram de Smidt
01fd2df995 fix: skip subscription check when Stripe is not configured
When STRIPE_SECRET_KEY is not set, posting should work without
requiring a subscription row in the database. This allows self-hosted
instances without Stripe to publish posts normally.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-06 14:35:02 +01:00
Nevo David
0b7fd01a82 feat: urgent fix, stripe requires api key in the last version
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-03-06 19:37:08 +07:00
Nevo David
72e63a41c2 feat: fix sets extra space
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-03-06 11:20:57 +07:00
Nevo David
2a194b680e feat: telegram fix 2026-03-06 10:37:14 +07:00
Nevo David
9fa6786754 feat: remove lifetime check 2026-03-06 08:10:29 +07:00
Nevo David
624a4a9775 feat: show package 2026-03-05 15:39:31 +07:00
Nevo David
4ba1c5e415 feat: public controller modify sub 2026-03-05 15:00:32 +07:00
Nevo David
748e2190e9 feat: remove logic and add logic to enterprise 2026-03-05 12:03:06 +07:00
Nevo David
78b834d18f feat: enhance api 2026-03-05 10:41:18 +07:00
Nevo David
ad0b0259eb feat: add organization to auth flow 2026-03-05 09:40:52 +07:00
Nevo David
fe51c788c7 feat: agent media 2026-03-04 15:20:58 +07:00
Nevo David
24a37a56a7 Merge remote-tracking branch 'origin/main' 2026-03-04 13:08:55 +07:00
Nevo David
5d4808a07a feat: update x api 2026-03-04 13:08:39 +07:00
Enno Gelhaus
cdeef9b4d6
Fix email address for security vulnerability reporting 2026-03-03 15:03:25 +01:00
Nevo David
778d255a15 feat: url 2026-03-03 20:25:48 +07:00
Nevo David
52d84a2bfb feat: change redirect url 2026-03-03 19:42:43 +07:00
Nevo David
42d7927d1c feat: change redirect url 2026-03-03 19:22:47 +07:00
Nevo David
354b206280 feat: improve AppSumo webhook handling and auth safety
- Add activate event handler with org lookup via subscription or user/provider
- Add postRegistration guard in auth service to prevent errors on missing method
- Fix deactivate to use organization paymentId for subscription deletion
- Change Dependabot interval from daily to weekly

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 18:54:08 +07:00
Nevo David
0d7e54023c feat: login change and appsumo 2026-03-03 17:42:17 +07:00
Nevo David
681e6d4cb4 feat: delete error 2026-03-03 15:25:48 +07:00
Nevo David
09341d345f feat: logout in billing screen 2026-03-03 13:15:54 +07:00
Nevo David
c36a5d54f2 Merge branch 'feat/mewe' 2026-03-03 11:09:11 +07:00
Nevo David
11e32c20fb feat: mcp with oauth2 2026-03-03 10:27:54 +07:00
Nevo David
72b0dfaf8a Merge remote-tracking branch 'origin/main' 2026-03-03 01:32:39 +07:00
Nevo David
e4c4d6470c feat: oauth 2026-03-03 01:32:26 +07:00
Nevo David
334dda7609 feat: oauth 2026-03-03 00:46:46 +07:00
Nevo David
aa37ad0a11
Add Virlo as a new sponsor in README
Added Virlo as a new sponsor with logo and description.
2026-03-02 23:33:22 +07:00
Nevo David
ff4ee6c5fe feat: maximum 500 2026-03-02 20:25:33 +07:00
Nevo David
98d9ddc83e feat: update stripe version 2026-03-02 17:12:54 +07:00
Nevo David
724e5bc497 feat: don't post without a subscription 2026-03-02 15:33:36 +07:00
Nevo David
16713f03b6 feat: facebook and instagram connect 2026-03-02 14:20:43 +07:00
Nevo David
daa1e0f91b feat: google my business pagination 2026-03-02 14:11:34 +07:00
Nevo David
5751a62f44 feat: multiple sses 2026-03-01 17:13:39 +07:00
Nevo David
d0a6ee330d feat: re-add sse option for mcp 2026-03-01 16:40:51 +07:00
Nevo David
6c39e810db feat: seperate mcp url 2026-02-28 16:53:03 +07:00
Nevo David
71833f3f39 feat: mewe 2026-02-28 15:01:54 +07:00
Nevo David
92abb07712 Merge branch 'main' into feat/mewe 2026-02-28 12:19:42 +07:00
Nevo David
ff89a21c98 feat: redis throttler 2026-02-27 19:41:20 +07:00
Nevo David
7bfa3e5ad9 feat: only success charges 2026-02-27 18:58:17 +07:00
Nevo David
258378770e feat: refund and cancellation 2026-02-27 18:37:29 +07:00
Nevo David
bd82f3e4ca feat: better tiktok errors 2026-02-27 10:40:32 +07:00
Nevo David
292f96f959 feat: collaborators fix 2026-02-22 16:53:15 +07:00
Nevo David
35f75e7ff5 feat: no collaborators in carusel 2026-02-22 16:36:22 +07:00
Nevo David
fdd7168742 feat: not possible to regsiter new attributes with tls 2026-02-22 00:10:25 +07:00
Nevo David
39dd1d4cdd feat: temporal tls and api key 2026-02-21 22:09:00 +07:00
Nevo David
7627b80bfc feat: remove upload throttle
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-02-20 17:53:13 +07:00
Nevo David
d7322d11fd feat: compression 2026-02-20 13:05:55 +07:00
Nevo David
b9f3b646fc feat: better indexes 2026-02-20 12:30:31 +07:00
Nevo David
5fddba6e98 feat: logout 2026-02-20 00:37:12 +07:00
Nevo David
ccd665715c feat: fix rate to only post request 2026-02-18 23:29:02 +07:00
Nevo David
b23298904a feat: tiktok fix 2026-02-18 21:07:12 +07:00
Nevo David
143bc229de feat: instagram multiple stories 2026-02-18 14:47:59 +07:00
Nevo David
001c70357c feat: postizpro 2026-02-18 08:34:26 +07:00
Nevo David
5d1988c2f1 fix emails and draft 2026-02-17 16:47:41 +07:00
Nevo David
118060bacd feat: tiktok 2026-02-17 14:07:13 +07:00
Nevo David
b744b60be6 feat: tiktok order 2026-02-17 11:32:49 +07:00
Nevo David
dfb5c05979 feat: mcp on route 2026-02-17 10:26:48 +07:00
Nevo David
13104962c6 feat: rotate api key 2026-02-17 10:05:12 +07:00
Nevo David
f7f5899d01 Feat: tiktok fixes 2026-02-16 20:32:54 +07:00
Nevo David
b854430f7d feat: release id must be string 2026-02-16 18:20:12 +07:00
Nevo David
009f2df074 feat: original name 2026-02-16 16:06:06 +07:00
Nevo David
613a4285ff feat: post missing modal 2026-02-16 00:17:59 +07:00
Nevo David
cfa52b2336 feat: bot nickname 2026-02-15 19:08:46 +07:00
Nevo David
381f9e8021 Merge remote-tracking branch 'origin/main' 2026-02-15 19:04:19 +07:00
Nevo David
16946b1c0f feat: fix reddit 2026-02-15 19:04:08 +07:00
Nevo David
9a7e051f5d
Merge pull request #1207 from cohax-llc/fix/upload-from-url-extension
fix(api): preserve file extension in upload-from-url endpoint
2026-02-15 16:37:07 +07:00
Nevo David
6f54180768 feat: same refresh token 2026-02-15 16:31:51 +07:00
Nevo David
38b1cb2ce5 feat: local store fixed when trying to download pictures
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-02-15 14:09:02 +07:00
Nevo David
ecb1b55ce1 feat: analytics public api 2026-02-15 12:40:02 +07:00
Nevo David
7ee7eacbcb Merge remote-tracking branch 'origin/main' 2026-02-15 11:41:54 +07:00
Nevo David
56efd49d8f feat: tiktok fixes 2026-02-15 11:41:39 +07:00
Enno Gelhaus
844449b378
Update checkout action version to v6 2026-02-14 18:59:40 +01:00
Nevo David
c908813d0f
Update README.md 2026-02-14 13:45:26 +07:00
Nevo David
dc8a380176 feat: README and SKILL 2026-02-14 11:57:12 +07:00
Nevo David
6a69ac7eb4 feat: skill 2026-02-14 11:42:56 +07:00
Nevo David
af08ae1187 feat: tools in public api 2026-02-14 11:00:14 +07:00
Nevo David
6aa6dfb614 feat: fix settings 2026-02-14 10:37:26 +07:00
Nevo David
2feadf4673 feat: platforms settings 2026-02-14 10:33:33 +07:00
Nevo David
2c475d1238 feat: postiz cli 2026-02-14 10:28:16 +07:00
Nevo David
33c8adbef1 feat: get settings 2026-02-14 10:27:02 +07:00
Nevo David
0c02554064 feat: cli 2026-02-14 09:48:10 +07:00
Nevo David
683d4c3682 feat: mewe 2026-02-14 09:32:26 +07:00
Nevo David
ba71bbf5a8 feat: cli agent 2026-02-13 22:41:21 +07:00
Nevo David
80d8804f5a feat: tiktok fixes 2026-02-13 21:49:08 +07:00
Nevo David
a098d612af feat: no posts with a deleted integration 2026-02-11 22:04:47 +07:00
Nevo David
3b57679430 feat: notifications 2026-02-11 21:05:56 +07:00
Nevo David
d929c96792 feat: map more errors, rate limits 2026-02-11 20:31:14 +07:00
Nevo David
7f7c336939 feat: restricted 2026-02-11 20:17:32 +07:00
Nevo David
d055e69335 feat: delete post 2026-02-11 17:41:13 +07:00
Nevo David
95956fe345 feat: throw wordpress 2026-02-11 16:57:55 +07:00
Nevo David
f7d36b36e7 feat: wordpress insufficent permission 2026-02-11 14:48:32 +07:00
Nevo David
82c8b53236 feat: fix bold and underline for gt and lt
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-02-11 13:29:11 +07:00
Nevo David
0ceaa3d04d feat: trial reels 2026-02-10 10:21:38 +07:00
Nevo David
5869300e64 feat: dont refresh 2026-02-09 18:50:13 +07:00
Nevo David
b3681d2ac1 feat: whop
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-02-09 17:02:28 +07:00
Nevo David
945dc09f48 feat: fix ai agent
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-02-09 12:42:36 +07:00
Nevo David
029ddb29d1 feat: fix linkedin carusel 2026-02-09 12:05:40 +07:00
Nevo David
5f5d746f8a feat: show file name in uploads 2026-02-09 11:37:22 +07:00
Nevo David
f5ff72b706 feat: platforms with a chrome extension
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-02-08 21:10:11 +07:00
Nevo David
e3c3854840 feat: platforms with a chrome extension 2026-02-08 20:53:28 +07:00
Nevo David
f72d63bd43 feat: update token to all orgs 2026-02-07 00:16:42 +07:00
Nevo David
1c3cb008c6 feat: retry resource 2026-02-06 23:49:11 +07:00
Emi Rexhepi
ee8b26f383 fix(api): preserve file extension in upload-from-url endpoint
The upload-from-url endpoint passed an empty originalname to
uploadFile(), causing extname('') to return '' and files to be saved
without an extension. Derive the extension from the response
Content-Type header (or URL fallback) so files are stored with the
correct extension on disk.

Fixes gitroomhq/postiz-app#1147

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 15:40:55 +01:00
Nevo David
52ec091400 feat: wordpress 2026-02-06 15:21:51 +07:00
Nevo David
9de380f6ba Merge remote-tracking branch 'origin/main' 2026-02-06 09:42:32 +07:00
Nevo David
c481add80b feat: switch org 2026-02-06 09:40:55 +07:00
Nevo David
572de8a2d0
Revise Postiz-as-a-service to Enterprise offering
Updated the Postiz-as-a-service section to reflect the enterprise offering and enhanced the description for clarity.
2026-02-05 20:48:29 +07:00
Nevo David
eccc767701 feat: fix transloadit 2026-02-05 14:15:35 +07:00
Nevo David
089b9ebc40 Merge remote-tracking branch 'origin/main' 2026-02-05 11:41:56 +07:00
Nevo David
650d92bb56 feat: allow mov 2026-02-05 11:41:42 +07:00
Nevo David
58bc35148c
Update README.md 2026-02-04 20:40:12 +07:00
Nevo David
5a193fd19e
Update README.md 2026-02-04 20:38:31 +07:00
Nevo David
0928f76284
Update README.md 2026-02-04 20:38:02 +07:00
Nevo David
c970bfab95 feat: hostinger 2026-02-04 20:36:46 +07:00
Nevo David
34243312ad feat: generate url 2026-02-04 15:43:22 +07:00
Nevo David
70be520c0b feat: public list integrations 2026-02-04 15:14:01 +07:00
Nevo David
e7999ea151 feat: apiKey 2026-02-04 13:01:10 +07:00
Nevo David
979b81d6d0 feat: enterprise 2026-02-04 12:32:44 +07:00
Nevo David
6d173ab7cd feat: enterprise 2026-02-04 12:32:00 +07:00
Nevo David
638debdaa4 feat: enterprise 2026-02-03 21:34:23 +07:00
Nevo David
f5ef80546e feat: enterprise 2026-02-03 21:12:28 +07:00
Nevo David
bb9e731174 feat: metadata 2026-02-02 23:01:33 +07:00
Nevo David
656f29eb34 feat: activate 2026-02-02 22:34:21 +07:00
Nevo David
437a3b5143 feat: tracking 2026-02-02 22:15:08 +07:00
Nevo David
47414acf29 feat: moltbook 2026-02-02 13:13:54 +07:00
Nevo David
68705fca69 feat: fix providers 2026-02-02 11:27:28 +07:00
Nevo David
a936da4851 feat: fix state for bluesky 2026-02-02 11:12:04 +07:00
Nevo David
1a8f6ff6ca fix: new error for facebook 2026-02-01 22:29:41 +07:00
Nevo David
9b712bb634 feat: independent provider adding 2026-02-01 19:41:07 +07:00
Nevo David
fe457573ec feat: independent provider adding
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (22.12.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-02-01 17:01:37 +07:00
Nevo David
5f830f11b1 feat: large json 2026-02-01 11:50:59 +07:00
Nevo David
e1c51effad feat: counter in global mode 2026-02-01 09:04:20 +07:00
Nevo David
980ea7c5b4 Merge remote-tracking branch 'origin/main' 2026-01-30 18:40:10 +07:00
Nevo David
42529ac438 feat: filters 2026-01-30 18:39:45 +07:00
Enno Gelhaus
4ed1ffe206
Update Node.js version in build workflow 2026-01-30 11:14:56 +01:00
Nevo David
ccce5d8122 feat: list view 2026-01-30 16:22:04 +07:00
Nevo David
7909228271 feat: better validation 2026-01-30 12:50:06 +07:00
Nevo David
17bde5858c feat: tiktok analytics 2026-01-30 12:23:28 +07:00
Nevo David
5c50e962ae feat: tiktok analytics 2026-01-30 11:06:50 +07:00
Nevo David
ee012fb021 fix: border image
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-01-28 18:44:35 +07:00
Nevo David
e551d151d6 fix: border image 2026-01-28 16:24:02 +07:00
Nevo David
881c37ed6f feat: streak 2026-01-28 16:00:48 +07:00
Nevo David
c3cdee5c21 feat: streak 2026-01-28 14:53:45 +07:00
Nevo David
aa17498a52 feat: easy close statistics 2026-01-28 10:53:39 +07:00
Nevo David
ddbfd16030 feat: faster remove of socials from scheduling 2026-01-28 10:50:32 +07:00
Nevo David
b6928138d2 feat: fix instagram analytics 2026-01-28 10:12:56 +07:00
Nevo David
078d4739c8 feat: fix instagram analytics 2026-01-28 09:58:57 +07:00
Nevo David
ec4b19c741 feat: delete tags 2026-01-27 22:17:25 +07:00
Nevo David
2813ed01f9 feat: protected reposting post when clicking update 2026-01-27 21:44:30 +07:00
Nevo David
defd9e0a63 feat: scheduling edge-cases 2026-01-27 18:13:02 +07:00
Nevo David
8c4e69dd3d feat: another safety to force termination of a workflow 2026-01-27 17:48:59 +07:00
Nevo David
7e92a767e4 remove focused channel 2026-01-26 12:28:50 +07:00
Nevo David
1d9af510e5 fix: tiktok 2026-01-26 11:51:37 +07:00
Nevo David
f39ab5dc80 fix: share post not only with community 2026-01-24 17:40:44 +07:00
Nevo David
ec5210be51 feat: add twitch 2026-01-24 16:35:54 +07:00
Nevo David
e9f2660002 feat: remove channel selection 2026-01-24 15:36:06 +07:00
Nevo David
7e1e5f36e3 feat: kick 2026-01-24 15:00:42 +07:00
Nevo David
bf9ab0fd95 youtube onboarding 2026-01-24 01:01:30 +07:00
Nevo David
8bb1fc826f upgrade upload images to v2 2026-01-23 18:42:35 +07:00
Nevo David
608185fd9a fix: onboarding 2026-01-23 17:06:46 +07:00
Nevo David
43ced2e7b6 feat: onboarding 2026-01-23 16:37:28 +07:00
Nevo David
ba7fc7a8e8 feat: onboarding 2026-01-23 16:20:28 +07:00
Nevo David
5cb69667b3 feat: drag and drop files 2026-01-23 13:01:09 +07:00
Nevo David
baea8b28ee feat: nostr instructions 2026-01-23 11:38:18 +07:00
Nevo David
9e54e315fd fix: settings on the global edit 2026-01-21 17:56:38 +07:00
Nevo David
98a6fb1013 feat: analytics changes 2026-01-21 16:01:02 +07:00
Nevo David
2346223a04 feat: fix facebook impressions 2026-01-21 15:54:37 +07:00
Nevo David
1e19868b36 Merge remote-tracking branch 'origin/main' 2026-01-21 15:12:51 +07:00
Nevo David
5cca81e002 feat: post analytics 2026-01-21 15:11:29 +07:00
Nevo David
bfa552401e
Add video link for Postiz features in README
Updated README to include a video link showcasing Postiz features.
2026-01-19 22:05:19 +07:00
Nevo David
99889d59e2 fix: autoplay video 2026-01-19 17:31:14 +07:00
Nevo David
c8f6cdb643 fix: z-index 2026-01-19 17:25:13 +07:00
Nevo David
5bad88daa9 feat: ask for shortlinking 2026-01-19 16:33:24 +07:00
Nevo David
d8b8b3d629 feat: maximize media 2026-01-19 16:08:17 +07:00
Nevo David
8a577dea73 feat: time table improvements 2026-01-19 14:55:07 +07:00
Nevo David
809476aa1d fix: postiz agent 2026-01-18 15:30:09 +07:00
Nevo David
0d5b45cd11 fix: statistics 2026-01-18 11:51:40 +07:00
Nevo David
604b029a9d feat: start button 2026-01-18 09:44:22 +07:00
Nevo David
87eca91b9b fix: urgent providers fix
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-01-17 17:01:54 +07:00
Nevo David
88e05853c1 fix: urgent providers fix 2026-01-17 16:55:43 +07:00
Nevo David
34b465aaa1 fix: urgent providers fix 2026-01-17 16:53:54 +07:00
Nevo David
005e3f753b fix: urgent providers fix 2026-01-17 16:49:40 +07:00
Nevo David
e29812501e fix: urgent providers fix 2026-01-17 16:35:56 +07:00
Nevo David
7eeb1cb044 fix: slack urgent fix for posting 2026-01-17 16:27:02 +07:00
Nevo David
5bfb97e9a4 fix: remove billing address 2026-01-17 13:53:54 +07:00
Nevo David
ba0a2498a4 fix: remove billing address 2026-01-17 13:28:09 +07:00
Nevo David
47e7c843c9 feat: better biling 2026-01-17 12:03:28 +07:00
Nevo David
ba4ad5deb2 feat: stripe changes 2026-01-17 11:42:12 +07:00
Nevo David
07b0c2e85d feat: refresh token before expiration for specific platforms 2026-01-16 20:41:29 +07:00
Nevo David
13d4bb0086 Merge remote-tracking branch 'origin/main' 2026-01-16 18:02:44 +07:00
Nevo David
abd73039c3 fix: support much smaller resolutions 2026-01-16 18:01:18 +07:00
Nevo David
0af727e0cf
Update README.md 2026-01-14 16:32:05 +07:00
Nevo David
563e7a257b fix: docker-compose for temporal
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2026-01-14 14:10:20 +07:00
Nevo David
d7a92e0b92 feat: safe stringify 2026-01-13 19:33:25 +07:00
Nevo David
5665774260 resend activation email 2026-01-12 18:55:24 +07:00
Nevo David
6859f0d049 feat: retry no activity 2026-01-12 16:15:39 +07:00
Nevo David
82d91fd8ed fix: don't modify gif 2026-01-12 15:54:12 +07:00
Nevo David
b2677649df fix: don't modify gif 2026-01-12 15:53:47 +07:00
Nevo David
fddf61f052 fix: logo 2026-01-11 19:30:21 +07:00
Nevo David
05b6b2ec00 fix: encode instead of decode 2026-01-11 18:22:18 +07:00
Nevo David
fca16b5c48 fix: rolling id 2026-01-11 16:39:45 +07:00
Nevo David
31ccf8d352 fix: rolling id 2026-01-11 15:46:41 +07:00
Nevo David
ce94f9bcc4 fix: dont try to post of parent is not null 2026-01-11 14:57:08 +07:00
Nevo David
c5bacf7d43 feat: change social concurrency 2026-01-11 13:50:54 +07:00
Nevo David
38cbeb8d95 feat: change social concurrency 2026-01-11 13:49:59 +07:00
Nevo David
46b1263304 feat: add comment from another user 2026-01-09 15:04:16 +07:00
Nevo David
631d7c15e8 feat: better workflow logic 2026-01-09 10:41:07 +07:00
Nevo David
3e8f5ddca6 fix: email notifiations 2026-01-08 21:44:43 +07:00
Nevo David
07238a06a6 feat: big workflow change 2026-01-08 21:26:29 +07:00
Nevo David
96661cc30d fix: url 2026-01-07 20:39:15 +07:00
Nevo David
774d29d798 feat: fetch post faster 2026-01-07 18:38:08 +07:00
Nevo David
bd24282d2b fix: don't wait for workflow start, for faster creation 2026-01-07 15:40:31 +07:00
Nevo David
82a92afabb fix: don't wait for workflow start, for faster creation 2026-01-07 15:31:51 +07:00
Nevo David
2cc639bbfc fix: workflow termination 2026-01-07 13:57:45 +07:00
Nevo David
2544e870aa feat: delayed comments 2026-01-07 12:29:22 +07:00
Nevo David
4836b2e7c1 feat: delay 2026-01-07 11:35:48 +07:00
Nevo David
407cfa67ef fix: priority fix for send email 2026-01-07 09:59:33 +07:00
Nevo David
7e73017d3f fix: priority fix for send email 2026-01-07 09:54:45 +07:00
Nevo David
bddb937258 feat: longer digest 2026-01-07 01:25:42 +07:00
Nevo David
7001295fa5 feat: longer digest 2026-01-07 01:22:02 +07:00
Nevo David
475cf8e0fb feat: longer digest 2026-01-07 01:21:11 +07:00
Nevo David
0f4c39ede0 feat: never exit workflow 2026-01-06 21:13:51 +07:00
Nevo David
012a347ed6 feat: logging error 2026-01-06 20:54:55 +07:00
Nevo David
633c08fde7 feat: try await in send email 2026-01-06 20:37:28 +07:00
Nevo David
8b0fe19b41 feat: change cancellation type 2026-01-06 20:04:56 +07:00
Nevo David
95eace849b fix: send email 2026-01-06 17:02:50 +07:00
Nevo David
5f1a77a3b0 fix: use existing workflow 2026-01-06 16:35:42 +07:00
Nevo David
7ac99e8259 fix: digest send async 2026-01-06 12:51:06 +07:00
Nevo David
5d76475801 fix: 50ms between emails, prevent resend from crashing 2026-01-06 12:34:54 +07:00
Nevo David
bb9aa1aee6 feat: fix post edit 2026-01-05 22:34:36 +07:00
Nevo David
ead98cb41f fix: no refresh - set error 2026-01-05 22:17:51 +07:00
Nevo David
fc349942b5 feat: fix refresh token 2026-01-05 21:30:04 +07:00
Nevo David
c7b83ee361 Merge remote-tracking branch 'origin/main' 2026-01-05 21:10:27 +07:00
Nevo David
3f674de401 fix: old providers without selection 2026-01-05 21:10:12 +07:00
Enno Gelhaus
de74191bab feat: add spotlight integration to Sentry initialization 2026-01-05 14:29:16 +01:00
Nevo David
691d15db03 fix: youtube and gmb 2026-01-05 18:54:11 +07:00
Nevo David
dac6e8e189 fix: refresh token 2026-01-05 18:50:25 +07:00
Nevo David
204739f049 feat: fix refresh token 2026-01-05 18:38:17 +07:00
Nevo David
0144e39841 feat: no sleep option 2026-01-05 18:00:49 +07:00
Nevo David
1291937cb2 fix: only queue state 2026-01-05 17:58:21 +07:00
Nevo David
b5979b290d feat: run old also 2026-01-05 17:55:02 +07:00
Nevo David
6eb55e128f fix: run prod 2026-01-05 17:49:11 +07:00
Nevo David
78e1a14388 feat: redeploy 2026-01-05 17:41:04 +07:00
Nevo David
c740da360b feat: fix lockfile 2026-01-05 17:38:46 +07:00
Nevo David
95303b2975
Merge pull request #1157 from gitroomhq/feat/temporal
Moving from BullMQ to Temporal - big change
2026-01-05 17:35:14 +07:00
Nevo David
6633fab924 feat: final temporal touches 2026-01-05 17:28:53 +07:00
Nevo David
da0045428a feat: temporal - huge refactor 2026-01-05 15:49:19 +07:00
Nevo David
d8a6215155 feat: before split 2026-01-05 11:35:15 +07:00
Nevo David
9e0eff7e5a feat: payload wizard 2026-01-03 11:00:06 +07:00
Nevo David
cd085e27ca feat: more translations 2026-01-01 16:07:58 +07:00
Nevo David
b3d298daff fix: change vietnam flag 2026-01-01 15:09:23 +07:00
Nevo David
4f0f4c27f9 Merge remote-tracking branch 'origin/main' 2026-01-01 14:56:04 +07:00
Nevo David
c8c812e1eb feat: fix additional settings modal 2026-01-01 14:55:41 +07:00
Nevo David
44f190d466
Update README.md 2025-12-31 13:03:41 +07:00
Nevo David
5f4de7c987 feat: fullscreen 2025-12-29 22:20:16 +07:00
Nevo David
faef57738c feat: generator 2025-12-29 22:01:47 +07:00
Nevo David
0e5d6f8826 fix: hot fix for modal creation
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-12-29 09:36:00 +07:00
Nevo David
6729de4563 fix: hot fix for modal creation 2025-12-29 09:31:13 +07:00
Nevo David
ca941aed85 fix: customer 2025-12-29 02:59:17 +07:00
Nevo David
00caa7ddc4 feat: moving to dub partners 2025-12-29 02:11:40 +07:00
Nevo David
e5a4c558dd feat: fix throttle 2025-12-28 21:01:20 +07:00
Nevo David
b9062423a4 feat: fix linkedin pdf 2025-12-28 18:54:31 +07:00
Nevo David
7a82798cdc feat: fix throttler 2025-12-28 18:24:33 +07:00
Nevo David
3387b3c989 feat: higher concurrency rate for facebook 2025-12-28 18:12:18 +07:00
Nevo David
e0b496c4f9 feat: settings change 2025-12-28 17:53:45 +07:00
Nevo David
5f945bd396 feat: color changes 2025-12-28 17:37:00 +07:00
Nevo David
a188baa6f7 feat: calendar skeleton 2025-12-28 16:23:40 +07:00
Nevo David
9c751fb725 feat: provider checks protection 2025-12-28 10:28:09 +07:00
Nevo David
8c1191a093 fix: full screen settings 2025-12-28 01:36:41 +07:00
Nevo David
2cf0d632de feat: editor bug fixes, some previews 2025-12-27 23:30:15 +07:00
Nevo David
0d134c0a6f feat: editor bug fixes, some previews 2025-12-27 23:20:07 +07:00
Nevo David
90da9d4aff fix: pagination 2025-12-27 10:24:11 +07:00
Nevo David
6f889d42c8 feat: responsive payment 2025-12-26 19:43:55 +07:00
Nevo David
f98ae083ab feat: fix monthly yearly 2025-12-26 18:14:32 +07:00
Nevo David
1c61e76c9f fix: better block view 2025-12-26 17:44:10 +07:00
Nevo David
70d07249d3 faet: remove comments 2025-12-26 14:11:24 +07:00
Nevo David
13137e803d Merge remote-tracking branch 'origin/main' 2025-12-26 11:21:53 +07:00
Nevo David
1da332eec1 feat: sentry errors 2025-12-26 11:21:12 +07:00
Enno Gelhaus
0043029292
Merge pull request #1138 from Fer-r/feature/webp-image-upload-support
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
feat: add WebP image upload support
2025-12-26 04:54:45 +01:00
fer-r
2497bd139d feat: add WebP image upload support
- Added image/webp to the list of allowed MIME types in the file uploader preprocessor
- Added .webp extension validation in ValidUrlExtension validator
- Updated error message to include .webp in the list of valid extensions

Closes #1055
2025-12-26 03:10:49 +01:00
Nevo David
d4f18d1030 HOT FIX
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-12-26 08:09:16 +07:00
Nevo David
74b84b5eeb feat: fix information display 2025-12-25 21:38:08 +07:00
Nevo David
f5dff1e655 feat: svg change
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-12-25 19:02:52 +07:00
Nevo David
37c45743a8 feat: refactor for creation modal 2025-12-25 18:29:12 +07:00
Nevo David
ec623a678e fix: discord support 2025-12-22 23:44:03 +07:00
Nevo David
63c3e1c233 fix: tolt 2025-12-22 21:15:14 +07:00
Nevo David
f4dec2ed26 feat: powered by 2025-12-22 19:17:10 +07:00
Nevo David
21f0b64344 feat: trailing 2025-12-22 19:02:50 +07:00
Nevo David
0690d0b80b feat: logo fix 2025-12-22 18:33:23 +07:00
Nevo David
d43690e688 feat: force nextjs version 2025-12-22 18:28:34 +07:00
Nevo David
eaec9bf585 feat: neyner fix 2025-12-22 18:04:36 +07:00
Nevo David
8d0b4a125a feat: upgrade old packages 2025-12-22 17:51:27 +07:00
Nevo David
3e04076d5d feat: check payment 2025-12-22 17:42:40 +07:00
Nevo David
9c2abfb47f feat: nextjs upgrade 2025-12-22 17:36:23 +07:00
Nevo David
1114bbd8df feat: old layout remove 2025-12-22 17:29:18 +07:00
Nevo David
59d0df5b5c feat: package upgrade 2025-12-22 17:24:14 +07:00
Nevo David
e6f2d87943 feat: extension 2025-12-22 17:15:49 +07:00
Nevo David
0fe10976b0 feat: billing change 2025-12-22 17:08:35 +07:00
Nevo David
991d354c34 feat: billing change 2025-12-22 16:55:51 +07:00
Nevo David
022f9bf8c6 feat: width change 2025-12-19 10:56:50 +07:00
Nevo David
b7ce23cc5d fix: mobile cons 2025-12-18 14:38:40 +07:00
Nevo David
e066804178 Merge remote-tracking branch 'origin/main' 2025-12-18 14:28:16 +07:00
Nevo David
7294cad60b feat: branded signin-signup 2025-12-18 14:27:57 +07:00
Nevo David
f4ce7f74f9 feat: register change 2025-12-18 12:15:04 +07:00
Enno Gelhaus
41090bdab8
Merge pull request #1118 from adambkovacs/fix/docker-build-fresh-base-image 2025-12-15 13:52:03 +01:00
Adam Kovacs
6c4cf4164c fix(ci): Force fresh base image in Docker builds
Add --pull and --no-cache flags to docker buildx build to ensure:
- Base image (node:22.20-alpine) is always pulled fresh
- No cached layers from previous builds are used

This fixes issue #1079 where published images contained outdated
Node.js v20.18.x instead of the expected v22.20.x from Dockerfile.dev,
causing Prisma 7 compatibility failures.

Fixes #1079
2025-12-14 21:21:04 -08:00
Enno Gelhaus
8e30271fbc
Temporarily disable ESLint 2025-12-09 16:00:17 +01:00
Nevo David
1f7279719c Merge remote-tracking branch 'origin/main' 2025-12-09 21:36:32 +07:00
Nevo David
7ae9ddbd02 feat: no follow in terms and privacy 2025-12-09 21:36:16 +07:00
Enno Gelhaus
aa35492fb7
Update cache dependency path to pnpm-lock.yaml 2025-12-06 23:17:02 +01:00
Enno Gelhaus
ce3cd7ba0e
Change cache dependency path to pnpm-lock.json
Updated cache dependency path to use pnpm-lock.json instead of package-lock.json.
2025-12-06 23:15:17 +01:00
Enno Gelhaus
f7aa06475c
Refactor build workflow by removing unnecessary steps
Removed the SonarQube analysis step and commit SHA retrieval from the build workflow.
2025-12-06 23:14:38 +01:00
Enno Gelhaus
6304354953
feat/github CI cleanup 2025-12-06 23:08:29 +01:00
Enno Gelhaus
10d807430b
feat/dependabot 2025-12-06 23:06:13 +01:00
Enno Gelhaus
4ac671f646
feat/Github Issue templates 2025-12-06 22:46:41 +01:00
Nevo David
16d4b4508f feat: fix nostr 2025-12-05 23:08:27 +07:00
Nevo David
ab2502086a fix: nostr 2025-12-05 21:29:57 +07:00
Nevo David
2706d511ce fix: hot fix for menu items
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-12-05 15:55:14 +07:00
Nevo David
c982e30e96 feat: notifcations settings
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-12-05 14:32:20 +07:00
Nevo David
d89eb44b8f feat: ui fixes 2025-12-05 11:39:00 +07:00
Nevo David
2b32d561e9 feat: fix z-index 2025-12-04 19:13:43 +07:00
Nevo David
45294e07b5 feat: better layout 2025-12-04 18:16:50 +07:00
Nevo David
943acec8e4 fix: refresh token unified, and found some bugs 2025-12-04 14:12:33 +07:00
Nevo David
71174c1b8f feat: typing 2025-12-02 19:46:26 +07:00
Nevo David
b1ccd6d6ce feat: missing dto 2025-12-02 19:45:53 +07:00
Nevo David
292c3e480b feat: unified continue providers 2025-12-02 16:04:54 +07:00
Nevo David
e1225681a9 feat: youtube select page 2025-12-02 15:39:20 +07:00
Nevo David
fd7b755bef feat: refresh list 2025-12-02 12:15:48 +07:00
Nevo David
9afeb1e0f8 feat: billing change 2025-11-30 00:17:02 +07:00
Nevo David
6ab8a2471b feat: billing fix 2025-11-29 23:05:43 +07:00
Nevo David
d5729e25a4 Merge remote-tracking branch 'origin/main' 2025-11-28 18:09:28 +07:00
Nevo David
1e4b1b8baf feat: add www to threads 2025-11-28 18:08:41 +07:00
Nevo David
12ab71b6bd
Clean up README by removing unnecessary elements
Removed outdated links and images from README.
2025-11-28 16:22:53 +07:00
Nevo David
8dc422ee31 feat: gmb analytics
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-11-27 22:44:33 +07:00
Nevo David
7921ef3d81 feat: fix errors 2025-11-27 21:18:31 +07:00
Nevo David
fa1b8b83fe
Merge pull request #1082 from gitroomhq/feat/gmb
Add Google My Business
2025-11-27 20:58:01 +07:00
Nevo David
69e8944437 feat: google my business 2025-11-27 20:56:57 +07:00
Nevo David
4eac6b9ff8 feat: gmb 2025-11-27 20:37:09 +07:00
Nevo David
98edbc4588 feat: fix farcaster 2025-11-27 00:42:27 +07:00
Nevo David
b2abb20da7 test: debug farcaster 2025-11-27 00:21:00 +07:00
Nevo David
953e00119a Merge remote-tracking branch 'origin/main' 2025-11-27 00:19:12 +07:00
Nevo David
04a50b8b46 test: debug farcaster 2025-11-27 00:17:46 +07:00
Enno Gelhaus
52e8198bf1
Add replayCanvasIntegration to Sentry client 2025-11-26 15:54:20 +01:00
Enno Gelhaus
24ae266041 feat: add Sentry console logging integration and user report dialog 2025-11-26 15:33:57 +01:00
Enno Gelhaus
91931c9bda
feat: allow all logs to be passed to sentry 2025-11-26 13:24:34 +01:00
Nevo David
b4e375c010 feat: fix rss 2025-11-26 16:29:35 +07:00
Nevo David
0c74bb4250 feat: fix posting for lemmy 2025-11-26 15:02:33 +07:00
Nevo David
518d76e972 feat: billing fix 2025-11-25 14:27:34 +07:00
Nevo David
5a3906dc2e feat: save to user inbox 2025-11-24 15:26:47 +07:00
Nevo David
0d64ca4878 feat: higher node version
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-11-20 22:47:48 +07:00
Nevo David
104381d839 feat: force deploy
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-11-19 21:41:05 +07:00
Nevo David
58ca717a37 feat: force prisma version 2025-11-19 21:38:05 +07:00
Nevo David
8a4fb0e249 feat: fix package json 2025-11-19 21:12:12 +07:00
Enno Gelhaus
bd70bb6555
Basic Sentry Metric Functionality (#1064) 2025-11-19 15:05:03 +01:00
Nevo David
0fc9eeecaa feat: mention suggestions, allow space 2025-11-19 14:59:15 +07:00
Nevo David
74d665691f feat: logout for non secured 2025-11-19 14:37:20 +07:00
Nevo David
725ce402cf
Merge pull request #1057 from meysam81/meysam/fix/address-x-thread-finisher-html-marker
fix: Twitter/X thread finisher posting with HTML tags
2025-11-19 14:29:15 +07:00
Enno Gelhaus
197957672d
Increase sampleRate for frontend services
Set tracesSampleRate to 1.0 for all environments.
2025-11-18 15:52:14 +01:00
Enno Gelhaus
28eed857b2
Increase sampleRate for backend services
Set tracesSampleRate to 1.0 for all environments.
2025-11-18 15:51:41 +01:00
Nevo David
403b4a0fe1 stripe logic change 2025-11-17 19:47:45 +07:00
Enno Gelhaus
85a410256a
Merge pull request #1065 from fllppi/fix/oidc-redirect
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-11-15 22:15:54 +01:00
Flippi
f98e9dce52
fix(auth): stop inserting slash into OAuth url 2025-11-15 22:04:55 +01:00
Meysam Azad
4c3e002a26
Fix Twitter/X thread finisher posting with HTML tags
Previously, Twitter/X was posting thread finisher (message ending signature)
with HTML <p> elements hardcoded into the message text. This was because the
thread_finisher content was being used directly without HTML stripping.

This fix wraps the thread_finisher text with stripHtmlValidation() to remove
HTML tags and convert them to plain text, consistent with how other platforms
(Bluesky, Threads, Mastodon) handle this feature.

Changes:
- Added stripHtmlValidation() call for thread_finisher in X provider
- Now matches the implementation pattern used in Bluesky provider
- Ensures thread finisher posts plain text instead of HTML markup
2025-11-09 20:32:58 +07:00
Enno Gelhaus
52caf3d55c [WebLate] Translated (Georgian)
Currently translated at 100.0% (503 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/ka/
2025-11-07 06:23:03 +00:00
Enno Gelhaus
adbd5a9d70 [WebLate] Translated (Japanese)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/ja/
2025-11-07 06:23:03 +00:00
Enno Gelhaus
96151da9d1 [WebLate] Translated (French)
Currently translated at 100.0% (503 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/fr/
2025-11-07 06:23:03 +00:00
Enno Gelhaus
7376e230bd [WebLate] Translated (Bengali)
Currently translated at 100.0% (503 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/bn/
2025-11-07 06:23:03 +00:00
Enno Gelhaus
467eaa5d88 [WebLate] Translated (Chinese (Simplified Han script))
Currently translated at 99.6% (501 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/zh_Hans/
2025-11-06 16:32:09 +00:00
Enno Gelhaus
82b104b1d2 [WebLate] Translated (Vietnamese)
Currently translated at 99.6% (501 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/vi/
2025-11-06 16:32:09 +00:00
Enno Gelhaus
7ec67cf95b [WebLate] Translated (Korean)
Currently translated at 99.6% (501 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/ko/
2025-11-06 16:32:09 +00:00
Enno Gelhaus
006e9a8b30 [WebLate] Translated (Japanese)
Currently translated at 99.6% (501 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/ja/
2025-11-06 16:32:09 +00:00
Enno Gelhaus
b914a68c52 [WebLate] Translated (German)
Currently translated at 100.0% (503 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/de/
2025-11-06 16:32:08 +00:00
Enno Gelhaus
c9ba9f6f42 [WebLate] Translated (English)
Currently translated at 100.0% (503 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/en/
2025-11-06 16:32:08 +00:00
Enno Gelhaus
05d0e5a3c7 [WebLate] Translated (Spanish)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/es/
2025-11-06 14:23:18 +00:00
Enno Gelhaus
b0f7b5e1aa [WebLate] Translated (Georgian)
Currently translated at 99.6% (501 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/ka/
2025-11-06 14:23:18 +00:00
Enno Gelhaus
d896e8685f [WebLate] Translated (Russian)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/ru/
2025-11-06 14:23:18 +00:00
Enno Gelhaus
57dff20ff2 [WebLate] Translated (Hebrew)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/he/
2025-11-06 14:23:17 +00:00
Enno Gelhaus
82717ce794 [WebLate] Translated (Italian)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/it/
2025-11-06 14:23:17 +00:00
Enno Gelhaus
01708e5582 [WebLate] Translated (Arabic)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/ar/
2025-11-06 14:23:17 +00:00
Enno Gelhaus
f394e81f7b [WebLate] Translated (Portuguese)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/pt/
2025-11-06 14:23:17 +00:00
Enno Gelhaus
9dda04c353 [WebLate] Translated (German)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/de/
2025-11-06 14:23:17 +00:00
Enno Gelhaus
07318d0912 [WebLate] Translated (French)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/fr/
2025-11-06 14:23:09 +00:00
Enno Gelhaus
0d5af29f15 [WebLate] Translated (Turkish)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/tr/
2025-11-06 14:23:08 +00:00
Enno Gelhaus
6be5e3d8ac [WebLate] Translated (Bengali)
Currently translated at 99.8% (502 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/bn/
2025-11-06 14:23:08 +00:00
Enno Gelhaus
06995eedf1 [WebLate] Translated (English)
Currently translated at 100.0% (503 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/en/
2025-11-06 14:23:08 +00:00
Enno Gelhaus
5ba7138b57 Translated using Weblate (German)
Currently translated at 100.0% (503 of 503 strings)

Translation: Postiz/Postiz
Translate-URL: https://weblate.ennogelhaus.de/projects/postiz/postiz/de/
2025-11-05 20:35:17 +00:00
Nevo David
383830b6be fix: copilot payload 2025-10-27 01:30:27 +07:00
Nevo David
33255d7796 feat: youtube made for kids 2025-10-26 12:29:24 +07:00
Nevo David
4aa5f7b144 feat: fix mime type 2025-10-23 16:36:44 +07:00
Nevo David
5d1662e6c1 feat: upload file 2025-10-23 16:11:31 +07:00
Nevo David
034032a316 feat: ignore query string 2025-10-23 11:23:53 +07:00
Nevo David
0473c0f1af feat: who can reply
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-10-17 16:26:02 +07:00
Nevo David
59d2d54c51 feat: chars length check 2025-10-17 15:29:47 +07:00
Nevo David
e3413ac8d8 feat: no sse on copy 2025-10-17 14:43:42 +07:00
Nevo David
9ea471e515 fix(mcp): output for schedule post 2025-10-17 14:37:46 +07:00
Nevo David
9856af5a7a feat: move sentry to the top 2025-10-17 01:48:09 +07:00
Nevo David
500da63c21 feat: upgrade to node 22 2025-10-17 01:44:01 +07:00
Nevo David
0cdc0b850a feat: fix iv 2025-10-17 01:34:05 +07:00
Nevo David
ac13f44bbf feat: fix iv 2025-10-17 01:10:27 +07:00
Nevo David
40bfb612ae feat: fix iv 2025-10-17 01:07:31 +07:00
Nevo David
384ec56680 feat: replace cipher 2025-10-17 01:02:33 +07:00
Nevo David
c1bab07fb5 feat: replace cipher 2025-10-17 00:59:26 +07:00
Nevo David
22f983dde1 feat: expose copilot header 2025-10-17 00:39:02 +07:00
Nevo David
0eb6f807f2 feat: upgrade to node 22 2025-10-16 23:59:01 +07:00
Nevo David
e15180f026 feat: slugify override 2025-10-16 23:45:29 +07:00
Nevo David
e9cfe02a6f feat: slugify override 2025-10-16 23:45:03 +07:00
Nevo David
a3be403990 feat: override package 2025-10-16 23:34:23 +07:00
Nevo David
27e319771d feat: override package 2025-10-16 23:33:38 +07:00
Nevo David
a3a6aa3926 feat: change mastra instance to import 2025-10-16 23:14:11 +07:00
Nevo David
26bbded6bd Merge remote-tracking branch 'origin/main' 2025-10-16 23:01:02 +07:00
Nevo David
acaed7ae9e feat: load with import 2025-10-16 23:00:37 +07:00
Nevo David
50fb0f8442
Merge pull request #1027 from gitroomhq/feat/agent
Postiz Agent
2025-10-16 22:43:59 +07:00
Nevo David
d079c1b061 fix: remove vscode 2025-10-16 22:43:39 +07:00
Nevo David
1678d900cf Merge remote-tracking branch 'origin/feat/agent' into feat/agent 2025-10-16 22:30:43 +07:00
Nevo David
c75df52bd0 Merge remote-tracking branch 'origin/main' into feat/agent 2025-10-16 22:29:58 +07:00
Nevo David
2ab560e5fa feat: no throw 2025-10-16 22:29:43 +07:00
Enno Gelhaus
bf8688cda3
Merge branch 'main' into feat/agent 2025-10-16 16:58:27 +02:00
Nevo David
4bfeb01c5f feat: postiz agent 2025-10-16 21:19:38 +07:00
Nevo David
79de287542
Remove SonarQube badges from README
Removed SonarQube badges from the README.
2025-10-11 13:42:55 +07:00
Nevo David
cd99691462 Merge remote-tracking branch 'origin/main' 2025-10-07 17:26:28 +07:00
Nevo David
599e895239 feat: upload from url 2025-10-07 17:26:04 +07:00
Nevo David
41e7d0fdeb Feat: agent 2025-10-07 17:19:18 +07:00
Nevo David
73ba9acf8c feat: agent 2025-10-07 11:07:21 +07:00
Enno Gelhaus
0128eb77b0
Set replaysSessionSampleRate to a fixed value of 1.0 2025-10-04 00:07:47 +02:00
Enno Gelhaus
df47e9f5ed
Fix Sentry sample rates for production environment 2025-10-04 00:07:31 +02:00
Enno Gelhaus
826f803174 Fix quoting of environment variables in Jenkins pipeline to resolve compilation errors 2025-10-03 16:04:18 +02:00
Enno Gelhaus
6ef1543dcd Refactor Jenkins pipeline to remove global environment variable for Sonar Scanner and streamline installation process within the analysis stage 2025-10-03 15:56:16 +02:00
Enno Gelhaus
22dac4413c Refactor Jenkins pipeline to enhance SonarQube analysis by setting the global SONAR_SCANNER_PATH and improving scanner installation process 2025-10-03 15:29:26 +02:00
Enno Gelhaus
022cc3c32f Refactor Jenkins pipeline to streamline environment setup by removing unnecessary environment variables and enhancing SonarQube analysis with manual scanner installation 2025-10-03 15:27:01 +02:00
Enno Gelhaus
29384eebab Refactor Jenkins pipeline to enhance SonarQube analysis stage with manual scanner installation and improved environment variable handling 2025-10-03 15:23:21 +02:00
Enno Gelhaus
77b91d4d7c Update SonarQube environment configuration to use 'SonarQube-Server' and change token variable to 'SONAR_AUTH_TOKEN' 2025-10-03 15:16:34 +02:00
Enno Gelhaus
c124aa648b Refactor Jenkins pipeline to streamline Node.js setup and enhance SonarQube analysis stage 2025-10-03 15:08:46 +02:00
Enno Gelhaus
b2f5fb17d4 Refactor Jenkins pipeline to remove source checkout stage and enhance apt command execution with update step 2025-10-03 14:46:26 +02:00
Enno Gelhaus
b71f8a7acb Remove credentialsId from Git checkout configuration for improved security and flexibility 2025-10-03 14:44:51 +02:00
Enno Gelhaus
febfb1e7d6 Refactor Jenkins pipeline to remove unnecessary Git installation steps and enhance apt command execution with retry logic 2025-10-03 14:44:05 +02:00
Enno Gelhaus
789c4b4c7e Refactor Jenkins pipeline to improve Git checkout process and ensure necessary dependencies are installed 2025-10-03 14:41:42 +02:00
Enno Gelhaus
6e19591998 Remove unnecessary options configuration from Jenkins pipeline for cleaner setup 2025-10-03 14:35:15 +02:00
Enno Gelhaus
762384d45e Refactor Jenkins pipeline to use 'agent any' for improved flexibility in execution environment 2025-10-03 14:32:30 +02:00
Enno Gelhaus
ebbb64b9d8 Enhance Jenkins pipeline comments and update Git checkout configuration for clarity and accuracy 2025-10-03 14:28:05 +02:00
Enno Gelhaus
477366164c Remove legacy CI/CD configurations and implement new workflows for building and analyzing Node.js applications with SonarQube 2025-10-03 14:24:01 +02:00
Enno Gelhaus
7becf450ed
sonar-project.properties 2025-10-02 07:49:25 +02:00
Enno Gelhaus
3138308066
Update SonarQube authentication method
Replaced sonar.login with sonar.token for authentication.
2025-10-01 22:10:31 +02:00
Enno Gelhaus
74afd9149c
Remove SONAR_TOKEN and SONAR_HOST_URL from workflow
Removed environment variables for SonarQube analysis.
2025-10-01 22:04:37 +02:00
Enno Gelhaus
39f617a54a
Update sonar-project.properties 2025-10-01 22:03:44 +02:00
Enno Gelhaus
0b3f559cf5
Add environment name to build PR workflow 2025-10-01 21:55:36 +02:00
Enno Gelhaus
6d7ed26e3c
Update build-pr.yml 2025-10-01 21:49:10 +02:00
Enno Gelhaus
1f14c8690d
Update build-pr.yml 2025-10-01 21:46:10 +02:00
Enno Gelhaus
5f9e8012f6
Change pull_request_target to pull_request event 2025-10-01 21:38:06 +02:00
Enno Gelhaus
1127879b30
Add SonarQube host URL to properties file 2025-10-01 21:37:36 +02:00
Enno Gelhaus
a6d4f075b2
Delete .github/workflows/build-pr-temp.yml 2025-10-01 21:36:22 +02:00
Enno Gelhaus
cad9bfa4b6
Add GitHub Actions workflow for PR builds 2025-10-01 21:27:54 +02:00
Enno Gelhaus
07074e76a8
Update build-pr.yml 2025-10-01 14:40:55 +02:00
Enno Gelhaus
39c6cba6ff
Change version retrieval to short commit SHA
Updated the workflow to retrieve the short commit SHA instead of the project version from Git tags.
2025-10-01 14:40:42 +02:00
Enno Gelhaus
b8c7200215
Fix SonarQube badge URLs in README
Updated SonarQube badge links with specific project tokens.
2025-10-01 14:33:23 +02:00
Enno Gelhaus
84f7cc409a
Update SonarQube badges in README
Updated SonarQube badge links and added new badges.
2025-10-01 14:32:39 +02:00
Enno Gelhaus
1c9739413d
Update README with SonarQube badges
Added quality and reliability metrics from SonarQube to README.
2025-10-01 14:31:47 +02:00
Enno Gelhaus
3a1ada8498
Add environment for build-and-publish job
Added environment configuration for build-pr.
2025-10-01 14:07:15 +02:00
Enno Gelhaus
2580b8ecdc
Add environment configuration for build job 2025-10-01 14:04:36 +02:00
Enno Gelhaus
12da5b2f4f
separate Workflow for PRs (Build) 2025-10-01 10:59:10 +02:00
Enno Gelhaus
8cf266640d
Remove PRs from build
Will be a separate workflow.
2025-10-01 10:54:35 +02:00
Enno Gelhaus
520133342e
update/build.yaml 2025-10-01 10:42:59 +02:00
Enno Gelhaus
7fd69c23c5
Add PNG files to sonar exclusions 2025-10-01 10:25:03 +02:00
Enno Gelhaus
4212e93a7c
Add fetch-depth option to checkout action 2025-10-01 10:03:04 +02:00
Enno Gelhaus
c2619d7cb4
Update sonar.javascript.node.maxspace for performance
Increased maximum node memory space for SonarQube scan performance.
2025-09-30 15:25:42 +02:00
Enno Gelhaus
92c7a60299
Update sonar-project.properties 2025-09-30 15:07:31 +02:00
Enno Gelhaus
1aeebfce8f
Enhance CI workflow with versioning and SonarQube analysis
Added steps to get project version from Git tag and perform SonarQube analysis for both pull requests and branches.
2025-09-30 14:58:55 +02:00
Enno Gelhaus
df4475eaaf
Add SonarQube project configuration 2025-09-30 14:53:02 +02:00
Nevo David
ad7f7d9408 feat: find next available slot
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-09-24 14:25:55 +07:00
Nevo David
cde0550adc feat: fix precondition 2025-09-22 14:16:13 +07:00
Nevo David
4e9038519c feat: more esacpe
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-09-22 00:34:45 +07:00
Nevo David
a40d46b1a9 feat: markdown fix
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-09-22 00:20:26 +07:00
Nevo David
b98522373d feat: convert lt and gt to \> and \< in markdown
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-09-22 00:14:52 +07:00
Nevo David
f0f8373621 feat: fix listmonk
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-09-21 21:44:30 +07:00
Enno Gelhaus
7f9a5c39c4
Remove Sentry user feedback modal display
Removed user feedback modal display for Sentry events.
2025-09-20 14:02:45 +02:00
Enno Gelhaus
ce8017a3c6
Simplify condition for showing report dialog
Refactor condition to show user feedback modal.
2025-09-20 11:30:49 +02:00
Enno Gelhaus
8078814211
Add error patterns to ignore in Sentry events 2025-09-20 10:50:17 +02:00
Nevo David
ec69b689c5 Merge remote-tracking branch 'origin/main' 2025-09-20 15:26:13 +07:00
Nevo David
700f3c5ccb feat: fix duplicate modals 2025-09-20 15:25:43 +07:00
Enno Gelhaus
18ced894a6
Merge pull request #987 from gitroomhq/fix/sentry-feedback-svg
Update feedback button SVG icon size and color
2025-09-19 19:26:34 +02:00
Nevo David
cc3a8f7a12 Feat: fix sentry 2025-09-20 00:25:38 +07:00
Enno Gelhaus
984bc156f1 Update feedback button SVG icon size and color 2025-09-19 19:17:44 +02:00
Enno Gelhaus
8b90327bb1 Refactor support component and integrate Sentry feedback button 2025-09-19 19:07:12 +02:00
Enno Gelhaus
f3c2a1f2f4 Merge branch 'main' of https://github.com/gitroomhq/postiz-app 2025-09-19 18:49:37 +02:00
Enno Gelhaus
fb4b3fd3ad Add Sentry feedback integration to support component 2025-09-19 18:49:35 +02:00
Enno Gelhaus
015be12bca
Implement event filtering and user feedback modal 2025-09-19 17:36:51 +02:00
Enno Gelhaus
6b4fa0763d
Adjust profilesSampleRate for production environment 2025-09-18 20:29:05 +02:00
Enno Gelhaus
9a1d85321e
Increase profileSessionSampleRate for production 2025-09-18 20:28:51 +02:00
Enno Gelhaus
bb8aa86a42
Integrate Sentry with McpServer initialization 2025-09-18 19:57:18 +02:00
Enno Gelhaus
65818434fb
Merge pull request #940 from gitroomhq/sentry-ai/mcp
Sentry ai
2025-09-18 18:11:10 +02:00
Enno Gelhaus
dadd21b321
Merge branch 'main' into sentry-ai/mcp 2025-09-18 18:05:10 +02:00
Enno Gelhaus
ac83a1772c update/Sentry v10 2025-09-18 18:04:11 +02:00
Enno Gelhaus
e9032f8c8a
Update profilesSampleRate for production environment 2025-09-18 14:38:05 +02:00
Enno Gelhaus
87bdc9aefa
Move header config to nextConfig 2025-09-18 14:12:31 +02:00
Enno Gelhaus
51a5608f6c
Add JS Profiling 2025-09-18 14:05:38 +02:00
Enno Gelhaus
fb98828358
Increase profiling rate 2025-09-18 13:31:47 +02:00
Enno Gelhaus
87d2a937c8
Add browser profiling integration and update sample rates
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Added browser profiling integration and adjusted profiles sample rate based on environment.
2025-09-17 21:41:07 +02:00
Enno Gelhaus
9eb68484ff
Remove node profiling integration from Sentry client
Removed node profiling integration and related settings.
2025-09-17 21:38:58 +02:00
Enno Gelhaus
7839c2575c
Integrate node profiling and update profiling rates 2025-09-17 21:33:52 +02:00
Enno Gelhaus
d987b1c222
Adjust Sentry sample rates for production settings 2025-09-17 17:54:20 +02:00
Nevo David
9c5785b5cb Merge remote-tracking branch 'origin/main' 2025-09-17 22:49:40 +07:00
Nevo David
df0077771a feat: new provider - listmonk 2025-09-17 22:49:21 +07:00
Enno Gelhaus
c3b83224be
Attempt to fix Profiling 2025-09-17 01:01:45 +02:00
Enno Gelhaus
cc36d6a2dc
Adjust Sentry replay sample rates for production 2025-09-17 00:54:53 +02:00
Enno Gelhaus
691133b282
Merge pull request #980 from ZurabBalamtsarashvili/patch-1
Fix Georgian translation for cancellation message
2025-09-14 15:17:41 +02:00
Enno Gelhaus
cdb5d5ccbb
Merge branch 'main' into patch-1 2025-09-14 15:17:35 +02:00
Nevo David
ba6d035839 feat: fix deployment 2025-09-14 19:59:15 +07:00
Nevo David
0c386b6cde feat: fix package json 2025-09-14 19:57:52 +07:00
Nevo David
ac16e5211c feat: remove mentine modals with custom modals, fix reddit 2025-09-14 19:56:27 +07:00
Zurab Balamtsarashvili
772b797385
Fix Georgian translation for cancellation message
Fixed a translation issue in the Georgian locale file where the German word
'jederzeit' was mistakenly left from the template. Updated it to the correct
Georgian translation 'ნებისმიერ დროს'. This ensures full consistency in the
localized UI and removes the last leftover from the German base file.
2025-09-14 14:30:10 +04:00
Nevo David
9ab19f50e8 feat: fix streaming 2025-09-14 14:52:52 +07:00
Nevo David
10c3d18bb2 Merge remote-tracking branch 'origin/main' 2025-09-14 14:42:24 +07:00
Nevo David
43c3af4e35 feat: proxy video response 2025-09-14 14:42:12 +07:00
Nevo David
aa7dc60fbe
Merge pull request #970 from Dforrunner/logo-jsx-fix
logo jsx attribute fix: stroke-width -> strokeWidth
2025-09-14 12:59:09 +07:00
Nevo David
483e3169a4
Merge pull request #971 from ZurabBalamtsarashvili/main
Fully translated into Georgian - სრულად გადათარგმნილი ქართულად
2025-09-14 12:58:35 +07:00
Enno Gelhaus
18086edd9f
remove Dartnode 2025-09-09 07:51:37 +02:00
Enno Gelhaus
a1f663cb74
Merge branch 'main' into main 2025-09-09 07:49:10 +02:00
Enno Gelhaus
e2b407cac8
DartNode 2025-09-08 22:50:48 +02:00
Zurab Balamtsarashvili
acfcc37b6d
Fully translated into Georgian - სრულად გადათარგმნილი ქართულად 2025-09-06 14:08:16 +04:00
Mo
1ed1de5925 logo jsx attribute fix 2025-09-06 02:58:33 +07:00
Nevo David
4bfef6bade fix: if flatmap is empty 2025-09-04 23:55:59 +07:00
Nevo David
c11830551c feat: fix append 2025-09-03 16:52:22 +07:00
Nevo David
93378ded4c feat: missing jobs
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-09-01 10:50:37 +07:00
Nevo David
ec2fd4d1c2 feat: deploy worker 2025-09-01 10:50:15 +07:00
Nevo David
aedfe24a0b feat: main 2025-09-01 10:49:07 +07:00
Nevo David
46f9d2645a feat: main 2025-09-01 10:49:03 +07:00
Nevo David
477a835d24 feat: main 2025-09-01 10:48:51 +07:00
Nevo David
bcc26b6676 feat: main 2025-09-01 10:48:46 +07:00
Nevo David
baa2f7a74d feat: api 2025-09-01 10:47:13 +07:00
Nevo David
5c6617da2a feat: fix gt and lt 2025-09-01 10:43:17 +07:00
Nevo David
b3f4e63982 Merge remote-tracking branch 'origin/main' 2025-09-01 01:31:34 +07:00
Nevo David
cede5216b2 feat: growchief 2025-09-01 01:29:22 +07:00
Nevo David
3a1a7500ae
Update README with new GitHub link and image 2025-08-27 23:18:40 +07:00
Nevo David
6a70f2f92d feat: client 2025-08-26 23:22:21 +07:00
Nevo David
3bea9ee7e9 feat: disconnect prisma 2025-08-26 23:12:56 +07:00
Nevo David
60da0f6fb1 feat: fix date for preview 2025-08-26 22:29:22 +07:00
Nevo David
b04510222b feat: fix date for preview 2025-08-26 22:18:45 +07:00
Nevo David
5115d812e5 feat: retry 2025-08-14 12:07:07 +07:00
Nevo David
3a5e0b1472 feat: retry 2025-08-14 12:07:01 +07:00
Nevo David
7b8fa7fb7b feat: retry 2025-08-14 11:38:27 +07:00
Nevo David
5e5ca78e9a feat: long upload should not be in a concurrenct 2025-08-13 22:08:20 +07:00
Nevo David
2db252f97f feat: youtube upload can't have concurrency as it can be a long request 2025-08-13 22:01:20 +07:00
Nevo David
0df9fd392e feat: bluesky more timer, job state failed 2025-08-13 14:23:40 +07:00
Nevo David
a3047d1855 feat: x error message longer than 2 minutes 2025-08-13 14:19:16 +07:00
Nevo David
8b73c1ed56 feat: stop infinite while 2025-08-13 11:15:11 +07:00
Nevo David
fb75b99eed feat: remove emails from concurrency 2025-08-13 01:17:59 +07:00
Nevo David
120a47690e feat: send email 2025-08-12 23:36:34 +07:00
Enno Gelhaus
500acd90bd
Merge branch 'main' into sentry-ai/mcp 2025-08-12 18:13:03 +02:00
Nevo David
f37c913943 feat: something is wrong console 2025-08-12 22:59:34 +07:00
Nevo David
54b2b95cf3 feat: connect accounts with not picture 2025-08-12 14:39:13 +07:00
Nevo David
8a1e45aa10 feat: sent false 2025-08-12 13:55:03 +07:00
Nevo David
11c02f8433 feat: fix resend 2025-08-12 13:52:32 +07:00
Nevo David
08e7dfbe1d feat: fix editor 2025-08-11 19:28:44 +07:00
Nevo David
3cf7ed4096 feat: shortlink fix 2025-08-11 19:02:09 +07:00
Nevo David
e0fa9f49c6 feat: normal should not have html tags
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-10 18:46:02 +07:00
Nevo David
07177c7929 feat: fix connections 2025-08-10 11:08:58 +07:00
Nevo David
9aea717ed2 feat: remove timezone 2025-08-10 03:20:32 +07:00
Nevo David
dee9a6d5f0 feat: remove timezone 2025-08-10 03:14:56 +07:00
Nevo David
2ab65bb375 feat: fix billing 2025-08-09 20:29:13 +07:00
Nevo David
a8e32dc399 feat: suspicious registartion 2025-08-09 20:22:38 +07:00
Nevo David
caf99d38c5 feat: images and videos to reddit 2025-08-09 18:21:07 +07:00
Nevo David
27f1db769a feat: find missing jobs fix
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-09 12:05:09 +07:00
Nevo David
e09187db50 feat set maximum stalled as maximum concurrency 2025-08-09 03:01:52 +07:00
Nevo David
fcfc4109e2 feat set maximum stalled as maximum concurrency 2025-08-09 02:59:35 +07:00
Nevo David
4ace1dc886 feat: more timeout for instagram 2025-08-09 02:48:39 +07:00
Nevo David
113003b832 feat: more expiration for jobs 2025-08-09 02:14:52 +07:00
Nevo David
e0fe7d0381 feat: expiration 2025-08-09 01:28:24 +07:00
Nevo David
d698732a6c feat: high concurrency 2025-08-09 01:06:36 +07:00
Nevo David
85d015f349 feat: check also waiting 2025-08-09 00:07:46 +07:00
Nevo David
00fd1512c5 feat: remove concurrency from the long tasks 2025-08-08 22:02:59 +07:00
Nevo David
813420427f feat: bluesky fix images sizes aspect ratio
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-08 20:49:08 +07:00
Enno Gelhaus
118e47cb6e
Update mcp.settings.ts 2025-08-08 08:12:17 +02:00
Enno Gelhaus
29806b1dac
Update mcp.settings.ts 2025-08-08 08:11:22 +02:00
Enno Gelhaus
404d761fab
fix/sentry init brackets 2025-08-08 08:04:49 +02:00
Enno Gelhaus
8c4cebb31a
feat/sentry mcp 2025-08-08 08:00:14 +02:00
Enno Gelhaus
e17261881e
Update initialize.sentry.ts 2025-08-08 07:55:48 +02:00
Nevo David
2bbbc4728d feat: add comment fix 2025-08-08 04:24:43 +07:00
Nevo David
d2146a8ac7 feat: less concurrency 2025-08-08 04:05:36 +07:00
Nevo David
9e9ff26444 feat: prevent crashing a schedule 2025-08-08 03:24:55 +07:00
Nevo David
1de661c96f feat: quick fix
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-08 03:11:47 +07:00
Nevo David
620439d175 feat: show max chars on main global edit
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-08 02:51:37 +07:00
Nevo David
aa12f100c8 feat: fix bluesky reply cid 2025-08-08 02:22:47 +07:00
Nevo David
76db058116 feat: fix bluesky reply cid 2025-08-08 02:22:25 +07:00
Nevo David
3d975ff6c3 feat: fix shorlinking 2025-08-08 02:16:27 +07:00
Nevo David
8fd88ebb7f feat: new id 2025-08-07 23:44:05 +07:00
Nevo David
780ec93a76 feat: new id 2025-08-07 23:44:01 +07:00
Nevo David
460cef7b32 feat: new id 2025-08-07 23:42:28 +07:00
Nevo David
889a031e0e feat: add expiration for stuck jobs 2025-08-07 23:42:03 +07:00
Nevo David
0d231545ec feat: promise race for long requests 2025-08-07 23:33:55 +07:00
Nevo David
3197c69f19 feat: instagram higher concurrency 2025-08-07 22:43:12 +07:00
Nevo David
849becc281 feat: post pending 2025-08-07 22:05:19 +07:00
Nevo David
3837c1ed98 feat: set a higher stalled value, we upload a lot of version and that might cause problems 2025-08-07 21:56:57 +07:00
Nevo David
d5979ed6c8 feat: better performance for timezone 2025-08-07 21:31:15 +07:00
Nevo David
9e87928045 feat: fix youtube title 2025-08-07 21:13:38 +07:00
Nevo David
326c1b60c6 feat: fix timezone 2025-08-07 20:50:07 +07:00
Nevo David
1de9a1f605 feat: remove logs 2025-08-07 20:40:01 +07:00
Nevo David
e5af638219 feat: change timezone and date format 2025-08-07 20:34:31 +07:00
Nevo David
5550c89782 feat: flair 2025-08-07 18:30:06 +07:00
Nevo David
7bf2549ffc feat: concurrency per platform 2025-08-07 17:55:15 +07:00
Nevo David
8559feed4e feat: fix medium tags 2025-08-07 13:19:41 +07:00
Nevo David
c6fa629a97 feat: youtube tags are not being saved
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-07 13:15:47 +07:00
Nevo David
3cc2ddc47c feat: prevent html parsing when there is not html
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-07 12:55:51 +07:00
Nevo David
5bf30484b6 feat: discord mention roles
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-07 12:23:01 +07:00
Nevo David
689612d0fd feat: fix uploading cover picture to wordpress
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-06 23:19:28 +07:00
Nevo David
f427991d13 fix: modal title 2025-08-06 22:57:09 +07:00
Nevo David
0dceb898d7 feat: hyperlinks
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-05 14:06:02 +07:00
Nevo David
57532e15d4 feat: hyperlink support for tiptap 2025-08-05 14:05:26 +07:00
Nevo David
2f28814836 feat: parse5 typing
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-04 21:08:33 +07:00
Nevo David
cd18e9919a feat: remove esm 2025-08-04 21:06:02 +07:00
Nevo David
d2354c0427 feat: parse misconfigured html 2025-08-04 20:54:58 +07:00
Nevo David
ef0b668770 feat: ensure jobs are not missed
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-04 20:02:59 +07:00
Nevo David
2163b59c07 feat: 2 seconds distance between requests
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-04 18:33:13 +07:00
Nevo David
4978d6b975 feat: more queue time? 2025-08-04 18:14:49 +07:00
Nevo David
d5a53d8041 feat: better concurrency with reddit 2025-08-04 18:08:26 +07:00
Nevo David
490bd74aec feat: slack 40000 chars 2025-08-04 14:55:58 +07:00
Nevo David
f00a5ba900 Feat: remove console log 2025-08-04 14:35:48 +07:00
Nevo David
9f737560fb feat: better validation for post 2025-08-04 14:34:26 +07:00
Nevo David
806dba19c3 feat: remove concurrency from authentication
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-04 12:30:28 +07:00
Nevo David
8e06b081e8 feat: remove concurrency from authentication 2025-08-04 12:14:23 +07:00
Nevo David
80c508a8c2 feat: remove submit 2025-08-03 22:47:43 +07:00
Nevo David
bdb3a5f607 feat: n8n 2025-08-03 19:42:13 +07:00
Nevo David
252287f246 feat: tag people on discord
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-03 17:00:17 +07:00
Nevo David
142239403c feat: hotfix for mentions
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-03 12:32:41 +07:00
Nevo David
a4c80c73a6 Feat: remove signature 2025-08-03 00:57:29 +07:00
Nevo David
983ad07932 feat: wrap 2025-08-03 00:47:13 +07:00
Nevo David
af67276076 feat: remove lifetime page 2025-08-03 00:08:50 +07:00
Nevo David
fc6e6f39e9 feat: better markdown'
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-02 23:23:32 +07:00
Nevo David
69082319a0 feat: reduce server requests 2025-08-02 21:57:21 +07:00
Nevo David
94064dfa78 feat: video made with ai 2025-08-02 17:54:26 +07:00
Nevo David
69e39b91b3 feat: better erroring for X 2025-08-02 14:26:30 +07:00
Nevo David
da77c227c1 feat: error handling that is not an http request 2025-08-02 14:21:10 +07:00
Nevo David
e46e661f02 feat: fix interval 2025-08-02 12:47:32 +07:00
Nevo David
a67f6b3918 feat: client revert 2025-08-02 12:05:24 +07:00
Enno Gelhaus
4cb7aa2a51 Merge branch 'main' of https://github.com/gitroomhq/postiz-app 2025-08-01 22:55:18 +02:00
Enno Gelhaus
aa23caa035 feat/allow network requests to be captured 2025-08-01 22:55:13 +02:00
Enno Gelhaus
5495bd408f
revert last commit 2025-08-01 18:30:52 +02:00
Enno Gelhaus
7ff90b37c5
Update build.yaml 2025-08-01 18:29:32 +02:00
Enno Gelhaus
56c5632081
testing build selfhosted 2025-08-01 18:22:31 +02:00
Nevo David
d615202239 feat: tiktok validatity causes problems 2025-08-01 22:36:36 +07:00
Nevo David
dd61e0ebf1 feat: telegram formatted text
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-08-01 22:03:43 +07:00
Nevo David
bff204f036 feat: sourcemaps 2025-08-01 20:44:40 +07:00
Nevo David
2146bf626a feat: attempt to fix sentry sourcemaps 2025-08-01 20:23:12 +07:00
Nevo David
641531e8b3 feat: prevent email with plug 2025-08-01 18:58:42 +07:00
Nevo David
795fdd6b3f feat: prevent passthrough, because it sends an error 2025-08-01 18:42:16 +07:00
Nevo David
9724b127c8 feat: prevent crash 2025-08-01 17:40:29 +07:00
Nevo David
0165d73ce9 feat: prevent command crash 2025-08-01 17:38:49 +07:00
Nevo David
5a333a06b9 feat: fix missing image 2025-08-01 17:26:47 +07:00
Nevo David
e915ec30d7
Merge pull request #911 from gitroomhq/feat/mention
Better mentioning functionality
2025-08-01 16:37:48 +07:00
Nevo David
f8dd1ae912 Feat: small fixes 2025-08-01 16:37:27 +07:00
Nevo David
428932b328 feat: dynamic bluesky 2025-08-01 16:33:54 +07:00
Nevo David
f2b96c27e0 feat: linkedin fix 2025-08-01 16:32:49 +07:00
Nevo David
58abf6eb00 feat: mentions 2025-08-01 13:45:52 +07:00
Nevo David
c76283bca6 feat: handle pinterest errors 2025-08-01 12:43:00 +07:00
Nevo David
449e2acab1 feat: mentions 2025-08-01 12:42:21 +07:00
Nevo David
476d88d66c Merge remote-tracking branch 'origin/main' 2025-08-01 11:14:59 +07:00
Nevo David
b2d68887ac feat: remove try-catch from pinterest 2025-08-01 11:14:27 +07:00
Nevo David
2756f28d72 feat: mention 2025-08-01 11:14:11 +07:00
Enno Gelhaus
e665eaaf2c
Update copilot-instructions.md 2025-07-31 22:54:54 +02:00
Enno Gelhaus
fdddf2ca26
Update copilot-instructions.md 2025-07-31 22:53:02 +02:00
Nevo David
0d06fa000f Merge branch 'main' into feat/mention 2025-07-31 20:32:18 +07:00
Nevo David
f7899681a5 feat: tag list 2025-07-31 20:31:43 +07:00
Nevo David
1e2d45f886 feat: mention 2025-07-31 20:30:26 +07:00
Nevo David
cd52e4ba8a feat: move html component 2025-07-31 17:51:28 +07:00
Nevo David
142866805c feat: feedback on crash 2025-07-31 13:37:43 +07:00
Enno Gelhaus
8117ade8c9
Frontend crash UI
As per restrictions of react, this needs to be in /apps not /apps/frontend. Though this will only get triggered on the frontend, because the backend doesn't have any UI.
2025-07-31 08:24:18 +02:00
Nevo David
121cd5f4d0 feat: try again on 500 2025-07-31 12:50:03 +07:00
Nevo David
473e92ada2 feat: try again on 500 2025-07-31 12:49:42 +07:00
Nevo David
3e5e7bd4ba feat: missing prisma index for organizationId 2025-07-31 12:36:18 +07:00
Nevo David
4edb179d36 feat: remove mcp log 2025-07-31 11:25:49 +07:00
Nevo David
082aef6253 feat: remove mcp log 2025-07-31 11:24:49 +07:00
Nevo David
59ddd29f9f feat: env in nestjs 2025-07-31 11:23:56 +07:00
Nevo David
9acae8893d feat: specify env for sentry 2025-07-31 11:21:05 +07:00
Nevo David
16384e8804 feat: move date without jump 2025-07-31 11:05:13 +07:00
Nevo David
a7ed9f981a fix: endswith 2025-07-31 10:42:46 +07:00
Nevo David
db0b135787 feat: moving item with interval 2025-07-31 00:37:58 +07:00
Nevo David
14a99d8388 feat: cross-env 2025-07-31 00:26:09 +07:00
Nevo David
66ac549521 feat: instagram, only english labels 2025-07-30 23:04:42 +07:00
Nevo David
3127dd1b6f feat: add sentry only after app module 2025-07-30 22:19:24 +07:00
Nevo David
0eed2571fe feat: remove sentry for now 2025-07-30 22:03:33 +07:00
Nevo David
ab61ae2bce feat: openai to require 2025-07-30 21:51:38 +07:00
Nevo David
dc2d4845a1 feat: remove sentry from workers and cron 2025-07-30 21:41:01 +07:00
Nevo David
4d419d6428 feat: fix openai 2025-07-30 21:34:16 +07:00
Nevo David
59b6419229 feat: allow logs 2025-07-30 21:33:23 +07:00
Nevo David
cb09a505d8 feat: logs only for backend 2025-07-30 21:32:12 +07:00
Nevo David
70ff3a5b30 feat: openai 2025-07-30 21:21:53 +07:00
Nevo David
2461e9b874 feat: remove beta 2025-07-30 21:12:57 +07:00
Nevo David
6fe4d49d11 feat: openai latest version 2025-07-30 21:10:13 +07:00
Nevo David
453c78fab1 feat: init on top 2025-07-30 20:59:30 +07:00
Nevo David
e9d84f5a64 Merge remote-tracking branch 'origin/main' 2025-07-30 20:49:50 +07:00
Nevo David
f9ad6be60a feat: logs 2025-07-30 20:49:23 +07:00
Nevo David
de8c1e3987
Merge pull request #905 from gitroomhq/feat/sentry
Sentry
2025-07-30 20:13:46 +07:00
Nevo David
41c3bbf0bf feat: better context + try catch 2025-07-30 20:13:28 +07:00
Nevo David
24e64fd97d feat: change profiling 2025-07-30 20:03:54 +07:00
Nevo David
aac6fc0fd4 feat: traces changes 2025-07-30 20:02:04 +07:00
Nevo David
3483b022e8 feat: set sentry 2025-07-30 19:50:05 +07:00
Nevo David
0fa950dd8e feat: remove docker compose for testing 2025-07-30 17:11:23 +07:00
Nevo David
629d95f6c9 feat: serve uploads
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-30 16:49:32 +07:00
Nevo David
c6e286bdaa feat: wordpress no avatar url
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-30 15:03:37 +07:00
Nevo David
39a580888e feat: highest z-index for toaster 2025-07-30 11:55:09 +07:00
Nevo David
14b4c5bb01 feat: copy channel id 2025-07-30 11:22:18 +07:00
Nevo David
420a844d1b feat: change regexpresion 2025-07-30 10:26:18 +07:00
Nevo David
d753619240 feat: fix ul and li for normal platforms 2025-07-30 01:10:46 +07:00
Nevo David
b564f5080f feat: tiktok must be at least 720p 2025-07-29 21:56:48 +07:00
Nevo David
ab4c67768f feat: dont hide settings from user 2025-07-29 13:51:44 +07:00
Nevo David
0d3d3612df feat: fix disable registartion
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-29 13:37:35 +07:00
Nevo David
eeadd1a8bc fix: disalbe registartion 2025-07-29 13:34:11 +07:00
Nevo David
995babb426 feat: move to nginx, remove inter fonts
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-29 13:26:42 +07:00
Nevo David
0ff50a0565 feat: restrict files 2025-07-28 22:46:57 +07:00
Nevo David
5459e466bd feat: not allowed file types
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-28 21:30:00 +07:00
Nevo David
fa8738e1f6 feat: public api valid extensions 2025-07-28 21:08:36 +07:00
Nevo David
ba2e22f8e6 fix: remove console log 2025-07-28 20:57:29 +07:00
Nevo David
7fba75dbc7 feat: no content 2025-07-28 20:55:24 +07:00
Nevo David
fc0cdc661d feat: please add chars 2025-07-28 19:45:23 +07:00
Nevo David
ee76490a9a feat: better tiktok error 2025-07-28 12:18:27 +07:00
Nevo David
70ac9ce913 feat: remove html from div 2025-07-28 10:47:23 +07:00
Nevo David
c77ab35cf2 feat: fix long text 2025-07-27 15:57:50 +07:00
Nevo David
bffc933f2e feat: dont limit slots in day view 2025-07-27 13:57:00 +07:00
Nevo David
3cb572131b feat: scheduling post for now
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-27 13:44:56 +07:00
Nevo David
d504fac08d feat: remove view, update package json for sdk build
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-27 13:09:33 +07:00
Nevo David
3f405fb64d Merge remote-tracking branch 'origin/main' 2025-07-27 13:08:43 +07:00
Nevo David
ed8bb97188 feat: simplified the between dates get request, fixed bug with fetching all the posts 2025-07-27 13:08:30 +07:00
Nevo David
1a9a992372 feat: filters 2025-07-27 11:57:39 +07:00
Enno Gelhaus
44e13b98e5
Update .coderabbit.yaml 2025-07-27 02:39:04 +02:00
Nevo David
672d55400d feat: added background to loading 2025-07-26 21:58:36 +07:00
Nevo David
850c0614ee feat: missing switch organization 2025-07-26 14:03:29 +07:00
Nevo David
6fa46e3826 feat: loading states 2025-07-26 13:23:11 +07:00
Nevo David
a910066514 feat: launches 2025-07-26 13:18:25 +07:00
Nevo David
2cfd0f9f47 Merge remote-tracking branch 'origin/main' 2025-07-26 12:51:21 +07:00
Nevo David
d16d3bbe21 feat: missing media 2025-07-26 12:50:44 +07:00
Enno Gelhaus
220554d545
feat/coderabbit config 2025-07-26 00:20:06 +02:00
Nevo David
10fa3aca54 feat: clamp category 2025-07-26 01:57:05 +07:00
Nevo David
167ed217f7 feat: change loading color 2025-07-26 00:07:51 +07:00
Nevo David
e5def7518a feat: fix no channels yet 2025-07-25 22:56:19 +07:00
Nevo David
931cadbdbf feat: date passed label 2025-07-25 22:50:09 +07:00
Nevo David
961556e086 feat: no data states
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-25 22:37:38 +07:00
Nevo David
4b56eebca9 feat: missing translations 2025-07-25 22:25:50 +07:00
Nevo David
84d309ffe4 feat: align logo when admin 2025-07-25 21:35:54 +07:00
Nevo David
a05c42dffb Merge remote-tracking branch 'origin/main' 2025-07-25 21:06:59 +07:00
Nevo David
a9e57dc49a feat: view as 2025-07-25 21:06:46 +07:00
Nevo David
88990e24ba
Merge pull request #893 from gitroomhq/feat/postiz-v2
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Postiz new design: v2
2025-07-25 21:00:12 +07:00
Nevo David
f38f5f9695 feat: v2 2025-07-25 20:59:27 +07:00
Nevo David
b5e58d9747 feat: telegram markdown 2025-07-23 22:20:48 +07:00
Nevo David
5e361a7570 feat: heygen talking photos
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-21 20:56:07 +07:00
Nevo David
38b6ad5b46 feat: avatar photos heygen fix
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-21 19:48:40 +07:00
Nevo David
d4ca9e8b4a feat: alt for bluesky
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-21 19:32:33 +07:00
Nevo David
9ed403aff2 feat: safer replacement to avoid <Script /> injections
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-21 17:51:47 +07:00
Nevo David
df22e642f9 feat: strip html 2025-07-21 17:48:05 +07:00
Nevo David
dc67fd0bed feat: fix modal big size 2025-07-21 17:45:26 +07:00
Nevo David
6ad9051838 feat: fix characters in editor
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-21 16:54:33 +07:00
Nevo David
a38aa176e5 feat: throw error
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-21 16:00:31 +07:00
Nevo David
9c5dbb2b4f feat: monitor stuck queues 2025-07-21 15:55:26 +07:00
Nevo David
5e7da34863 feat: in case of any error, avoid crashing the worker 2025-07-21 12:44:02 +07:00
Nevo David
56b78111a7 feat: unhandled error 2025-07-21 12:17:56 +07:00
Nevo David
453e20e418 feat: replace amp; fith & 2025-07-20 16:01:51 +07:00
Nevo David
e60ed4f72d feat: upgrade version 2025-07-19 21:39:37 +07:00
Nevo David
f6e4d79a34 feat: fix pnpm lock 2025-07-19 21:39:17 +07:00
Nevo David
c08f2e6a62 feat: update postiz sdk 2025-07-19 21:37:35 +07:00
Nevo David
0eb75302c5 Merge remote-tracking branch 'origin/main' 2025-07-19 18:34:07 +07:00
Nevo David
8c727aedc6 feat: throttle only upload and posts creation 2025-07-19 18:29:12 +07:00
Enno Gelhaus
f72bf89c4b
Update copilot-instructions.md 2025-07-18 02:44:40 +02:00
Enno Gelhaus
ad876a67d0
Recreate copilot-instructions.md 2025-07-17 17:46:26 +02:00
Enno Gelhaus
0df669a39f
accidentaly created .github in .github 2025-07-17 17:45:57 +02:00
Enno Gelhaus
13a0d1dad4
feat/copilot instructions 2025-07-17 17:41:31 +02:00
Enno Gelhaus
e1257b95fc
Feat/coderabbit 2025-07-17 17:07:56 +02:00
Nevo David
8b14cd3695 feat: wordpress
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-17 21:44:08 +07:00
Nevo David
cfc75c11d9 feat: add wordpress
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-17 20:42:45 +07:00
Nevo David
a9c6fc6f29 feat: media 2025-07-17 19:25:20 +07:00
Nevo David
3ef1bf8365 feat: fix validation 2025-07-17 17:30:24 +07:00
Nevo David
914d0376c4 feat: wrong type 2025-07-17 17:27:02 +07:00
Nevo David
e18a24fcaa feat: fix heading 2025-07-17 17:26:30 +07:00
Nevo David
1e288ab08a feat: fix editor 2025-07-17 17:23:30 +07:00
Nevo David
55e8d3c715 feat: bullets 2025-07-17 14:58:29 +07:00
Nevo David
3f609bdfeb feat: support markdown 2025-07-17 14:49:29 +07:00
Nevo David
44e5ffdf69 Merge remote-tracking branch 'origin/main' 2025-07-17 14:49:00 +07:00
Nevo David
9c4a3d9709 feat: support markdown 2025-07-17 14:48:28 +07:00
Enno Gelhaus
a1fe043a20
Add note to contribute license 2025-07-17 02:35:02 +02:00
Enno Gelhaus
b964488e53
Create CLA 2025-07-17 02:33:11 +02:00
Nevo David
f10c7f56a4 feat: editor type + fix removing integrations 2025-07-17 01:06:03 +07:00
Nevo David
4907bb3572 feat: in case of no html, dont mutate 2025-07-16 22:21:36 +07:00
Nevo David
f077d99049 feat: fix backwards compatibility + api requests 2025-07-16 21:48:27 +07:00
Nevo David
fb0a7c7840 feat: fix wording 2025-07-16 21:42:52 +07:00
Nevo David
f8f1d5a906 feat: backward compatibility 2025-07-16 21:33:40 +07:00
Nevo David
f88730bda8 feat: prevent loading components to save memory 2025-07-16 21:27:03 +07:00
Nevo David
97e82593ec feat: tiptap 2025-07-16 21:21:06 +07:00
Nevo David
734c68df9f feat: linkedin validation 2025-07-16 20:36:47 +07:00
Nevo David
bee001867f feat: tiptap 2025-07-16 20:13:52 +07:00
Nevo David
eed8c0de2e feat: translations 2025-07-15 15:57:39 +07:00
Nevo David
fb181764af feat: convert scopes to conflict
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-15 11:45:05 +07:00
Nevo David
a4a0923ecb feat: video function
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-14 16:54:37 +07:00
Nevo David
57b54c2d34 feat: change function method for video function to be more generic 2025-07-14 16:46:48 +07:00
Nevo David
58211410d1 feat: better error messages 2025-07-14 16:31:44 +07:00
Nevo David
9b4621c4b2 feat: video functions 2025-07-14 16:21:06 +07:00
Nevo David
a214815f81 feat: better credit system to prevent spam 2025-07-14 15:51:39 +07:00
Nevo David
8285bb0ddf feat: generate videos in public api 2025-07-14 15:00:51 +07:00
Nevo David
8eed4a4992 feat: veo3 videos 2025-07-13 20:22:57 +07:00
Nevo David
fcb3768493 Merge branch 'main' into feat/veo3-videos 2025-07-13 16:41:39 +07:00
Nevo David
bae0b6bc82 feat: is trialing 2025-07-13 16:13:02 +07:00
Nevo David
1783da607c feat: is trailing 2025-07-13 16:05:26 +07:00
Nevo David
3156d9d045 feat: veo3 videos 2025-07-13 15:48:10 +07:00
Nevo David
74b46a1660 feat: pricing upgrade 2025-07-13 15:24:34 +07:00
Nevo David
67cd78869c feat: more error codes 2025-07-13 13:43:58 +07:00
Nevo David
48f4e78b0e feat: fix payment page 2025-07-13 00:18:57 +07:00
Nevo David
76200a3732 feat: delete enterprise container
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-12 20:54:33 +07:00
Nevo David
7ecc5e3362 feat: remove enterprise, doesn't compy with AGPL3 2025-07-12 20:53:31 +07:00
Nevo David
45f0957e17 add devto, medium and hashnode 2025-07-12 20:47:31 +07:00
Nevo David
25a2835946
Merge pull request #868 from roshangm1/chore/use-ubuntu-arm
chore: use arm machine to build for arm architecture
2025-07-12 19:59:45 +07:00
Roshan Gautam
b878e2e3d8 revert roshangm1 user 2025-07-12 13:17:18 +01:00
Roshan Gautam
3216a6350a replace emulation with native arm 2025-07-12 12:58:23 +01:00
Nevo David
004cf3c319 feat: missing saas package 2025-07-12 01:22:05 +07:00
Nevo David
997fd76d85 feat: disabled 2025-07-12 00:56:57 +07:00
Nevo David
569c43354c feat: invalid url 2025-07-12 00:21:19 +07:00
Nevo David
092f4be7ad feat: fix mapping
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-11 23:11:54 +07:00
Nevo David
9c94bdf33c feat: remove unsued libraries 2025-07-11 22:57:58 +07:00
Nevo David
0e1999b1f4 feat: updated to the latest nextjs version 2025-07-11 22:43:42 +07:00
Nevo David
5fe43a7c38 feat: don't send nextjs request header to the response 2025-07-11 22:23:04 +07:00
Nevo David
0c3c1f3314 feat: revert 2025-07-11 21:58:02 +07:00
Enno Gelhaus
65eca0e2f2
Merge commit from fork
Fix middleware headers
2025-07-11 16:51:28 +02:00
Nevo David
c9b2359085 feat: rate limit email sending 2025-07-11 21:18:58 +07:00
Nevo David
2d5f7f9788 feat: fix non http requests (sdks) 2025-07-11 19:41:23 +07:00
Nevo David
67147e18a3 feat: bad body in case of a different error 2025-07-11 19:27:10 +07:00
Nevo David
93b419f6bb feat: restrict upload directory 2025-07-11 18:55:29 +07:00
Nevo David
6785a9ec6d feat: move throttle to reddit, so it can be used in multiple servers 2025-07-11 17:53:28 +07:00
Nevo David
631cb8bbe5 feat: urgent fix for instagram
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-11 14:15:41 +07:00
Nevo David
f44b02a7f6 Merge remote-tracking branch 'origin/main' 2025-07-11 14:09:27 +07:00
Nevo David
55d6ff6b3f feat: instagram revoked access token 2025-07-11 14:08:59 +07:00
Nevo David
b1dd64372c
Update README.md 2025-07-11 13:02:58 +07:00
Nevo David
fcf18fbb19 feat: need to change the function to undefined in-case there is not error handleing 2025-07-11 12:49:01 +07:00
Nevo David
8b0994f8c7 feat: instagram returns refresh token, but it's actually that the user post too much
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-11 12:37:05 +07:00
Nevo David
b8e3f53b23 feat: fix tiktok for photos 2025-07-11 12:25:30 +07:00
Dominik Prodinger
5499e32df8 Fix middleware headers 2025-07-10 22:35:58 +02:00
Nevo David
894cb33c97 feat: set body 2025-07-11 00:27:20 +07:00
Nevo David
910bff624b feat: fix plug check 2025-07-11 00:06:21 +07:00
Nevo David
3f87c5dd10 feat: refresh token infromation 2025-07-10 23:14:43 +07:00
Nevo David
ef313b88e4 feat: in progress id 2025-07-10 22:58:53 +07:00
Nevo David
d9d8b9da79 Feat: fix error 2025-07-10 22:40:52 +07:00
Nevo David
3344d67892 feat: too many retries 2025-07-10 22:36:22 +07:00
Nevo David
40c8087c1c feat: save errors 2025-07-10 19:54:40 +07:00
Nevo David
0129f5f05b feat: simpler adding channels redirect 2025-07-10 16:29:12 +07:00
Nevo David
d272890eba Feat: telegram bot 2025-07-10 15:40:31 +07:00
Nevo David
f780304a9d feat: facebook textpost embedded url 2025-07-10 15:14:05 +07:00
Nevo David
3519889bc1 feat: force fields check in public api
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-10 13:36:16 +07:00
Nevo David
c6024e61d7
Merge pull request #861 from gitroomhq/feat/handle-errors
Better error messages
2025-07-09 20:54:49 +07:00
Nevo David
4ddea7977f feat: better error messages, retry fix 2025-07-09 20:53:49 +07:00
Nevo David
159f65a127 feat: map errors 2025-07-09 16:51:49 +07:00
Nevo David
cc6bf713fb
Update README.md 2025-07-09 14:51:24 +07:00
Nevo David
5bfac74e41
Update README.md 2025-07-09 14:01:27 +07:00
Nevo David
24e381ac8f feat: is connected 2025-07-08 22:35:24 +07:00
Nevo David
a267bfe5dd feat: social media scheduling tool 2025-07-07 19:59:44 +07:00
Nevo David
63e1ca6ee6 feat: better typing 2025-07-07 19:59:09 +07:00
Nevo David
02e25f4237 rebuild 2025-07-07 19:39:37 +07:00
Nevo David
61ead93c38 Feat: convert to __type 2025-07-07 19:39:02 +07:00
Nevo David
0b174f4511 feat: better typing validation 2025-07-07 19:31:51 +07:00
Nevo David
c2cef77c90 feat: fix deployment 2025-07-07 19:17:37 +07:00
Nevo David
2f90e84b6f feat: postiz backlink 2025-07-07 19:13:32 +07:00
Nevo David
bc725a96c4 feat: postiz backlink 2025-07-07 19:13:15 +07:00
Nevo David
289025dc27 feat: postiz sdk 2025-07-07 19:11:15 +07:00
Nevo David
1ec42bacde feat: postiz node 2025-07-07 19:00:45 +07:00
Nevo David
6416e0160f feat: sdk 2025-07-07 18:59:03 +07:00
Nevo David
55d28d9815 Merge branch 'main' into feat/sdk 2025-07-07 17:56:53 +07:00
Nevo David
9b1308b2e6 feat: better rate limiting for instagram 2025-07-07 17:20:44 +07:00
Nevo David
49ecc81763 feat: fix media in a set
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-07 14:11:37 +07:00
Nevo David
c461fd6a57 feat: sdk 2025-07-07 14:05:12 +07:00
Nevo David
c7ccf37a94 feat: transloadit no key wrror
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-07 13:05:15 +07:00
Nevo David
9a9970bc5f feat: tiktok retries 2025-07-07 01:12:49 +07:00
Nevo David
10901ab5e7 feat: middle font
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-06 20:23:56 +07:00
Nevo David
914a1d0d60 feat: old version of music-data 2025-07-06 20:01:04 +07:00
Nevo David
705f7d60b6 feat: fix music-medata 2025-07-06 19:53:28 +07:00
Nevo David
a51cd245be Feat: p-limit is esm 2025-07-06 19:42:56 +07:00
Nevo David
3fee284df7 feat: downgrade plist 2025-07-06 19:28:59 +07:00
Nevo David
29461017b8
Merge pull request #857 from gitroomhq/feat/videos
Generate video slides
2025-07-06 19:18:21 +07:00
Nevo David
0f645846fc feat: videos 2025-07-06 19:17:08 +07:00
Nevo David
05720ec59e feat: elevans labs 2025-07-06 12:35:40 +07:00
Nevo David
9f9bce6906 feat: timestamp 2025-07-04 23:01:56 +07:00
Nevo David
477dc8b937 Merge remote-tracking branch 'origin/main' 2025-07-04 22:54:03 +07:00
Nevo David
ab0b29451f feat: fix tiktok 2025-07-04 22:52:12 +07:00
Enno Gelhaus
358525b4f2
feat/star history 2025-07-04 16:07:14 +02:00
Nevo David
f1f1c891ef feat: dummy 2025-07-04 20:07:19 +07:00
Nevo David
fb217f7300 feat: dummy 2025-07-04 19:54:59 +07:00
Nevo David
722460ce95 feat: generate api modal 2025-07-04 19:47:47 +07:00
Nevo David
0f0bebeec9 feat: better post valdiation + better error messages for validation 2025-07-04 13:01:52 +07:00
Nevo David
a80f0397f2 feat: validation 2025-07-04 12:24:40 +07:00
Nevo David
1faee653d9 feat: fix today on the same date 2025-07-04 11:17:10 +07:00
Nevo David
2405c66263 feat: current day + version fix
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-04 00:30:14 +07:00
Nevo David
ca72c5d793 feat: today and current date in week
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-03 22:03:00 +07:00
Nevo David
d1a0d0447a feat: post plug 2025-07-03 19:00:09 +07:00
Nevo David
b401776d67 feat: disable x analytics 2025-07-03 18:52:43 +07:00
Nevo David
5f23ced2f3 Merge remote-tracking branch 'origin/main' 2025-07-03 18:35:14 +07:00
Nevo David
58b5fe1b5c feat: disable x 2025-07-03 18:35:03 +07:00
Enno Gelhaus
7bbbe66e59
feat/no patreon 2025-07-03 12:10:23 +02:00
Enno Gelhaus
5ffee80aba
feat/patreon 2025-07-03 12:00:18 +02:00
Nevo David
7c70bc7c79 feat: delete post from timeline 2025-07-03 16:35:36 +07:00
Nevo David
86128f7573 Merge remote-tracking branch 'origin/main' 2025-07-03 15:02:27 +07:00
Nevo David
678710e128 feat: publish date 2025-07-03 15:02:10 +07:00
Nevo David
8f88bf75bc
Merge pull request #836 from Mokkapps/feature/linkdrip-short-linking-provider
feat: add LinkDrip provider for short linking service
2025-07-03 14:03:30 +07:00
Nevo David
f54647e905 feat: threads limitation fix
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-03 13:29:05 +07:00
Nevo David
ffe44318d5 feat: focused channel 2025-07-03 13:03:37 +07:00
Nevo David
293e15e043 feat: dto fix 2025-07-02 12:37:56 +07:00
Nevo David
530c14356a feat: different validation for posts 2025-07-01 17:16:56 +07:00
Nevo David
0ed729196f feat: convert to object 2025-07-01 14:54:28 +07:00
Nevo David
019baa818c Feat: fix linkedin pdf
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-07-01 04:38:38 +07:00
Nevo David
9b6e721f74 feat: internal plugs 2025-07-01 04:23:28 +07:00
Nevo David
fd33fe9fa8 feat: alt and thumbnail 2025-07-01 01:48:50 +07:00
Nevo David
fc1384a8bb
Merge pull request #851 from gitroomhq/feat/thumbnails
Thumbnails and alt
2025-07-01 01:44:49 +07:00
Nevo David
12e065b38b feat: thumbnails and alt 2025-07-01 01:42:59 +07:00
Nevo David
382df926fa feat: thumb 2025-06-30 23:10:11 +07:00
Nevo David
0b2e266726 feat: assembly 2025-06-30 18:22:49 +07:00
Nevo David
fc994982fb feat: fix apis 2025-06-30 16:42:23 +07:00
Nevo David
6a985f9257 feat: X_URL 2025-06-30 16:01:25 +07:00
Nevo David
05bc3b9278 feat: better error messages 2025-06-30 14:29:34 +07:00
Nevo David
785b04b93d feat: tiktok default parameters
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-29 18:43:09 +07:00
Nevo David
8fa1d6c9eb feat: missing translations 2025-06-29 16:50:32 +07:00
Nevo David
e12f795717 feat: add comment or add post 2025-06-29 16:02:53 +07:00
Nevo David
41746808c6 feat: postiz compliance 2025-06-29 13:20:22 +07:00
Nevo David
c6c6965eb9 feat: postiz compliance 2025-06-29 13:19:02 +07:00
Nevo David
98328923a2 feat: postiz compliance 2025-06-29 13:18:20 +07:00
Nevo David
b5474d64b8 feat: fix progress size 2025-06-28 20:09:38 +07:00
Nevo David
67eb6430e0 feat: sort images in a post 2025-06-28 19:57:14 +07:00
Nevo David
2b1020c528 feat: update existing intergrations 2025-06-28 19:08:02 +07:00
Nevo David
33e636aa21 feat: transloadit 2025-06-28 17:13:35 +07:00
Nevo David
57e46b10f4 Merge remote-tracking branch 'origin/main' into feat/translodit 2025-06-28 17:03:36 +07:00
Nevo David
0f8b6cf02f feat: transloadit 2025-06-28 17:03:33 +07:00
Nevo David
a5e5355839 feat: go back to global mode 2025-06-28 11:59:35 +07:00
Nevo David
7b0f1cbf2e feat: deleting integration your are currently on, should move you to global 2025-06-28 11:58:06 +07:00
Nevo David
2c4d0a8234 feat: translodit 2025-06-28 11:53:51 +07:00
Nevo David
69a08e6c8c feat: fix schedule now and post not button 2025-06-28 11:40:10 +07:00
Nevo David
30396f6a35 feat: transloadit 2025-06-28 11:38:02 +07:00
Nevo David
ca671654e5 feat: paste and drag and drop image, with loader
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-27 18:05:21 +07:00
Nevo David
d12ff06a9b feat: add version 2025-06-27 13:38:59 +07:00
Michael Hoffmann
980d1fcb86 feat: add LinkDrip provider for short linking service 2025-06-27 08:08:25 +02:00
Nevo David
38f31f3a83 feat: fix internal channels
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-27 12:37:08 +07:00
Nevo David
494df9c3db feat: in case total chars doesn't exists or it's wrong
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-27 11:57:07 +07:00
Nevo David
2537d95d73 feat: fix modal colors 2025-06-27 01:53:30 +07:00
Nevo David
133522807d feat: total chars 2025-06-27 01:41:02 +07:00
Nevo David
91f6d7adf0 feat: add version for the build 2025-06-27 01:31:18 +07:00
Nevo David
3c4bdb95be feat: fix weighted problem in X + added char counter
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-27 01:22:26 +07:00
Nevo David
623b27e646 feat: fix removal of internal
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-27 00:54:46 +07:00
Nevo David
3b9bbfa7fd feat: fix nostr and dribble
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-26 20:54:43 +07:00
Nevo David
b5e9ea18f9 feat: just disable, no login 2025-06-26 20:46:18 +07:00
Nevo David
ff467f1c42 feat: add loading
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-26 20:32:50 +07:00
Nevo David
493f0f1ab4
Merge pull request #842 from gitroomhq/feat/new-modal
Refactor: new postiz creation modal
2025-06-26 20:20:08 +07:00
Nevo David
bf2374e3c3 feat: remove console logs 2025-06-26 20:19:28 +07:00
Nevo David
ad6264f256 feat: fix errors 2025-06-26 20:07:30 +07:00
Nevo David
af2f952ed0 feat: new postiz modal 2025-06-26 20:00:42 +07:00
Nevo David
0f17d56522 feat: building 2025-06-25 16:09:24 +07:00
Nevo David
313380e183 feat: comment to comment 2025-06-24 17:55:52 +07:00
Nevo David
d6b72a7e50 Merge remote-tracking branch 'origin/main' 2025-06-24 17:29:17 +07:00
Nevo David
4d95bbe97d feat: facebook comments should be reversed 2025-06-24 17:28:58 +07:00
Enno Gelhaus
6dff177ce0
Fix Sponsor 2025-06-24 12:08:22 +02:00
Nevo David
b33b3c347a Merge remote-tracking branch 'origin/main' 2025-06-24 13:28:09 +07:00
Nevo David
8979519a3e feat: better loading 2025-06-24 13:27:36 +07:00
Nevo David
a4e4ee2e3f
Sponsorship 2025-06-24 12:39:40 +07:00
Nevo David
37b5c79b80 feat: update funding
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-23 21:02:26 +07:00
Nevo David
c4937401a3 feat: sponsor postiz 2025-06-23 21:00:01 +07:00
Nevo David
646caf5213 fix: X premium to upload longer videos 2025-06-23 12:57:01 +07:00
Nevo David
cde4e25c9d feat: fix upload size 2025-06-23 12:26:26 +07:00
Nevo David
9a74d756b4
Merge pull request #833 from gitroomhq/feat/3rdparties
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Add Integrations
2025-06-22 00:07:28 +07:00
Nevo David
0c1d854e78 feat: integrations 2025-06-22 00:06:34 +07:00
Nevo David
ce60edb053 feat: post to a community
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-21 12:35:33 +07:00
Nevo David
438f7b27cb feat: add option to longer gap 2025-06-21 00:29:53 +07:00
Nevo David
c3d2a8c2ae feat: fix wrapcast char limit 2025-06-21 00:19:25 +07:00
Nevo David
1642bc0235 feat: fix uploading larger files
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-20 11:03:46 +07:00
Nevo David
ad21ea0dd3 feat: fix pnpm
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-18 00:04:20 +07:00
Nevo David
ecf905cb81 feat: bluesky upload video
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-18 00:01:11 +07:00
Nevo David
b6021ffa28 feat: verified accounts 2025-06-17 22:33:54 +07:00
Nevo David
c892cb0ef2 feat: who can reply to the post
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-17 22:28:11 +07:00
Nevo David
375002ca73 feat: total replies 2025-06-13 14:17:03 +07:00
Nevo David
3a31da4b41 feat: separate posts with ai
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-10 19:46:21 +07:00
Nevo David
fd9bfecb65 Merge remote-tracking branch 'origin/main' 2025-06-10 17:30:45 +07:00
Nevo David
0b69f65780 feat: refresh channels on repost 2025-06-10 17:30:28 +07:00
Nevo David
f06315d7e3
Merge pull request #705 from etienn01/feature/pinterest-link
Add link field in Pinterest component
2025-06-10 11:26:17 +07:00
Nevo David
9f9eaf93ec
Merge pull request #763 from V1d1o7/patch-1
Update README.md
2025-06-10 11:20:22 +07:00
Nevo David
4c8a9886cb
Merge pull request #813 from altendorfme/kutt-it-shortlink-provider
Add kutt.it shortlink provider
2025-06-10 11:17:03 +07:00
Renan Bernordi
20eb1dfe88 add kutt.it shortlink provider 2025-06-10 01:13:25 -03:00
Nevo David
b06ccafa52 feat: fix hide only this on edit
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-09 23:40:16 +07:00
Nevo David
9d98020be1 feat: move signature to global load and fix add a post
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-09 20:35:54 +07:00
Nevo David
4b5580bc55 feat: import as type 2025-06-09 20:13:35 +07:00
Nevo David
6506baffe0 feat: import as type 2025-06-09 20:10:13 +07:00
Nevo David
abb1e4155c
Merge pull request #811 from gitroomhq/feat/sets
Sets feature
2025-06-09 20:02:57 +07:00
Nevo David
460521cc19 feat: fix selection to use id 2025-06-09 20:02:15 +07:00
Nevo David
f63f2849a4 feat: accounts 2025-06-09 19:46:38 +07:00
Nevo David
ae1ab39ed4 feat: sets selection modal 2025-06-09 19:23:51 +07:00
Nevo David
35625b281b feat: sets 2025-06-09 17:49:51 +07:00
Nevo David
3cf3a4b8bb feat: fix oidc
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-09 00:06:12 +07:00
Nevo David
43aa75b16f feat: check provider
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-08 23:16:03 +07:00
Nevo David
215398e873 feat: oidc fix
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-08 23:12:12 +07:00
Nevo David
997034cc96 Merge remote-tracking branch 'origin/main'
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-08 22:26:32 +07:00
Nevo David
19bf0802ba feat: dont disable oidc when DISABLE_REGISTRATION is on 2025-06-08 22:26:02 +07:00
Nevo David
68c8be4988 feat: allow in generic provider to register 2025-06-08 22:10:35 +07:00
Nevo David
9192cc4c85
Merge pull request #786 from gitroomhq/feat/carusel
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
LinkedIn post as carousel
2025-06-08 16:05:57 +07:00
Nevo David
8cfd94038e feat: post to LinkedIn 2025-06-08 16:05:09 +07:00
Nevo David
da60d8f665 feat: fix translations 2025-06-08 16:02:21 +07:00
Nevo David
40f71c0bf3 feat: linkedin post as carousel 2025-06-08 15:52:00 +07:00
Nevo David
cdbf173ca9 feat: carousel 2025-06-08 15:02:32 +07:00
Enno Gelhaus
9dc9ac308e
Update README.md 2025-06-08 04:23:31 +02:00
Enno Gelhaus
3037f8b87d
Merge pull request #785 from gitroomhq/fix-pnpx
Fix pnpx
2025-06-08 03:58:32 +02:00
Enno Gelhaus
a67345269f
Update docker-compose.dev.yaml 2025-06-08 03:32:06 +02:00
Enno Gelhaus
05e97d6843
Update package.json 2025-06-08 03:26:20 +02:00
Enno Gelhaus
1f428b61c0
Update .env.example 2025-06-08 02:47:34 +02:00
Enno Gelhaus
6eee397b10
Update version.txt 2025-06-07 20:01:01 +02:00
Nevo David
f72bbb9de3 Merge remote-tracking branch 'origin/main' 2025-06-08 00:35:46 +07:00
Nevo David
938855ecee feat: tiktok provider higher length 2025-06-08 00:35:34 +07:00
Enno Gelhaus
781e4d8fc0
Update SECURITY.md 2025-06-06 16:53:01 +02:00
Nevo David
e97b08773b
Merge pull request #782 from poteirard/patch-1
Fix typo in logout text
2025-06-06 19:21:26 +07:00
Gerard Brull
bb9b8add8a
Fix typo in logout text 2025-06-06 14:08:16 +02:00
Nevo David
231b11d386 feat: bluesky thread finisher
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-05 13:22:18 +07:00
Nevo David
48a412c1d0 Merge branch 'main' into feat/bluesky-finisher 2025-06-05 13:11:32 +07:00
Nevo David
3312261b28 Merge remote-tracking branch 'origin/main' 2025-06-04 23:29:51 +07:00
Nevo David
edba2d6ca5 feat: fix resolver 2025-06-04 23:29:23 +07:00
Enno Gelhaus
5a1427f990
Merge pull request #766 from halkeye/fix-docker-build 2025-06-04 17:32:30 +02:00
Enno Gelhaus
0f19dde9d8
Merge branch 'main' into fix-docker-build 2025-06-04 17:01:58 +02:00
Nevo David
1c8cc487ac feat: bluesky finisher 2025-06-04 21:36:39 +07:00
Enno Gelhaus
0f49e1969f
Aktualisieren von version.txt 2025-06-04 14:59:55 +02:00
Enno Gelhaus
9915ea7fcd
Merge pull request #778 from gitroomhq/codex/kommentar-in-zeile-16-aktualisieren
Fix comment typo in stars controller
2025-06-04 10:43:06 +02:00
Enno Gelhaus
4d21b775a0 fix: correct comment typo 2025-06-04 10:25:25 +02:00
Nevo David
a9e42ce31d feat: remove turbo repo 2025-06-04 10:42:08 +07:00
Nevo David
dc93dfbd45 Merge remote-tracking branch 'origin/main' 2025-06-04 10:09:26 +07:00
Nevo David
fd7b67449a feat: translation for thread finisher 2025-06-04 10:09:05 +07:00
Nevo David
3dc5ea8476
Merge pull request #775 from gitroomhq/feat/thread-finisher
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Thread finisher
2025-06-04 00:57:19 +07:00
Nevo David
762c53f640 feat: thread finisher for x and threads 2025-06-04 00:56:42 +07:00
Nevo David
8ec255b454 feat: fix slider 2025-06-03 23:42:28 +07:00
Nevo David
736acde5c9 feat: minimum 6 chars 2025-06-03 23:33:12 +07:00
Nevo David
4aa1b62fc6 feat: minimum chars 2025-06-03 21:38:40 +07:00
Turbobot
0f18612f21 feat(create-turbo): apply pnpm-eslint transform 2025-06-01 19:04:32 +07:00
Turbobot
55654807a3 feat(create-turbo): apply official-starter transform 2025-06-01 19:04:32 +07:00
Nevo David
8fe70bbf28 feat: fix i18next
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-06-01 18:15:40 +07:00
Nevo David
0d7da0ada3 feat: fix direction 2025-06-01 16:08:14 +07:00
Nevo David
90424ba1ac
Merge pull request #770 from gitroomhq/feat/multi-language
Added multi-language option
2025-06-01 15:39:56 +07:00
Nevo David
8064e1953d feat: fix login 2025-06-01 15:39:33 +07:00
Nevo David
44d64361b0 feat: languages 2025-06-01 15:20:49 +07:00
Enno Gelhaus
d4715dc4d0
pr-docker-build.yml aktualisieren 2025-06-01 00:00:16 +02:00
Enno Gelhaus
2c414b3529
pr-docker-build.yml aktualisieren 2025-05-31 23:57:28 +02:00
Enno Gelhaus
d0e40910bb
pr-docker-build.yml aktualisieren 2025-05-31 23:48:48 +02:00
Gavin Mogan
de256436f6 Fix: Handle docker build trying to access empty plugin directory not being created by docker copy 2025-05-31 12:09:37 -07:00
Nevo David
f460fdf252 feat: language 2025-06-01 00:04:06 +07:00
Nevo David
ac649424c6 feat: translation 2025-05-31 21:44:16 +07:00
Nevo David
92662e1624 feat: before translation 2025-05-31 19:22:43 +07:00
V1d1o7
cf2564e2d7
Update README.md
Update License badge to AGPL 3.0
2025-05-30 09:25:25 -04:00
Nevo David
8314cc58a2 feat: analytics 2025-05-30 00:43:48 +07:00
Nevo David
808589ae36 Merge remote-tracking branch 'origin/main' 2025-05-29 22:37:39 +07:00
Nevo David
8ded8fd385 feat: start from index 0 2025-05-29 22:37:22 +07:00
egelhaus
251469b556
.env.example X update 2025-05-29 17:28:50 +02:00
Nevo David
9d363c9add feat: linkedin comments limitation
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-05-27 17:17:17 +07:00
Nevo David
fa532f80c9 feat: instagram standalone refresh token 2025-05-27 16:15:18 +07:00
Nevo David
12ba2e9214 feat: chrome extension header 2025-05-27 14:35:36 +07:00
Nevo David
ce5d8d4adf Merge remote-tracking branch 'origin/main' 2025-05-27 14:12:11 +07:00
Nevo David
a2eb2a5d28 feat: fix tailwind 2025-05-27 14:11:58 +07:00
Nevo David
598f3a9d37
Merge pull request #758 from gitroomhq/feat/threads-refresh-token
Threads refresh token
2025-05-27 14:04:13 +07:00
Nevo David
dff7e57a14 feat: threads refresh token implementation 2025-05-27 14:03:19 +07:00
Nevo David
afd04de669 feat: changes 2025-05-26 14:59:19 +07:00
Nevo David
1e1834dc67
Merge pull request #754 from gitroomhq/feat/instagram-standalone-insights
Instagram standalone insights
2025-05-26 14:43:02 +07:00
Nevo David
01c569b9f6 feat: insights 2025-05-26 14:41:50 +07:00
egelhaus
8faa91b011
Merge pull request #708 from halkeye/add-env-for-mastodon
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-05-26 01:54:05 +02:00
egelhaus
8a972c591f
Merge branch 'main' into add-env-for-mastodon 2025-05-26 01:48:07 +02:00
egelhaus
402878cf7e
Merge pull request #751 from eddywashere/selfhosted-dub-support
feat(short-linking): make Dub provider configurable for self-hosting
2025-05-23 20:40:14 +02:00
egelhaus
afd39b0e5a
Update pr-docker-build.yml 2025-05-23 20:40:00 +02:00
Eddy Hernandez
93464bfa09 feat(short-linking): make Dub provider configurable for self-hosting 2025-05-23 10:55:57 -07:00
Nevo David
4fe29511b9 feat: fixed disableImageCompression variable in chrome extension
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-05-23 20:14:39 +07:00
egelhaus
d803868362
Merge pull request #750 from gitroomhq/feat/disable-image-compression
Disable image compression variable
2025-05-23 15:14:07 +02:00
Nevo David
ca2a8afa3d feat: compression 2025-05-23 20:07:50 +07:00
Nevo David
ddfad423ab Merge remote-tracking branch 'origin/main' 2025-05-23 15:01:31 +07:00
Nevo David
951ceef823 feat: downgraded postiz version 2025-05-23 15:01:12 +07:00
egelhaus
9f6adf3efc
Merge pull request #745 from gitroomhq/feat/pr-docker-images
Feat/PR Docker Images
2025-05-17 21:14:08 +02:00
egelhaus
3f7be1d343
Rename pr-docker-build to pr-docker-build.yml 2025-05-17 20:21:04 +02:00
Nevo David
317ded1ddc feat: fix x buttons
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-05-17 15:57:57 +07:00
Nevo David
52081c46d5 feat: middleware load auth from url 2025-05-17 14:56:04 +07:00
Nevo David
5dc72873d5 Merge remote-tracking branch 'origin/main' 2025-05-17 09:47:00 +07:00
Nevo David
37d2e0e202 feat: fixed adding channels 2025-05-17 09:46:43 +07:00
egelhaus
24fcc43a08
Create build-extension.yaml 2025-05-16 17:07:11 +02:00
Nevo David
c951720a6e feat: chrome extension token in header 2025-05-16 16:01:33 +07:00
Nevo David
5d908470f1 feat: token 2025-05-16 15:35:40 +07:00
Nevo David
31ddfab0b6 feat: remove csp 2025-05-16 15:23:35 +07:00
Nevo David
a34498b128 feat: allow frames 2025-05-16 15:18:01 +07:00
Nevo David
006a9a644f feat: allow chrome extension 2025-05-16 15:11:52 +07:00
Nevo David
8513f093f7 feat: remove tracking from extension 2025-05-16 12:44:17 +07:00
Nevo David
987caabac3 feat: urgent fix for react-hook-fork
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-05-16 12:25:58 +07:00
Nevo David
23de5530e7 Merge remote-tracking branch 'origin/main' 2025-05-14 17:21:42 +07:00
Nevo David
ffaf56e1cd feat: remove test 2025-05-14 17:21:09 +07:00
egelhaus
6499c5d618
Update README.md 2025-05-14 08:54:08 +02:00
Nevo David
830489ee01 feat: package json
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-05-13 18:56:34 +07:00
Nevo David
ba39086dbe Merge remote-tracking branch 'origin/main' 2025-05-13 18:34:06 +07:00
Nevo David
cdaa541531 feat: chrome extension workflow 2025-05-13 18:33:45 +07:00
egelhaus
d384d816ab
Merge pull request #736 from DrummyFloyd/oidc-fixes
fix(oidc): remove trailling / needed but add by User & Missing Oauth on  /auth
2025-05-12 18:00:29 +02:00
DrummyFloyd
cbc7d2bb65
fix(oidc): missing oidcGeneric on /auth 2025-05-12 17:43:24 +02:00
DrummyFloyd
dcc140dca0
fix(oidc): remove trailling / needed but add manually
depends on provider keycloack != authentik
2025-05-12 17:42:41 +02:00
Nevo David
d8c9e8e386 Merge branch 'feat/chrome-extension' 2025-05-12 21:26:32 +07:00
Nevo David
5f7f9b69a4 feat: changes 2025-05-12 21:26:12 +07:00
Nevo David
8e982f0d63
Merge pull request #735 from gitroomhq/feat/chrome-extension
Intial release of chrome extension
2025-05-12 21:17:29 +07:00
Nevo David
c15b8f1ae1 feat: chrome extension 2025-05-12 21:16:27 +07:00
Nevo David
c4cf224be6 Merge remote-tracking branch 'origin/main' 2025-05-12 19:20:59 +07:00
Nevo David
fc5efc221a feat: add lifetime 2025-05-12 19:20:42 +07:00
Nevo David
f5efb85054 feat: extension 2025-05-12 19:20:30 +07:00
egelhaus
1218ffbb83
Aktualisieren von stale.yml 2025-05-09 07:46:14 +02:00
Nevo David
93205fb2db feat: quick hook to solve the delay problem in reposts 2025-05-07 22:17:19 +07:00
Nevo David
c161c3781a feat: fix dto bug after pnpm update
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-05-07 19:08:50 +07:00
Nevo David
56a88d9289 feat: build with pnpm
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-05-06 21:41:12 +07:00
Nevo David
fec463c6f1 feat: different eslint 2025-05-06 21:25:25 +07:00
Nevo David
9a59f39557 feat: fix eslint 2025-05-06 21:15:15 +07:00
Nevo David
1771a5e537 feat: fix eslint 2025-05-06 21:06:59 +07:00
Nevo David
45ad6f1c97 feat: fix eslint 2025-05-06 20:58:25 +07:00
Nevo David
9eb2702632 feat: fix package json 2025-05-06 20:47:59 +07:00
Nevo David
4c2ab01698 feat: build backend 2025-05-06 20:39:50 +07:00
Nevo David
477ecec5be feat: build 2025-05-06 20:36:24 +07:00
Nevo David
5236430f95 Merge remote-tracking branch 'origin/main' 2025-05-06 20:29:26 +07:00
Nevo David
6f73f669b7 feat: fix 2025-05-06 20:28:51 +07:00
Nevo David
fab3ebd35c feat: move to pnpm 2025-05-06 20:16:50 +07:00
egelhaus
c4dc5f11d9
Aktualisieren von stale.yml 2025-05-05 21:47:55 +02:00
Nevo David
4ba5156502 feat: move to pnpm 2025-05-06 00:09:59 +07:00
egelhaus
a8ecd14227
Update stale.yml 2025-05-05 17:28:52 +02:00
egelhaus
aae9551b5f
Aktualisieren von stale.yml 2025-05-05 17:28:11 +02:00
egelhaus
08b93562dc
Aktualisieren von stale.yml 2025-05-05 17:21:13 +02:00
egelhaus
af3ce01d10
stale.yml Fiy 2025-05-05 17:15:15 +02:00
egelhaus
6608b18ccd
stale.yml 2025-05-05 17:02:59 +02:00
egelhaus
9b76875169
stale.yml 2025-05-05 16:01:20 +02:00
Nevo David
1cf2440264 feat: no org, stop 2025-05-05 20:47:40 +07:00
Nevo David
cf7916b061 Merge remote-tracking branch 'origin/main' 2025-05-05 20:38:37 +07:00
Nevo David
d02792a567 feat: one subscrption disable all subscriptions 2025-05-05 20:38:07 +07:00
egelhaus
7d2c6a531c
Merge pull request #701 from DrummyFloyd/add-authentik-sso
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Add Generic  sso/OIDC
2025-05-04 00:27:19 +02:00
egelhaus
38ad812d51
Merge branch 'main' into add-authentik-sso 2025-05-03 23:52:54 +02:00
Nevo David
4ac4bc4477 feat: fix payments 2025-05-03 14:06:25 +07:00
Nevo David
935ea1cb54 feat: go back to dall-e 2025-05-03 14:05:00 +07:00
Nevo David
2fbc851516 feat: fix nullable and card 2025-05-03 14:02:42 +07:00
Nevo David
76621e89ed feat: use old image model 2025-05-03 11:09:23 +07:00
DrummyFloyd
2a87ba1959
Merge branch 'main' into add-authentik-sso 2025-04-30 14:15:40 +02:00
Nevo David
054207bde9 feat: fix repost
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-04-30 00:16:31 +07:00
egelhaus
9aacd5cddb
Update app.module.ts
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build / build (20.17.0) (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-04-28 13:11:42 +02:00
egelhaus
dbe81682f0
Update .env.example 2025-04-28 13:04:31 +02:00
egelhaus
6ea3317dbf
Add eng variable for api threshold 2025-04-28 13:03:08 +02:00
Nevo David
42cb9c5499 feat: in case of error, show it 2025-04-28 14:39:56 +07:00
egelhaus
102105a73b
Update build.yaml 2025-04-27 21:47:48 +02:00
Nevo David
0e92e51ddc feat: fix package json 2025-04-27 16:54:06 +00:00
Nevo David
da2023d9de feat: fix package json 2025-04-27 16:50:34 +00:00
Nevo David
ace884d1ed
Merge pull request #719 from gitroomhq/feat/fast-convert
Option to merge all comments into one post
2025-04-27 23:22:49 +07:00
Nevo David
50cf141dac feat: convert comments into one post 2025-04-27 23:21:51 +07:00
Nevo David
735a687419 feat: fix billing 2025-04-27 13:27:25 +07:00
Nevo David
a0d0466944 feat: fix copilotkit 2025-04-26 19:48:32 +07:00
Nevo David
97f0ff0a66 feat: upgrade models 2025-04-26 11:47:17 +07:00
Nevo David
463bd96ff8 feat: upgrade model 2025-04-26 11:45:55 +07:00
Nevo David
ab39e5cc69 feat: bigger concurrency 2025-04-24 18:45:14 +07:00
Gavin Mogan
7f2892e667 feat: Move https://mastodon.social to env variable for ability to change instances per install 2025-04-20 11:09:43 -07:00
Nevo David
ee0fa5b87f
Merge pull request #707 from gitroomhq/feat/vk
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Fixed VK
2025-04-18 21:09:29 +07:00
Nevo David
7f82e6c6ab feat: vk refresh token 2025-04-18 21:09:01 +07:00
Nevo David
3e74b5244f
Merge pull request #706 from gitroomhq/feat/vk
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Added VK
2025-04-18 19:46:23 +07:00
Nevo David
0abd68961f feat: vk provider 2025-04-18 19:45:45 +07:00
Nevo David
7c265e5f67 feat: fix threads upload pictures in comments + fix layout in login
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-04-17 12:55:10 +07:00
egelhaus
9d1c762327
Merge branch 'main' into add-authentik-sso 2025-04-15 17:09:19 +02:00
Nevo David
c27d240cf7 feat: no singleton
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-04-15 19:48:26 +07:00
Nevo David
267bc070ab Merge remote-tracking branch 'origin/main' 2025-04-15 11:46:55 +07:00
Nevo David
4474afde7f feat: mcps 2025-04-15 11:46:42 +07:00
egelhaus
aa6322ab5f
Merge branch 'main' into add-authentik-sso 2025-04-14 19:47:38 +02:00
egelhaus
e60566f6a9
Update Jenkinsfile 2025-04-14 19:46:19 +02:00
egelhaus
c66b7c0f8d
Merge branch 'main' into add-authentik-sso 2025-04-14 19:40:51 +02:00
egelhaus
6b6ce501a3
Update Jenkinsfile 2025-04-14 19:40:30 +02:00
egelhaus
b111dd0af2
Merge branch 'main' into add-authentik-sso 2025-04-14 19:27:41 +02:00
egelhaus
f92a24e052
Update Jenkinsfile 2025-04-14 19:23:29 +02:00
egelhaus
8c4738f12d
Update Jenkinsfile 2025-04-14 19:14:16 +02:00
egelhaus
c88a4347d7
Update version.txt 2025-04-14 18:21:24 +02:00
Nevo David
026957b96e feat: mcp copy to clipboard 2025-04-14 11:49:44 +07:00
Nevo David
de14aead77 Merge remote-tracking branch 'origin/main' 2025-04-14 10:33:57 +07:00
Nevo David
631db83595 feat: view invoices from stripe portal 2025-04-14 10:33:43 +07:00
egelhaus
0f5379f738
Merge branch 'main' into add-authentik-sso 2025-04-14 05:01:16 +02:00
egelhaus
1e798f2095
Rename pr-docker-build.yml to pr-docker-build 2025-04-14 05:00:43 +02:00
egelhaus
8a41e20d82
Merge branch 'main' into add-authentik-sso 2025-04-14 04:49:13 +02:00
egelhaus
d6bb32f4d7
Update pr-docker-build.yml 2025-04-14 04:48:44 +02:00
egelhaus
a14c950ce5
Merge branch 'main' into add-authentik-sso 2025-04-14 04:35:33 +02:00
egelhaus
1d248bb25a
Update Jenkinsfile 2025-04-14 04:26:36 +02:00
egelhaus
936a1fbf7e
Update pr-docker-build.yml 2025-04-14 04:21:50 +02:00
egelhaus
956c5825e4
Jenkinsfile aktualisieren 2025-04-14 03:11:02 +02:00
egelhaus
1e669f69b2
pr-docker-build.yml aktualisieren 2025-04-14 02:46:22 +02:00
egelhaus
a9ffcec712
Merge branch 'main' into add-authentik-sso 2025-04-14 02:32:11 +02:00
egelhaus
6204f1e95d
Merge pull request #704 from gitroomhq/703-automatic-docker-images-for-prs
Create pr-docker-build.yml
2025-04-14 02:28:30 +02:00
egelhaus
dbb83076df
Merge branch 'main' into 703-automatic-docker-images-for-prs 2025-04-14 01:02:51 +02:00
egelhaus
a063561406
Update Jenkinsfile 2025-04-14 00:53:59 +02:00
egelhaus
29398dac3b
Merge branch 'main' into 703-automatic-docker-images-for-prs 2025-04-14 00:48:49 +02:00
egelhaus
c7a49620a6
Update Jenkinsfile 2025-04-14 00:48:33 +02:00
egelhaus
9907263c26
Merge branch 'main' into 703-automatic-docker-images-for-prs 2025-04-14 00:46:55 +02:00
egelhaus
b97aa4a751
Create pr-docker-build.yml 2025-04-14 00:32:12 +02:00
egelhaus
4a0cb78c90
Delete .github/pr-docker-build.yml 2025-04-14 00:31:25 +02:00
egelhaus
ea2c271ccf
Create pr-docker-build.yml 2025-04-14 00:30:11 +02:00
egelhaus
1769054b7c
Rename dependabot to Dependabot.yml 2025-04-13 16:09:22 +02:00
egelhaus
ab36e5e3d1
Update CONTRIBUTING.md 2025-04-13 14:48:07 +02:00
egelhaus
a0ad28e615
Merge branch 'main' into add-authentik-sso 2025-04-13 01:26:28 +02:00
egelhaus
d1963d99e4
Delete .github/workflows/dev-branch.yaml 2025-04-13 01:25:53 +02:00
DrummyFloyd
17892e64ad
feat(oidc): use generic implementation 2025-04-12 22:50:51 +02:00
DrummyFloyd
f9aa278883
feat(oidc): add authentik as oidc
chore(env): missing var in .env.example

chore: typo

chore: add reviewed stuff

fix: rebased stuff

fix(authentik-oidc): redirect corect oidc provider
2025-04-12 22:50:47 +02:00
egelhaus
b8a0e1cbf2
dev-branch.yaml aktualisieren 2025-04-12 17:23:15 +02:00
egelhaus
4f02747cbc
Deactivate NodeJS Cache
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-04-12 16:48:50 +02:00
Nevo David
d07bbf5c19 feat: fix deps 2025-04-12 14:42:50 +00:00
Nevo David
545df412b1
Merge pull request #698 from gitroomhq/feat/mcp-server
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
First version of MCPs
2025-04-12 21:25:39 +07:00
Nevo David
778703605d feat: package json 2025-04-12 14:21:59 +00:00
Nevo David
a271c33f5e feat: mcp first version 2025-04-12 21:13:37 +07:00
Nevo David
7725c1ce71 feat: fix instagram permission from impressions to views, fix md remover mess up the message
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-04-12 11:33:24 +07:00
egelhaus
91fa898908
Merge pull request #674 from gitroomhq/dev
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
WIP: v1.38.1
2025-04-12 00:11:48 +02:00
egelhaus
c7c5b8c3d1
Merge branch 'main' into dev 2025-04-11 22:57:21 +02:00
egelhaus
d7bb207fa3
Disable DependaBOT 2025-04-11 22:56:37 +02:00
egelhaus
2e19f77189
Merge branch 'main' into dev 2025-04-11 22:55:56 +02:00
egelhaus
4ce941214f
Merge pull request #694 from gitroomhq/hotfix-conflict-fix
fix conflicts (override "dev" package jsons with "main" package jsons)
2025-04-11 22:55:36 +02:00
egelhaus
2c6bc16b6d
fix conflicts (override "dev" package jsons with "main" package jsons) 2025-04-11 22:54:00 +02:00
Nevo David
46c028b28e feat: fix copilotkit
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-04-12 00:06:01 +07:00
Nevo David
b4261c2777 feat: pluralize 2025-04-11 23:47:53 +07:00
Nevo David
ff8b408373 feat: fix pacakge json 2025-04-11 16:41:40 +00:00
Nevo David
fec7783067 feat: update deps 2025-04-11 22:33:08 +07:00
Nevo David
2558eda779 feat: package json fix 2025-04-11 22:29:46 +07:00
Nevo David
2a9934bd8c feat: fix tiktok, fix bluesky, added runner to build arm64 with QEMU 2025-04-11 22:03:12 +07:00
egelhaus
72bb497e37
Merge pull request #688 from gitroomhq/jenk-cache
Jenk cache
2025-04-09 22:12:41 +02:00
egelhaus
f9a410cabf
Merge branch 'dev' into jenk-cache 2025-04-09 21:56:20 +02:00
egelhaus
b1b2f93ac2
Update Jenkinsfile 2025-04-09 21:28:35 +02:00
egelhaus
632639bb40
Update Jenkinsfile 2025-04-09 21:26:34 +02:00
egelhaus
3c00ea792a
Update Jenkinsfile 2025-04-09 21:00:15 +02:00
egelhaus
c36c16d92f
Update Jenkinsfile 2025-04-09 17:59:20 +02:00
egelhaus
c769483f25
Update Jenkinsfile 2025-04-09 17:40:28 +02:00
egelhaus
4c8f9cf9c8
Update Jenkinsfile 2025-04-09 17:32:13 +02:00
egelhaus
a12dcadbf2
Update Jenkinsfile 2025-04-09 17:28:05 +02:00
egelhaus
798e4af50f
Update Jenkinsfile 2025-04-09 17:19:25 +02:00
egelhaus
96420f4b5d
Update Jenkinsfile 2025-04-09 17:08:17 +02:00
egelhaus
6271e2c06d
Update Jenkinsfile 2025-04-09 17:05:20 +02:00
egelhaus
181fba1736
Update Jenkinsfile 2025-04-09 16:48:31 +02:00
egelhaus
38e2813380
Update Jenkinsfile 2025-04-09 16:47:10 +02:00
egelhaus
3dacc57711
Update Jenkinsfile 2025-04-09 16:46:59 +02:00
egelhaus
6446361b46
Update Jenkinsfile 2025-04-09 16:44:52 +02:00
egelhaus
1dec2b8c2a
Update Jenkinsfile 2025-04-09 16:42:39 +02:00
egelhaus
46f0f270ca
Update Jenkinsfile 2025-04-09 16:40:37 +02:00
egelhaus
69a938b3b8
Update Jenkinsfile 2025-04-09 16:30:36 +02:00
egelhaus
dda1bf6ae7
Merge branch 'main' into dev 2025-04-09 16:14:23 +02:00
Étienne Fesser
86a803c300 Add link field in Pinterest component 2025-04-05 18:06:03 +02:00
egelhaus
197d50c8b7
Merge pull request #683 from talkenigs/fix-dependencies
Fix aws-sdk & langcahin/community peer dependencies conflicts
2025-04-04 13:45:47 +02:00
talkenigs
fc17cb3023 fix: resolve conflicts 2025-04-04 14:35:51 +03:00
talkenigs
66cb390049 fix: revert change to follow 1 change rule 2025-04-04 14:21:43 +03:00
egelhaus
9b59dbd746
backend.conf hotfix
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-04-04 12:25:11 +02:00
egelhaus
ac06ba4aad
Docker Hotfix 2/2
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-04-04 11:38:37 +02:00
egelhaus
34d2d825ea
Hot fix docker Work flow 1/2 2025-04-04 11:37:42 +02:00
talkenigs
627d15576b fix: aws-sdk dependencies and module error 2025-04-04 10:35:59 +03:00
egelhaus
8b8a8b9c23
Merge pull request #681 from gitroomhq/dependabot/npm_and_yarn/uppy/core-4.4.3
chore(deps): bump @uppy/core from 4.4.2 to 4.4.3
2025-04-04 07:40:43 +02:00
egelhaus
8d87463df7
Merge branch 'dev' into dependabot/npm_and_yarn/uppy/core-4.4.3 2025-04-03 23:12:09 +02:00
dependabot[bot]
36512d19c7
chore(deps): bump @uppy/core from 4.4.2 to 4.4.3
Bumps [@uppy/core](https://github.com/transloadit/uppy) from 4.4.2 to 4.4.3.
- [Release notes](https://github.com/transloadit/uppy/releases)
- [Changelog](https://github.com/transloadit/uppy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/transloadit/uppy/compare/@uppy/core@4.4.2...@uppy/core@4.4.3)

---
updated-dependencies:
- dependency-name: "@uppy/core"
  dependency-version: 4.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-03 21:11:15 +00:00
egelhaus
9df34a4df2
Merge pull request #680 from gitroomhq/dependabot/npm_and_yarn/types/lodash-4.17.16 2025-04-03 23:10:52 +02:00
egelhaus
06dfac6e1d
Merge branch 'dev' into dependabot/npm_and_yarn/types/lodash-4.17.16 2025-04-03 23:05:17 +02:00
dependabot[bot]
ed18500a42
chore(deps): bump @types/lodash from 4.17.15 to 4.17.16
Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.17.15 to 4.17.16.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash)

---
updated-dependencies:
- dependency-name: "@types/lodash"
  dependency-version: 4.17.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-03 20:49:37 +00:00
egelhaus
4b2b382bd7
Merge pull request #676 from gitroomhq/dependabot/npm_and_yarn/ts-jest-29.3.1
chore(deps-dev): bump ts-jest from 29.2.5 to 29.3.1
2025-04-03 08:05:24 +02:00
egelhaus
c0203191af
Merge branch 'dev' into dependabot/npm_and_yarn/ts-jest-29.3.1 2025-04-03 07:49:44 +02:00
egelhaus
126efb8556
Merge pull request #675 from gitroomhq/dependabot/npm_and_yarn/swc/helpers-0.5.15
chore(deps): bump @swc/helpers from 0.5.13 to 0.5.15
2025-04-03 07:47:33 +02:00
dependabot[bot]
7504723f52
chore(deps-dev): bump ts-jest from 29.2.5 to 29.3.1
Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 29.2.5 to 29.3.1.
- [Release notes](https://github.com/kulshekhar/ts-jest/releases)
- [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/kulshekhar/ts-jest/compare/v29.2.5...v29.3.1)

---
updated-dependencies:
- dependency-name: ts-jest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-02 20:32:46 +00:00
dependabot[bot]
a841ac0910
chore(deps): bump @swc/helpers from 0.5.13 to 0.5.15
Bumps [@swc/helpers](https://github.com/swc-project/swc) from 0.5.13 to 0.5.15.
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG-CORE.md)
- [Commits](https://github.com/swc-project/swc/commits)

---
updated-dependencies:
- dependency-name: "@swc/helpers"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-02 20:32:21 +00:00
egelhaus
2701cb8f66
Merge pull request #648 from gitroomhq/dependabot/npm_and_yarn/nx/vite-20.5.0
chore(deps): bump @nx/vite from 19.7.2 to 20.5.0
2025-04-02 22:10:06 +02:00
egelhaus
5797eed2e5
Merge branch 'dev' into dependabot/npm_and_yarn/nx/vite-20.5.0 2025-04-02 22:00:57 +02:00
egelhaus
4bf706d9d5
Merge pull request #647 from gitroomhq/dependabot/npm_and_yarn/remove-markdown-0.6.0
chore(deps): bump remove-markdown from 0.5.5 to 0.6.0
2025-04-02 22:00:35 +02:00
egelhaus
ee432036a0
Merge branch 'dev' into dependabot/npm_and_yarn/remove-markdown-0.6.0 2025-04-02 21:47:54 +02:00
egelhaus
c2b3f1fdbf
Merge branch 'dev' into dependabot/npm_and_yarn/nx/vite-20.5.0 2025-04-02 21:47:38 +02:00
egelhaus
4e37ea46df
Merge branch 'main' into dev 2025-04-02 21:16:47 +02:00
egelhaus
0f7272097a
v1.38.1 2025-04-02 21:15:53 +02:00
egelhaus
7e738a75d7
Merge pull request #646 from gitroomhq/dev
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
v.37.1
2025-04-02 21:10:08 +02:00
egelhaus
0849bdc37f
Merge pull request #664 from hanzalawebdev/main 2025-03-28 07:41:03 +01:00
Muhammad Hanzala Ali
b4aa6712ed
Merge branch 'dev' into main 2025-03-27 10:47:10 +05:00
hanzalawebdev
ac3386f58b Add functionality of build reports in CI/CD in Jenkinsfile. 2025-03-27 10:31:52 +05:00
egelhaus
76c571e21f
Merge pull request #658 from hanzalawebdev/main 2025-03-24 08:31:23 +01:00
egelhaus
8cbf069f70
Update Jenkinsfile 2025-03-24 08:19:18 +01:00
Muhammad Hanzala Ali
27c8399afa
Merge pull request #3 from hanzalawebdev/feat/unit-tests
Update Jenkinsfile
2025-03-24 12:04:14 +05:00
Muhammad Hanzala Ali
742d60429c
Update Jenkinsfile 2025-03-24 12:01:47 +05:00
Muhammad Hanzala Ali
441117edd8
Merge pull request #2 from hanzalawebdev/feat/unit-tests
fixing error of unit tests and also update Jenkinsfile
2025-03-24 11:22:19 +05:00
Muhammad Hanzala Ali
038eeeddbe
Merge branch 'main' into feat/unit-tests 2025-03-24 11:22:09 +05:00
hanzalawebdev
8e6df31dcf fixing error of unit tests and also update Jenkinsfile 2025-03-24 11:15:40 +05:00
egelhaus
251cf074c7
Update Jenkinsfile 2025-03-18 10:04:32 +01:00
egelhaus
057755fcfa
Update Jenkinsfile 2025-03-18 07:56:47 +01:00
egelhaus
d973ea5876
Merge branch 'dev' into main 2025-03-17 18:21:28 +01:00
Muhammad Hanzala Ali
4b85feb481
Merge pull request #1 from hanzalawebdev/feat/unit-tests
Adding feature unit tests package.json and also adding unit tests ste…
2025-03-17 21:53:14 +05:00
Cypher474
a51175c92a Adding feature unit tests package.json and also adding unit tests steps in Jenkinsfile. 2025-03-17 21:41:15 +05:00
egelhaus
fe1f28535e
Merge branch 'main' into dev 2025-03-15 09:05:48 +01:00
Nevo David
dd60c938e6
Merge pull request #655 from gitroomhq/feat/tiktok-images
Upload tiktok images
2025-03-15 00:59:21 +07:00
Nevo David
5c10b52c19
Merge pull request #654 from gitroomhq/feat/tiktok-images
Upload tiktok images
2025-03-15 00:58:10 +07:00
Nevo David
8399aee295 feat: tiktok photos 2025-03-15 00:57:32 +07:00
egelhaus
d794fca863
Merge pull request #651 from FoamToaster/patch-1
Commented out Bluesky alt text line
2025-03-13 18:43:05 +01:00
Nevo David
3de66b7e68 feat: fix scheduler 2025-03-13 19:45:57 +07:00
Tom
e6ec03c658
Update bluesky.provider.ts
Commented out the alt text line for now until there is a way to set this from within Postiz
2025-03-12 16:33:02 +00:00
egelhaus
a05feb9d49
Trigger CI/CD 2025-03-11 07:54:03 +01:00
egelhaus
8e90b3fdaf
Merge branch 'dev' into dependabot/npm_and_yarn/nx/vite-20.5.0 2025-03-10 22:19:08 +01:00
egelhaus
9121e7cedf
Merge branch 'dev' into dependabot/npm_and_yarn/remove-markdown-0.6.0 2025-03-10 22:10:04 +01:00
dependabot[bot]
909bdf1280
chore(deps): bump @nx/vite from 19.7.2 to 20.5.0
Bumps [@nx/vite](https://github.com/nrwl/nx/tree/HEAD/packages/vite) from 19.7.2 to 20.5.0.
- [Release notes](https://github.com/nrwl/nx/releases)
- [Commits](https://github.com/nrwl/nx/commits/20.5.0/packages/vite)

---
updated-dependencies:
- dependency-name: "@nx/vite"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-10 20:48:28 +00:00
dependabot[bot]
161f7cd404
chore(deps): bump remove-markdown from 0.5.5 to 0.6.0
Bumps [remove-markdown](https://github.com/zuchka/remove-markdown) from 0.5.5 to 0.6.0.
- [Commits](https://github.com/zuchka/remove-markdown/commits/v0.6.0)

---
updated-dependencies:
- dependency-name: remove-markdown
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-10 20:47:53 +00:00
egelhaus
5353274e2e
Merge branch 'main' into dev 2025-03-10 17:31:09 +01:00
egelhaus
186cff3b45
Update Jenkinsfile 2025-03-10 17:29:59 +01:00
egelhaus
3e5b1f078e
Merge branch 'main' into dev 2025-03-10 16:32:38 +01:00
egelhaus
919dd10e79
Delete .github/workflows/eslint.yaml 2025-03-10 16:32:24 +01:00
egelhaus
df722d2f86
Disable ESLint 2025-03-10 16:09:10 +01:00
egelhaus
c6f7c47ffb Update Actions 2025-03-10 15:47:10 +01:00
egelhaus
d9207e81cd
Merge branch 'main' into dev 2025-03-10 14:29:03 +01:00
egelhaus
290b1c8046
Enable action 2025-03-10 14:28:31 +01:00
egelhaus
dec1de8251
Enable Action 2025-03-10 14:25:44 +01:00
egelhaus
de4754bc3e
Merge pull request #645 from gitroomhq/main
Update dev branch
2025-03-10 14:21:56 +01:00
egelhaus
43b015ff1d Temporary disable 2025-03-10 14:21:15 +01:00
egelhaus
3b7e3dc243
Remove dummy variables 2025-03-10 14:11:47 +01:00
egelhaus
639081cb3d
Rename dev-branch to dev-branch.yaml 2025-03-10 13:45:51 +01:00
egelhaus
0d4433159b
Create dev-branch 2025-03-10 13:44:34 +01:00
egelhaus
be5229b97f
Update CONTRIBUTING.md 2025-03-10 13:35:40 +01:00
egelhaus
10ae7c1dd6
Merge pull request #642 from gitroomhq/dependabot/npm_and_yarn/ts-node-10.9.2
chore(deps-dev): bump ts-node from 10.9.1 to 10.9.2
2025-03-10 13:11:43 +01:00
egelhaus
b397905baa
Merge pull request #641 from gitroomhq/dependabot/npm_and_yarn/eslint-config-next-15.2.1
chore(deps-dev): bump eslint-config-next from 14.2.3 to 15.2.1
2025-03-10 13:05:13 +01:00
egelhaus
bc1912caa5
Merge pull request #639 from gitroomhq/dependabot/npm_and_yarn/prisma/client-6.4.1
chore(deps): bump @prisma/client from 5.22.0 to 6.4.1
2025-03-10 13:02:03 +01:00
dependabot[bot]
cc178df44c
chore(deps-dev): bump ts-node from 10.9.1 to 10.9.2
Bumps [ts-node](https://github.com/TypeStrong/ts-node) from 10.9.1 to 10.9.2.
- [Release notes](https://github.com/TypeStrong/ts-node/releases)
- [Changelog](https://github.com/TypeStrong/ts-node/blob/main/development-docs/release-template.md)
- [Commits](https://github.com/TypeStrong/ts-node/compare/v10.9.1...v10.9.2)

---
updated-dependencies:
- dependency-name: ts-node
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-10 11:45:27 +00:00
dependabot[bot]
f233a7433c
chore(deps-dev): bump eslint-config-next from 14.2.3 to 15.2.1
Bumps [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) from 14.2.3 to 15.2.1.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v15.2.1/packages/eslint-config-next)

---
updated-dependencies:
- dependency-name: eslint-config-next
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-10 11:45:03 +00:00
dependabot[bot]
b7973de74c
chore(deps): bump @prisma/client from 5.22.0 to 6.4.1
Bumps [@prisma/client](https://github.com/prisma/prisma/tree/HEAD/packages/client) from 5.22.0 to 6.4.1.
- [Release notes](https://github.com/prisma/prisma/releases)
- [Commits](https://github.com/prisma/prisma/commits/6.4.1/packages/client)

---
updated-dependencies:
- dependency-name: "@prisma/client"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-10 11:44:07 +00:00
egelhaus
b04c4cbb0d
Create dependabot.yml 2025-03-10 12:42:40 +01:00
egelhaus
d586116d36
Aktualisieren von .env.example 2025-03-10 10:28:06 +01:00
egelhaus
eafe43b316
Update Jenkinsfile 2025-03-10 09:23:35 +00:00
egelhaus
e4f7a34ab1
Remove comment from Jenkinsfile 2025-03-10 08:59:02 +01:00
egelhaus
775547dd7f
Jenkinsfile add 2025-03-10 08:55:42 +01:00
egelhaus
eccd833d0b
Update build.yaml 2025-03-09 16:38:38 +01:00
egelhaus
50b51d709c
Merge pull request #633 from tamilarasi-tech/feature/backend-port-mapping
added environment port setting in backend
2025-02-27 21:59:07 +01:00
Tamilarasi Technologies
136a5cb692 added environment port setting in backend 2025-02-28 01:51:53 +05:30
egelhaus
6f337ad024
Merge pull request #629 from sdgsnehal/bugfix/instagram_video_limit
increase maximum video length for instagram to1 80
2025-02-27 07:11:03 +01:00
snehal gaurkhede
6b56b16a2f fix(instagram.collaborators.tsx): increase maximum video length for Instagram reel to 180 seconds to align with platform requirements 2025-02-27 09:28:29 +05:30
egelhaus
0bcadbe7f9
Merge pull request #625 from sdgsnehal/bugfix/telegram_textcut
refactor(telegram.provider.tsx): increase the maximum message length
2025-02-26 12:30:39 +01:00
snehal gaurkhede
3a7f28af5b refactor(telegram.provider.tsx): increase the maximum message length from 500 to 4096 characters for better message handling 2025-02-26 10:25:44 +05:30
egelhaus
64d2fddd24
docker-compose.dev.yaml aktualisieren 2025-02-19 08:48:07 +01:00
Nevo David
98f6662c5f feat: linkedin fix
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-02-17 18:18:39 +02:00
Nevo David
c8d93aed88 Merge remote-tracking branch 'origin/main' 2025-02-14 16:41:53 +07:00
Nevo David
76d3826a65 feat: change cron to every 2025-02-14 16:41:42 +07:00
Nevo David
ac4c9900cc
Merge pull request #614 from gitroomhq/feat/auto-post
Add auto-posting from RSS
2025-02-14 16:39:15 +07:00
Nevo David
4a787cc041 fix: package json 2025-02-14 09:37:07 +00:00
Nevo David
1837599ef9 feat: auto posts 2025-02-14 16:25:41 +07:00
Nevo David
b4a8a1332d
Merge pull request #611 from gitroomhq/feat/signature
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Add signatures
2025-02-12 21:39:06 +07:00
Nevo David
46d3943596 feat: signatures 2025-02-12 21:36:41 +07:00
Nevo David
ed93eab7c8
Merge pull request #603 from gitroomhq/feat/repeated-post
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Add a repeated post
2025-02-11 23:34:38 +07:00
Nevo David
83c7f75621 feat: repeated posts 2025-02-11 23:32:14 +07:00
egelhaus
d51e5607cb
.env.example aktualisieren 2025-02-10 12:41:29 +01:00
Nevo David
703f6c7563
Merge pull request #602 from gitroomhq/feat/tags
Option to tag posts
2025-02-09 23:06:24 +07:00
Nevo David
5b6522218f feat: added option to tag posts 2025-02-09 23:03:55 +07:00
Nevo David
092ea21f1c feat: remove torus 2025-02-08 21:08:35 +00:00
Nevo David
4d2bfbb910 feat: remove torus 2025-02-09 03:53:11 +07:00
Nevo David
6b314321e6 feat: libusb 2025-02-09 03:28:21 +07:00
Nevo David
5c89307444 feat: test 2025-02-09 03:24:42 +07:00
Nevo David
49e4f32ace feat: nix fix
gi
2025-02-09 03:20:44 +07:00
Nevo David
2b3348c40a Feat: no ... dots 2025-02-09 03:17:32 +07:00
Nevo David
917514489d feat: merge 2025-02-09 03:16:36 +07:00
Nevo David
d98e6b9e74 feat: merge 2025-02-09 03:14:22 +07:00
Nevo David
49af9c60f0 feat: remove trezor 2025-02-09 02:50:17 +07:00
Nevo David
07a52b5bee feat: toml test 2025-02-09 02:30:21 +07:00
Nevo David
09eadd6139 feat: attempt fix 2025-02-08 19:25:32 +00:00
Nevo David
3fc5a804d1 feat: package.json attempt fix 2025-02-08 19:07:20 +00:00
Nevo David
2c9427ea52 feat: package.json attempt fix 2025-02-08 19:05:55 +00:00
Nevo David
eeaee957bd feat: package json fix 2025-02-08 18:31:55 +00:00
Nevo David
e2ec1ecd3e Merge branch 'feat/wallet-login' 2025-02-08 18:09:02 +00:00
Nevo David
420b37ba9c feat: package json fix 2025-02-08 18:08:39 +00:00
Nevo David
3ac25819d5
Merge pull request #599 from gitroomhq/feat/wallet-login
Wallet login
2025-02-09 01:05:28 +07:00
Nevo David
27bd6a8c64 feat: fix package json 2025-02-08 18:04:44 +00:00
Nevo David
cc7a07f162 feat: login with a wallet 2025-02-09 00:54:51 +07:00
Nevo David
43910d8370
Merge pull request #594 from gitroomhq/feat/instagram-analytics-fix
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Instagram analytics fix
2025-02-07 18:33:35 +07:00
Nevo David
379704c997 feat: fix 2025-02-07 18:33:12 +07:00
Nevo David
d51196c536 feat: settings 2025-02-06 23:29:38 +07:00
Nevo David
d7764faf15 feat: send tests 2025-02-06 23:15:50 +07:00
Nevo David
d57448629d
Merge pull request #591 from gitroomhq/feat/webhook
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Webhook
2025-02-06 21:17:00 +07:00
Nevo David
fc11d8c14a feat: webhook 2025-02-06 21:16:03 +07:00
egelhaus
16dd349eb7
Delete .vscode out of Reposotory 2025-02-06 14:52:01 +01:00
Nevo David
dc3296a51e
Merge pull request #590 from gitroomhq/feat/digest
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Digest Notifications
2025-02-06 13:55:43 +07:00
Nevo David
6716360b5a feat: digest notifications, to remove email spam 2025-02-06 13:55:00 +07:00
Nevo David
136f20b7ed feat: disable bluesky videos, add mastodon character validation 2025-02-06 12:46:04 +07:00
Nevo David
807f7078f3 feat: cant enable channels on self-hosted mode 2025-02-06 12:22:18 +07:00
Nevo David
cffd7e663f
Merge pull request #573 from keiwanmosaddegh/main
feat(tiktok): add content posting method alternatives (direct post vs upload)
2025-02-06 11:52:55 +07:00
Nevo David
49204bfdef
Merge pull request #495 from ArafatHossain403/fix/user-reg-input-unhandled-error
Added max length validation in user registration, company name and password which solve unhandled error in backend
2025-02-06 11:50:17 +07:00
Nevo David
4e322667ba
Merge pull request #588 from TonyAntoun/patch-1
Updated Telegram Provider
2025-02-06 11:45:13 +07:00
egelhaus
5ef1177d1b
Merge branch 'main' into patch-1 2025-02-05 23:53:50 +01:00
Zerocool
a1417a3858
Update telegram.provider.ts
Added the code to delete the user /connect message - IF THE BOT IS ADMIN
Added code to check the member status of the bot
2025-02-06 00:40:43 +02:00
Nevo David
22b148c099
Merge pull request #564 from ak7550/feat/add-short.io
feat: #544-Add short.io as a shortening link
2025-02-05 23:41:42 +07:00
Nevo David
7a54b47b28 Merge remote-tracking branch 'origin/main' 2025-02-05 23:34:51 +07:00
Nevo David
fa0c422a55 feat: subscription 2025-02-05 23:34:34 +07:00
Zerocool
57e3d4ddb7
Update telegram.provider.ts
- Updated the logic in 'authenticate' to handle both public and private Telegram groups/channels.
- Updated the logic in 'getBotId' to handle both public and private Telegram groups/channels.
- Updated the logic in 'post' to apply sending local files, include contentType, media handling (captions/groups), link generation (to fix undefined links)
2025-02-05 03:06:25 +02:00
egelhaus
13585a1472
.gitignore aktualisieren 2025-02-04 19:34:51 +01:00
Nevo David
8e0efe1724 feat: lifetime check fix 2025-02-04 23:56:43 +07:00
Nevo David
2a542657a0 feat: remove lifetime check 2025-02-04 23:47:40 +07:00
Nevo David
1ffcb5c545 feat: fix billing 2025-02-04 23:16:22 +07:00
Nevo David
296f3f15af Merge remote-tracking branch 'origin/main' 2025-02-03 13:33:07 +07:00
Nevo David
07e7b4b530 feat: prevent lifetime account, disabled 2025-02-03 13:32:57 +07:00
Keiwan Mosaddegh
2e752123b8 chore: add enclosing backticks 2025-02-02 18:50:02 +01:00
egelhaus
e888dc58c5
Merge branch 'main' into main 2025-01-31 23:42:06 +01:00
egelhaus
052fed90ca
Merge branch 'main' into feat/add-short.io 2025-01-30 23:37:29 +01:00
egelhaus
02e38ab0ea
Merge pull request #585 from whallin/feature/discord-announcement 2025-01-30 23:30:26 +01:00
William Hallin
d4d467276f
feat: allow GUILD_ANNOUNCEMENT for Discord
Allow the Discord provider to post in "GUILD_ANNOUNCEMENT" text channels, also known as announcement channels
2025-01-30 22:15:35 +01:00
Enno Gelhaus
3efdaf6243 Change .env.example to an simpler Version. 2025-01-30 21:28:57 +01:00
egelhaus
97e1581f19
Merge pull request #575 from egelhaus/main
Update .env.example
2025-01-30 21:01:20 +01:00
egelhaus
bf935652df
Update SECURITY.md
Remove jonathan-irvin (Former Maintainer)
2025-01-30 20:41:24 +01:00
egelhaus
278e7f8181
Update SECURITY.md
Remove jread from SECURITY.md (lost Maintainer Aceess), add egelhaus to SECURITY.md (got Maintainer Aceess)
2025-01-30 20:35:45 +01:00
Nevo David
92d09b5660 feat: update custom instance 2025-01-29 18:01:44 +07:00
Nevo David
3b1047b765 feat: fix reconnect channels 2025-01-29 17:14:26 +07:00
Nevo David
1c14497855 feat: require bluesky refresh 2025-01-29 00:55:20 +07:00
Nevo David
77bb2b2c71 feat: bluesky refresh + allow for any username 2025-01-29 00:49:54 +07:00
egelhaus
f42da2e42d
Merge branch 'main' into main 2025-01-26 21:17:52 +01:00
Nevo David
7951f46b5c
Merge pull request #578 from gitroomhq/feat/nostr
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Nostr provider
2025-01-25 22:37:15 +07:00
Nevo David
b048dbd60d feat: fix package json 2025-01-25 15:36:07 +00:00
Nevo David
a02806fadb feat: nostr 2025-01-25 22:29:15 +07:00
egelhaus
00691685d9
Add new ENV to .env.example 2025-01-24 15:00:02 +01:00
Nevo David
8b9f060188
Merge pull request #574 from gitroomhq/feat/no-secured
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Not secured
2025-01-24 13:46:04 +07:00
Nevo David
6ba1ab9102 feat: not secured 2025-01-24 13:44:26 +07:00
Keiwan Mosaddegh
29dfd55409 fix(tiktok): fix typo 2025-01-23 11:11:15 +01:00
Keiwan Mosaddegh
a122488b47 fix(tiktok): disable settings based on posting method 2025-01-23 11:10:49 +01:00
Keiwan Mosaddegh
1df0b98de7 fix(tiktok): add explanation about example use case for upload method 2025-01-23 10:46:23 +01:00
Keiwan Mosaddegh
aa3ffac193 fix(tiktok): extract endopoint method outside of post() 2025-01-23 10:29:50 +01:00
Keiwan Mosaddegh
81eacbe6d5 feat(tiktok): update conetnt posting method based on setting 2025-01-23 10:09:35 +01:00
Keiwan Mosaddegh
912895b6c7 feat(tiktok): add content posting method alternative to settings 2025-01-23 09:52:12 +01:00
Keiwan Mosaddegh
13b26030b4 feat(tiktok): add content posting method to tiktok dto 2025-01-23 09:49:08 +01:00
Nevo David
fc60ed41aa
Merge pull request #569 from gitroomhq/feat/register-once
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Register once
2025-01-22 15:46:31 +07:00
Nevo David
abc0d1269c feat: register once 2025-01-22 15:45:58 +07:00
Nevo David
9c648fe1ba feat: fix telegram 2025-01-20 23:47:25 +07:00
Nevo David
e722979497 Feat: package-lock fix
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-01-20 13:32:03 +00:00
Nevo David
5e0c161e22
Merge pull request #568 from gitroomhq/feat/telegram
Added telegram
2025-01-20 20:25:05 +07:00
Nevo David
4009c89457 feat: changes 2025-01-20 13:24:19 +00:00
Nevo David
0dde88243b feat: telegram channel 2025-01-20 20:09:19 +07:00
Aniket Kumar Ghosh
4d9ef69476 code implementation complete. 2025-01-19 16:54:10 +05:30
Nevo David
339416f80f feat: better login 2025-01-19 16:44:54 +07:00
Nevo David
241c41cb69
Merge pull request #563 from gitroomhq/feat/farcaster-login
Farcaster login
2025-01-19 16:33:15 +07:00
Nevo David
c9091dba3c feat: farcaster login 2025-01-19 16:32:23 +07:00
Aniket Kumar Ghosh
9c10d0f1a6 short.io integration is in progress. 2025-01-19 14:57:13 +05:30
Nevo David
0d683b3c0d feat: requestChecksumCalculation WHEN_REQUIRED
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-01-19 01:42:18 +07:00
Nevo David
d2f5546d35 feat: fix 2025-01-18 18:36:31 +00:00
Nevo David
96ecc588c6 feat: package json change 2025-01-19 01:33:45 +07:00
Nevo David
40f4012251 feat: fix with middleware 2025-01-19 01:25:52 +07:00
Nevo David
ba89e585a4 feat: middleware 2025-01-19 01:24:36 +07:00
Nevo David
1611f00254
Merge pull request #562 from gitroomhq/feat/farcaster
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Added warpcast
2025-01-18 22:23:56 +07:00
Nevo David
4fb674a814 feat: fix package json 2025-01-18 15:22:50 +00:00
Nevo David
2d51adb7bb feat: spelling 2025-01-18 22:22:22 +07:00
Nevo David
1505143112 feat: farcaster 2025-01-18 22:14:43 +07:00
Nevo David
2b8e0bc2d8
Update README.md 2025-01-17 21:03:19 +07:00
Nevo David
230e8fff35
Update README.md 2025-01-15 02:47:43 +07:00
Nevo David
7a45fc35dc feat: fix payment status 2025-01-14 21:45:18 +07:00
Nevo David
8f3ad32a3c Merge remote-tracking branch 'origin/main' 2025-01-14 21:41:31 +07:00
Nevo David
f3579cfcaf feat: nowpayments 2025-01-14 21:41:14 +07:00
Nevo David
39cf292cb3
Update README.md 2025-01-14 14:11:42 +07:00
Nevo David
404793df77
Update README.md 2025-01-14 13:39:07 +07:00
Nevo David
5be9d276a3
Update README.md 2025-01-13 05:12:12 +07:00
Nevo David
d2ba24890e
Merge pull request #543 from gitroomhq/feat/short-linking
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Added shortlinking option
2025-01-12 15:53:32 +07:00
Nevo David
772ff4ca74 feat: short linking support 2025-01-12 15:52:30 +07:00
James Read
9f6a211206
Merge pull request #531 from mbi001/main
Update all.two.level.subdomain.ts
2025-01-09 22:42:05 +00:00
James Read
71c01117c3
Remove duplicate 2025-01-09 22:41:42 +00:00
James Read
dc17fd2b6f
Merge branch 'main' into main 2025-01-09 22:40:44 +00:00
James Read
580e41a8fc
Merge pull request #532 from funnymomo/main
.com.de support added to all.two.level.subdomain.ts
2025-01-09 22:39:16 +00:00
mbi001
e10c43a349
Update all.two.level.subdomain.ts
Corrected .tplinkdns.com
2025-01-07 15:50:30 -06:00
mbi001
ef5a18de29
Update all.two.level.subdomain.ts
Added tplinkdns.com to authorized sub domain names
2025-01-07 15:46:49 -06:00
mbi001
6433115977
Merge branch 'main' into main 2025-01-07 15:43:13 -06:00
Nevo David
853438c3c3 feat: fix arrow colors in light mode 2025-01-08 01:14:32 +07:00
Nevo David
0de53d2f10 feat: minor ux fixes 2025-01-08 01:11:02 +07:00
mbi001
c2b08a7779
Update all.two.level.subdomain.ts
Added.synology.me
2025-01-07 10:22:12 -06:00
Nevo David
ba84a67095 feat: delete post 2025-01-07 17:05:27 +07:00
Nevo David
a801b59610 feat: return post list + delete post for public api 2025-01-07 17:01:58 +07:00
Nevo David
1969226022 feat: fix images have no path 2025-01-07 16:46:35 +07:00
Desktop
209e35e2f4
.com.de support added to all.two.level.subdomain.ts 2025-01-06 14:18:45 -08:00
mbi001
7a6e7a3b74
Update all.two.level.subdomain.ts
added .ddns.net and .com.de
2025-01-06 14:34:19 -06:00
Nevo David
b13a862b65 feat: fix internal plugs with empty 2025-01-07 01:35:46 +07:00
Nevo David
95864a8af7 feat: fix 2025-01-07 00:36:14 +07:00
Nevo David
c70378d8ae Merge remote-tracking branch 'origin/main' 2025-01-07 00:36:06 +07:00
Nevo David
5899bb0a12 feat: no global edit 2025-01-07 00:26:31 +07:00
James Read
82bef1f7ac
Merge pull request #525 from ChandraShekharAgrawal/documentation/typo-contributing
fixed typo in developers guide section
2025-01-06 16:09:29 +00:00
James Read
50efdbef91
Merge pull request #530 from gitroomhq/feature-containers-semver
bugfix: #517 - Switch to semver (tags) for container versions
2025-01-06 16:04:37 +00:00
jamesread
c3879a784f bugfix: Issue with devcontainer naming inconsistency with new semver containers 2025-01-06 15:54:29 +00:00
jamesread
c069b5e3bd bugfix: #517 - Switch to semver (tags) for container versions 2025-01-06 15:49:26 +00:00
Nevo David
7e1925f302 Merge remote-tracking branch 'origin/main' 2025-01-06 20:38:44 +07:00
Nevo David
b2769eed2f feat: add retry on random failure 2025-01-06 20:38:28 +07:00
Nevo David
ed684fa929
Update LICENSE to AGPL3
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-01-06 14:08:54 +07:00
Nevo David
0ac7d52799 feat: minor fixes 2025-01-06 12:08:15 +07:00
Nevo David
42f1f07412 feat: circle above 2025-01-06 02:33:01 +07:00
Nevo David
a4a40f3cdc Merge branch 'feat/media-upload'
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-01-06 02:18:40 +07:00
Nevo David
ce0cea40fe feat: media component 2025-01-06 02:18:15 +07:00
Nevo David
12d60bb38a
Merge pull request #526 from gitroomhq/feat/media-upload
Better media uploader
2025-01-06 02:09:13 +07:00
Nevo David
3bf4c1bc2a feat: media uploader 2025-01-06 02:08:32 +07:00
ChandraShekharAgrawal
788b9b522d fixed typo in developers guide section 2025-01-05 22:07:39 +05:30
Nevo David
f4a4d8a209 feat: unlimited credits for the open-source
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-01-05 20:25:48 +07:00
Nevo David
e87089d710 feat: fix open-source to generate images
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-01-05 19:48:52 +07:00
Nevo David
5fb59190f6 feat: fix duplicate 2025-01-05 19:36:15 +07:00
Nevo David
4ad975d484 Merge remote-tracking branch 'origin/main' 2025-01-05 19:06:29 +07:00
Nevo David
24ceb00892 feat: no instagram collaborators 2025-01-05 19:06:17 +07:00
Nevo David
bf77ab71db
Merge pull request #522 from gitroomhq/feat/instagram-standalone
Add instagram as a standalone without a business
2025-01-05 18:59:39 +07:00
Nevo David
b8951abd91 feat: instagram standalone option 2025-01-05 18:58:43 +07:00
Nevo David
5657b21c31
Merge pull request #509 from manishsencha/patch-1
feat: Fix typo
2025-01-04 16:50:02 +07:00
Nevo David
8297dc76b4 feat: validate if 2025-01-04 16:03:58 +07:00
Nevo David
30c7ae7dc5 feat: bluesky resize image 2025-01-03 23:49:27 +07:00
Manish Sencha
54fba79340
Merge branch 'main' into patch-1 2025-01-03 16:16:33 +05:30
Nevo David
92b8feb093 Merge remote-tracking branch 'origin/main'
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-01-03 17:36:20 +07:00
Nevo David
24f7e3d653 feat: community instead of subreddit 2025-01-03 17:35:57 +07:00
Nevo David
abd2fba4bd
Merge pull request #511 from gitroomhq/feat/lemmy
lemmy provider
2025-01-03 17:34:14 +07:00
Nevo David
a2b6341cfd feat: lemmy 2025-01-03 17:33:28 +07:00
Nevo David
7bb6c4602d feat: customer filter
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-01-03 13:57:09 +07:00
Manish Sencha
b7785e441b
Merge branch 'main' into patch-1 2025-01-02 17:14:40 +05:30
Nevo David
8b6f65ed4b Merge remote-tracking branch 'origin/main' 2025-01-02 18:15:39 +07:00
Nevo David
f3dd984b92 feat: minor fixes 2025-01-02 18:15:22 +07:00
Manish Sencha
d1a1013172
feat: Fix typo 2025-01-02 13:01:07 +05:30
James Read
327297d3ee
Merge pull request #502 from orarbel/patch-1
Fix typo
2025-01-02 01:12:14 +00:00
Nevo David
afc8f194ed feat: show more and less
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-01-01 22:02:33 +07:00
Nevo David
0a6b7c34d8 feat: remove object cover
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2025-01-01 16:25:05 +07:00
Nevo David
868a5c2c2b feat: contain 2025-01-01 16:22:15 +07:00
Nevo David
62da0cd98e feat: comments, preview, duplicate 2025-01-01 16:13:13 +07:00
Nevo David
357c942f9f feat: interval 2025-01-01 01:54:01 +07:00
Nevo David
d5c2fe6348 feat: cancellation 2024-12-31 15:48:58 +07:00
Nevo David
3c7c225dbe feat: subreddit
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-30 19:43:44 +07:00
Nevo David
7d4351adea feat: ai image 2024-12-30 19:38:27 +07:00
Or Arbel
42c34cc23b
Fix typo 2024-12-30 14:32:59 +02:00
Nevo David
90b7d214eb feat: continue provider fix
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-30 16:42:39 +07:00
Nevo David
653f787b72 feat: long tweet for X + add additional settings per provider 2024-12-30 16:39:09 +07:00
Nevo David
4806b82c20 feat: fix linkedin connect for multiple accounts
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-30 13:43:36 +07:00
Nevo David
1a3b52ac34 feat: save post as draft requires no params 2024-12-30 12:53:45 +07:00
Nevo David
16e41794aa feat: linkedin repost 2024-12-28 16:13:03 +07:00
Nevo David
c23061d793 fix: errors
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-28 15:01:24 +07:00
Nevo David
b1223e007f Merge remote-tracking branch 'origin/main' 2024-12-28 12:02:32 +07:00
Nevo David
416a8b2bf1 feat: high ordeR 2024-12-28 12:02:05 +07:00
Nevo David
e6f194474d
Merge pull request #500 from gitroomhq/feat/internal-plugs
Internal plugs
2024-12-28 11:56:56 +07:00
Nevo David
3b270559ba feat: internal plugs 2024-12-28 11:56:21 +07:00
Nevo David
041b076df6 feat: bold and underline 2024-12-27 19:05:35 +07:00
Nevo David
1bfa6de275 Merge remote-tracking branch 'origin/main' 2024-12-27 18:54:23 +07:00
Nevo David
b939d00d46 feat: bold and underline 2024-12-27 18:54:06 +07:00
Nevo David
8d94a03b6a feat: emojies
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-27 10:57:04 +00:00
Nevo David
4079a42f09 feat: emojies 2024-12-27 17:50:03 +07:00
Nevo David
528383a71d fix: copilotkit click ask to close popup 2024-12-27 16:01:57 +07:00
Nevo David
0daa163151 fix: selected customers 2024-12-27 15:48:30 +07:00
Nevo David
bdc96e17a7 Merge remote-tracking branch 'origin/main' 2024-12-27 15:44:59 +07:00
Nevo David
fcf9a85be0 feat: fix scrollbar 2024-12-27 15:44:39 +07:00
Nevo David
7564a6670a feat: upload pictures on paste + upload on drag and drop
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-27 06:53:22 +00:00
Nevo David
637c5f9cd5 feat: drag and drop pictures 2024-12-27 13:47:15 +07:00
Nevo David
da63609101 feat: nicer email 2024-12-26 23:53:14 +07:00
Nevo David
283a6a8ac1 feat: better quality
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-26 22:34:39 +07:00
Nevo David
8ecd19ee3a Merge remote-tracking branch 'origin/main' 2024-12-26 22:19:52 +07:00
Nevo David
4661c1dfe9 feat: full preview 2024-12-26 22:19:36 +07:00
Nevo David
e7c5a8b6e1 feat: fix nextjs 2024-12-26 15:13:20 +00:00
Nevo David
b158da2505 feat: package lock fix 2024-12-26 15:12:24 +00:00
Nevo David
ef885eaa45 feat: many fixes 2024-12-26 22:06:29 +07:00
Nevo David
6853c5b1e1 feat: add or edit modal fixes 2024-12-26 20:27:37 +07:00
Nevo David
9567c4ab25 feat: minor changes
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-26 18:55:51 +07:00
Nevo David
3aa86d1cb3 feat: prevent flowing out of popup 2024-12-26 17:05:06 +07:00
Nevo David
1f8940a7c4 feat: no openai key
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-26 15:34:24 +07:00
Nevo David
9a3d5c5580 Merge remote-tracking branch 'origin/main'
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-26 13:57:37 +07:00
Nevo David
74c442dda1 feat: fix for tavily not defined 2024-12-26 13:57:22 +07:00
Nevo David
9dbff58d66 feat: fix package json
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-25 10:59:39 +00:00
Nevo David
a0054ac2de feat: agents 2024-12-25 17:52:10 +07:00
ArafatHossain403
7e0603776f user registration company name and password max length set for unhandled error in backend 2024-12-21 23:53:52 +06:00
Nevo David
e0d4661e87 feat: replace 2024-12-20 22:34:56 +07:00
Nevo David
657c814889 feat: fix text replacement 2024-12-20 17:36:20 +07:00
Nevo David
1a2937b518 feat: connect channel 2024-12-20 12:00:37 +07:00
Nevo David
7ca48dfc43 feat: refresh for analytics 2024-12-20 11:54:08 +07:00
Nevo David
d7c7adea4f feat: always request all features 2024-12-18 20:09:21 +07:00
Nevo David
dc5cf48518 feat: if refresh throws and error, force a person to refresh 2024-12-18 19:08:49 +07:00
Nevo David
6875bf51e6 feat: refresh fix 2024-12-18 18:48:38 +07:00
Nevo David
4eb1a87e53 feat: fix dragging 2024-12-18 18:12:17 +07:00
Nevo David
396a55f36f feat: preview 2024-12-18 18:08:18 +07:00
Nevo David
9c6474a7b9 feat: z-index 2024-12-18 00:55:26 +07:00
Nevo David
4558d2f916 feat: trial information 2024-12-18 00:31:45 +07:00
Nevo David
f5164624e0 feat: insufficant funds 2024-12-18 00:26:18 +07:00
Nevo David
72c8a4475c Feat: insufficant funds 2024-12-18 00:23:59 +07:00
Nevo David
3e00e15e35 feat: hold money 2024-12-18 00:09:50 +07:00
Nevo David
5acdd88e53 feat: remove first step 2024-12-17 20:04:08 +07:00
Nevo David
60b70ead52 feat: better check for pixel 2024-12-16 16:05:04 +07:00
Nevo David
c3fa9826a1 feat: ip and agent 2024-12-16 15:56:42 +07:00
Nevo David
21e168951c feat: unique id 2024-12-16 15:36:37 +07:00
Nevo David
39538b5f95 feat: track to variables 2024-12-16 15:06:02 +07:00
Nevo David
72523ed2c1 feat: responsive 2024-12-16 14:35:29 +07:00
Nevo David
12022a9d85 feat: main change 2024-12-16 00:19:18 +07:00
Nevo David
b18a033191 feat: fix 2024-12-15 17:17:09 +00:00
Nevo David
2d0c47d46e feat: fbp + fclib 2024-12-16 00:09:55 +07:00
Nevo David
287f4040b4 feat: preview 2024-12-15 13:17:10 +07:00
Nevo David
3d185ad688 feat: change linkedin chars limit 2024-12-14 20:03:30 +07:00
Nevo David
72a2b7767b feat: public api 2024-12-14 19:30:46 +07:00
Nevo David
0e14eb9a03 feat: fix nextjs
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-14 11:52:30 +00:00
Nevo David
d1cc3991b9 feat: fix 2024-12-14 11:46:53 +00:00
Nevo David
d81713eeed feat: fix package json 2024-12-14 11:42:42 +00:00
Nevo David
4b10bfaaa7 feat: package json 2024-12-14 11:16:00 +00:00
Nevo David
1c877d2af2
Merge pull request #490 from gitroomhq/feat/public-api
Public API
2024-12-14 17:31:34 +07:00
Nevo David
92fa8f900a feat: public api 2024-12-14 17:30:48 +07:00
Nevo David
b34a77c48c feat: higher limit 2024-12-14 17:03:29 +07:00
Nevo David
6fc237f44f feat: public api 2024-12-14 16:59:18 +07:00
Nevo David
87892ed815 feat: fix onboarding 2024-12-14 12:12:51 +07:00
Nevo David
ad90d8d146 feat: lemmy 2024-12-13 00:17:40 +07:00
Nevo David
763e0cdf11 feat: prevent crash of manual username and password 2024-12-12 23:41:04 +07:00
Nevo David
4d926edb73 feat: urgent fix for instagram 2024-12-11 13:56:02 +07:00
Nevo David
8966bf9593
Merge pull request #481 from gitroomhq/feat/linkedin-weird-behaviour
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Weird behavior with LinkedIn not posting PNG even though it uploads them
2024-12-09 22:33:33 +07:00
Nevo David
c9e8914377 feat: fix 2024-12-09 22:32:43 +07:00
Nevo David
b17727bccc
Merge pull request #479 from gitroomhq/feat/plugs
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Plugs
2024-12-09 16:43:56 +07:00
Nevo David
f8703e0199 feat: finalized plugs 2024-12-09 16:42:00 +07:00
Nevo David
d826a3b155 Merge remote-tracking branch 'origin/main' 2024-12-09 13:35:15 +07:00
Nevo David
4a602dd77f feat: cancel stripe subscription 2024-12-09 13:34:58 +07:00
Nevo David
7ca7a14294 feat: plugs 2024-12-09 13:25:05 +07:00
James Read
f8486e61a5
Merge pull request #474 from divyaswormakai/feat-autofill-name
feat: autofill name based on username or let it be random string
2024-12-08 22:35:27 +00:00
Nevo David
d07ed2b1da Merge remote-tracking branch 'origin/main' 2024-12-08 19:27:34 +07:00
Nevo David
cd3f7cf8a1 feat: change favicon 2024-12-08 19:27:23 +07:00
Nevo David
77c79f959f
Merge pull request #478 from gitroomhq/feat/linkedin
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Tag companies on LinkedIn
2024-12-08 18:54:39 +07:00
Nevo David
be75123a04 feat: tag companies 2024-12-08 18:53:43 +07:00
Nevo David
a9630b6ebe
Merge pull request #476 from gitroomhq/feat/customer
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Add customers seperation
2024-12-07 22:58:39 +07:00
Nevo David
ddc0aa04cd feat: customers seperation 2024-12-07 22:57:45 +07:00
Divyaswor Makai
515ff8afbb update: update code wrt rabbit ai 2024-12-07 15:14:09 +05:45
Divyaswor Makai
93d382f25f feat: autofill name based on username or let it be empty 2024-12-07 14:57:08 +05:45
Nevo David
b2632995d6
Update README.md 2024-12-06 01:41:38 +07:00
Nevo David
f5a5170c7f feat: affiliate 2024-12-05 21:23:33 +07:00
Nevo David
65e3bf0852 feat: tolt affiliate 2024-12-05 20:45:23 +07:00
Nevo David
573de24e9c feat: reddit channel fix 2024-12-05 16:09:56 +07:00
Nevo David
0d0d141cc5 feat: linkedin special chars 2024-12-05 16:02:27 +07:00
Nevo David
3e39d4652c feat: linkedin post fix and comment
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-12-04 22:18:45 +07:00
Nevo David
70eebd532c
Merge pull request #468 from gitroomhq/feat/instagram
instagram stories, add collaborators, infrastructure for settings in validation
2024-12-04 19:37:08 +07:00
Nevo David
f9f5e6d486 feat: instagram stories, add collaborators, infrastructure for settings in validation 2024-12-04 19:27:43 +07:00
Nevo David
69541c9eec Merge remote-tracking branch 'origin/main' into feat/instagram 2024-12-04 13:40:31 +07:00
jamesread
31ba8a7915 Updated issue template for installation problems 2024-12-02 22:03:40 +00:00
Nevo David
b737f1b144
Merge pull request #461 from Aspireve/feature/american-dates
[FEAT] change dates to the American people #156
2024-12-02 19:16:48 +07:00
Aspireve
e66557cc6a [FEAT] change dates to the American people #156 2024-12-02 17:33:45 +05:30
James Read
ce36b87c6f
Merge pull request #456 from gitroomhq/bugfix-button-secondary
bugfix: Component property needs braces
2024-11-30 21:48:16 +00:00
jamesread
068213a242 bugfix: Component property needs braces 2024-11-30 21:18:09 +00:00
James Read
21d5b01f47
Merge pull request #429 from gitroomhq/bugfix-settings-teams-remove-light-theme
bugfix: The teams component, remove button, was not visible in light mode
2024-11-29 23:37:13 +00:00
Nevo David
e3bd1df158 feat: if there is a rate limit, wait two seconds and try again 2024-11-27 17:09:47 +07:00
Nevo David
e4ac191aad Merge remote-tracking branch 'origin/main' 2024-11-24 15:56:19 +07:00
Nevo David
3471a6524d feat: fix invite team 2024-11-24 15:56:04 +07:00
James Read
f7420eaf44
Fix lint error 2024-11-22 18:32:16 -05:00
James Read
b99069446b
Merge pull request #430 from honzapatCZ/patch-1
Rename old TWITTER_CLIENT_ID(and SECRET) to new X_CLIENT_ID naming convention
2024-11-22 17:29:51 -06:00
Nevo David
aa59e6179c Merge remote-tracking branch 'origin/main' 2024-11-22 20:18:25 +07:00
Nevo David
7ddfb8bc6b feat: fix youtube title 2024-11-22 20:17:26 +07:00
Nevo David
21eae29b52
Update README.md 2024-11-20 17:08:20 +07:00
Nevo David
bcc2a2308a feat: old package json
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-11-20 11:47:32 +07:00
Nevo David
33ae1d9c51
Merge pull request #441 from gitroomhq/fix/analytics
Fix analytics to be end of day
2024-11-20 11:44:46 +07:00
Nevo David
fbaa9d42ee feat: fix analytics to be end of day in unix 2024-11-20 11:43:57 +07:00
Nevo David
f52dc7819f
Merge pull request #440 from brody192/sync-package-lock
sync package lock
2024-11-20 11:16:43 +07:00
Brody Over
c3f13662b2 sync package lock 2024-11-19 23:10:41 -05:00
Nevo David
79d3dec847 feat: nixpacks 2024-11-20 00:29:26 +07:00
Nevo David
4932dabefa feat: no npmrc 2024-11-20 00:24:51 +07:00
Nevo David
b643c92bd9 feat: typescript strict version 2024-11-20 00:21:18 +07:00
Nevo David
8c58ac4614 feat: update package json 2024-11-20 00:08:29 +07:00
Nevo David
8453055997 feat: add typescript 2024-11-19 23:54:54 +07:00
Nevo David
87405067ad feat: refresh token 2024-11-19 23:38:13 +07:00
Nevo David
c29da7230a feat: lagacy 2024-11-19 21:39:09 +07:00
Nevo David
d927440acf feat: downgrade google-auth-api 2024-11-19 21:34:45 +07:00
Nevo David
39806b8141 feat: update copilotkit 2024-11-19 21:29:39 +07:00
Nevo David
fecd48df83 feat: fix package json 2024-11-19 21:14:54 +07:00
Nevo David
65c97ae1e0 feat: fix highlighing 2024-11-19 18:40:13 +07:00
Nevo David
f10bdbccea Merge remote-tracking branch 'origin/main' 2024-11-19 17:50:39 +07:00
Nevo David
37a2670511 feat: X post length 2024-11-19 17:49:42 +07:00
Nevo David
d7ba9e6ce7
Update README.md 2024-11-19 13:31:29 +07:00
Nevo David
ec2b5c5143 Merge remote-tracking branch 'origin/main' 2024-11-19 12:57:09 +07:00
Nevo David
b8b316f6aa feat: no picture 2024-11-19 12:56:52 +07:00
Honzapat_CZ
2450bd47d9
Backwards compatibility 2024-11-18 14:54:44 +01:00
Nevo David
56ec5bb6e0 feat: instagram changes 2024-11-17 17:24:39 +07:00
Nevo David
cdc38419a2
Merge pull request #433 from gitroomhq/fix/avatar
avatar fix
2024-11-16 17:26:34 +07:00
Nevo David
e047906c22 feat: no avatar fix 2024-11-16 17:23:19 +07:00
Nevo David
f02c2b063e
Update README.md 2024-11-15 02:20:55 +07:00
Nevo David
313f1f3950
Merge pull request #431 from gitroomhq/feat/fix-upload
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
fix upload
2024-11-13 17:37:26 +07:00
Nevo David
cc27280699 feat: fix uploading 2024-11-13 17:36:27 +07:00
Honzapat_CZ
3f640a680c
Rename old TWITTER_CLIENT_ID to new X_CLIENT_ID 2024-11-12 19:18:40 +01:00
jamesread
92e6256311 bugfix: The teams component, remove button, was not visible in light mode 2024-11-12 14:56:24 +00:00
Nevo David
35a9b1c4cf feat: tiktok access token fix 2024-11-12 11:51:53 +07:00
Nevo David
d4300a17ac feat: installation problem 2024-11-08 23:56:33 +07:00
Nevo David
bd50373ebf feat: installation 2024-11-08 23:55:24 +07:00
Nevo David
c132c7f96f feat: installation 2024-11-08 23:53:20 +07:00
Nevo David
457728dc05 feat: installation 2024-11-08 23:51:36 +07:00
Nevo David
f52fe86707 feat: install 2024-11-08 23:49:36 +07:00
Nevo David
cbd7ef502f feat: installation problems 2024-11-08 23:48:13 +07:00
Nevo David
942df9e5d9 feat: fix utm 2024-11-08 17:57:37 +07:00
Nevo David
a33712f108 Feat: utm fix 2024-11-08 17:48:51 +07:00
Nevo David
a01d934e4e feat: analytics 2024-11-08 17:37:50 +07:00
Nevo David
1feff46239 feat: x video duration 2024-11-07 23:55:21 +07:00
Nevo David
f5637d8948 Merge remote-tracking branch 'origin/main' 2024-11-07 23:33:20 +07:00
Nevo David
88440c231d feat: fixes 2024-11-07 23:32:25 +07:00
Nevo David
d87d83d89b feat: plugs 2024-11-07 20:04:48 +07:00
Nevo David
9ffae68f9f
Merge pull request #419 from gitroomhq/fix/linkedin
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Linkedin problems in load companies
2024-11-06 21:52:46 +07:00
Nevo David
3946d24485 Merge remote-tracking branch 'origin/main' 2024-11-06 21:51:59 +07:00
Nevo David
6927a40d21 Feat: linkedin pages 2024-11-06 21:51:38 +07:00
Nevo David
74ad1410c7 Feat: plugs 2024-11-06 21:51:12 +07:00
James Read
aec7a490a1
Merge pull request #416 from gitroomhq/feature-responsive-launches
feature: Responsive launches UI
2024-11-05 16:20:00 +00:00
James Read
0d48fcc5f0
Merge branch 'main' into feature-responsive-launches 2024-11-05 16:17:06 +00:00
James Read
b5082820d4
Merge pull request #411 from bilalmirza74/bilalmirza74/main
Fix: removed unused variables, exported name as a property of default import #381
2024-11-05 00:30:27 +00:00
jamesread
39b1a67119 feature: Responsive launches UI 2024-11-04 01:16:45 +00:00
James Read
cddd37ce86
Merge pull request #415 from gitroomhq/bugfix-config-check-ignore-cloudflare
bugfix: Ignore cloudflare in config checker, as it is no longer needed.
2024-11-03 21:29:50 +00:00
jamesread
31e78a8c1c bugfix: Ignore cloudflare in config checker, as it is no longer needed. 2024-11-03 21:21:57 +00:00
Nevo David
86d0d2490d
Merge pull request #413 from gitroomhq/feat/posthog
identification
2024-10-31 11:54:10 +07:00
Nevo David
8a4a397d0a feat: variables 2024-10-31 11:53:24 +07:00
Nevo David
458448fafb
Merge pull request #410 from gitroomhq/feat/posthog
Add posthog analytics
2024-10-30 23:00:32 +07:00
Nevo David
605c3457ff feat: fix posthog 2024-10-30 22:59:37 +07:00
Nevo David
75caac2237
Merge pull request #409 from gitroomhq/feat/posthog
Add posthog analytics
2024-10-30 22:17:05 +07:00
Nevo David
792fa7fba0 feat: posthog 2024-10-30 22:16:08 +07:00
Nevo David
d9827f7306 feat: fix agencies 2024-10-29 20:30:47 +07:00
Nevo David
383251e9b4 Merge remote-tracking branch 'origin/main'
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-10-29 12:43:39 +07:00
Nevo David
64695706c1 feat: quick fix for messageing in refresh 2024-10-29 12:43:20 +07:00
Nevo David
526b761405
Merge pull request #407 from gitroomhq/feat/refresh-v
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Refresh changes
2024-10-29 12:39:06 +07:00
Nevo David
c3e73779b7 Merge remote-tracking branch 'origin/main' 2024-10-29 12:38:02 +07:00
Nevo David
c0140614fc feat: fixed refresh vulnerabilities and menu opening 2024-10-29 12:37:44 +07:00
James Read
b09cd71576
Merge pull request #405 from gitroomhq/bugfix-bsky-300-characters
bugfix: 300 character limit in Bluesky
2024-10-29 00:21:45 +00:00
James Read
c404028291
Merge pull request #403 from gitroomhq/bug-avoid-stacktrace-no-openai
bugfix: Console warning message instead of stacktrace if OPENAI_API_KEY is not set
2024-10-28 23:43:13 +00:00
jamesread
68cae75569 bugfix: 300 character limit in Bluesky 2024-10-28 23:42:03 +00:00
James Read
8fb0729740
Merge pull request #404 from gitroomhq/bugfix-bluesky-links-and-tags
bugfix: #394 Bluesky posts now support "richtext" (URLs, tags, etc)
2024-10-28 23:36:08 +00:00
jamesread
fab0b524b7 bugfix: #394 Bluesky posts now support "richtext" (URLs, tags, etc) 2024-10-28 23:34:22 +00:00
jamesread
87e7ee2ce9 bugfix: Console warning message instead of stacktrace if OPENAI_API_KEY is not set 2024-10-28 23:20:21 +00:00
Nevo David
48634c554b
Merge pull request #401 from aryanp-86/discord_limit_fix
Increase Discord Message Character Limit for Better Compatibility
2024-10-27 16:14:54 +07:00
Aryan Pokharkar
f72b938d42
Merge branch 'gitroomhq:main' into discord_limit_fix 2024-10-27 14:24:40 +05:30
Aryan Pokharkar
35c017a26f fix: Discord character limit changed to avoid message truncation 2024-10-27 14:23:26 +05:30
Nevo David
43b434aa74 Merge remote-tracking branch 'origin/main' 2024-10-26 21:20:45 +07:00
Nevo David
98f36ec8ba feat: remove plausible 2024-10-26 21:20:26 +07:00
Nevo David
825b3a28b0
Merge pull request #399 from gitroomhq/feat/team-fix
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
fix: team invite without stripe
2024-10-25 22:44:31 +07:00
Nevo David
8fb33ab6e1 Merge remote-tracking branch 'origin/main' 2024-10-25 22:43:25 +07:00
Nevo David
5569763dc5 feat: publishable key 2024-10-25 22:43:10 +07:00
James Read
f6d386b213
Merge pull request #396 from gitroomhq/security-depbump-2024-10-24
security: Denial of service in http-proxy-middleware - https://github.com/advisories/GHSA-c7qv-q95q-8v27 [skip ci]
2024-10-24 22:08:40 +01:00
jamesread
a7eda4dbd3 security: Denial of service in http-proxy-middleware - https://github.com/advisories/GHSA-c7qv-q95q-8v27 [skip ci] 2024-10-24 22:07:05 +01:00
Nevo David
cea1596813 feat: tiktok redirect url 2024-10-24 23:59:57 +07:00
Nevo David
05a24fe020 Merge remote-tracking branch 'origin/main' 2024-10-23 14:51:09 +07:00
Nevo David
39791766cf feat: tiktok url fix 2024-10-23 14:50:56 +07:00
James Read
483e05c1dc
Merge pull request #384 from gitroomhq/security-depbump-2024-10-22
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
security: depbump 2024-10-22
2024-10-22 08:28:51 +01:00
bilalmirza74
76a83d6226 Done all 2024-10-22 05:33:46 +05:30
bilalmirza74
cc187b507d , 2024-10-22 05:25:35 +05:30
jamesread
db0a9ad576 security: depbump 2024-10-22 2024-10-22 00:14:33 +01:00
Nevo David
85df96d118
Merge pull request #373 from SvenRH/fix-coudflare-altnernate
Enable multipart uploads for all cloudflare uploads via uppy.
2024-10-20 15:48:25 +07:00
bilalmirza74
df809acb8c Fix: removed unused variables,
exported name as a property of default import
2024-10-20 10:58:11 +05:30
Nevo David
0cbf2fbd44 feat: public api 2024-10-19 23:37:54 +07:00
Nevo David
c4326f1c8a
Merge pull request #377 from gitroomhq/feat/fix-teams
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
hotfix: fixed team invite
2024-10-18 20:43:07 +07:00
Nevo David
264eb863ec feat: team fix 2024-10-18 20:39:56 +07:00
Nevo David
fbd977a21f
Merge pull request #375 from gitroomhq/feat/refresh
Some checks failed
Build Containers Enterprise / build-containers-common (push) Has been cancelled
Build Containers / build-containers-common (push) Has been cancelled
Build Containers Enterprise / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers Enterprise / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers Enterprise / build-container-manifest (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
hotfix: fix refresh mechanism
2024-10-18 18:34:57 +07:00
Nevo David
b6da5b83e3 feat: improved refresh mechanism 2024-10-18 18:34:10 +07:00
Nevo David
581953ba18 feat: oauth exception 2024-10-18 17:33:37 +07:00
Nevo David
5aae28bdbc Merge remote-tracking branch 'origin/main' 2024-10-18 00:35:07 +07:00
Nevo David
599b9ac772 feat: cancellation reason 2024-10-18 00:34:49 +07:00
Sven Herrmann
5bc1908a59 Fix compilation error. If shouldUseMultipart is set we also have to set endpoint to avoid a type error. 2024-10-17 16:01:18 +02:00
Sven Herrmann
2a9b9a539c Cleaning up 2024-10-17 15:24:15 +02:00
Sven Herrmann
77405deb35 Enable multipart uploads for all cloudflare uploads via uppy. this fixes upload errors with files < 100MB 2024-10-17 14:09:56 +02:00
Nevo David
b4976d5a30
Merge pull request #359 from bilalmirza74/main
Fix: minor UI issues
2024-10-16 13:27:13 +07:00
Nevo David
44d2111d36
Merge pull request #361 from Mujtaba500/bugfix/button-hover-cursor
Fix: Change button cursor to pointer on hover
2024-10-16 13:26:09 +07:00
Nevo David
3823bbd99d
Merge pull request #363 from Mujtaba500/bugfix/logo-height-overflow
fix: prevent logo height from overflowing into title
2024-10-16 13:25:27 +07:00
bilalmirza74
ca2ec515c5 Fix: overflow of Media Library and cursor-pointer on launches page 2024-10-14 19:46:04 +05:30
Mujtaba
09e028fc98 fix: logo height overflow causing title to be clickable 2024-10-14 19:14:40 +05:00
Mujtaba
147862b39e Fix: Change button cursor to pointer on hover 2024-10-14 15:48:31 +05:00
bilalmirza74
12f0c448a7 Fix overflow of Media Library 2024-10-13 20:23:53 +05:30
bilalmirza74
d343ba57aa Added Curser Pointer to Dark-Mode button 2024-10-13 20:22:55 +05:30
Nevo David
a91b26766a feat: enterprise docker 2024-10-13 00:58:10 +07:00
Nevo David
2076cefcc9 feat: docker dev fix 2024-10-13 00:43:13 +07:00
Nevo David
16e5c2f43b feat: try a relative parth 2024-10-13 00:38:42 +07:00
Nevo David
ee5e384e10 feat: enterprise container 2024-10-13 00:19:44 +07:00
Nevo David
bca6caebef feat: enterprise package 2024-10-13 00:18:25 +07:00
Nevo David
fac279764e feat: submodule url 2024-10-12 22:36:48 +07:00
Nevo David
18872259e1 feat: set plugins as not commited 2024-10-12 22:27:19 +07:00
Nevo David
0bf5347d72 Merge remote-tracking branch 'origin/main' 2024-10-12 22:24:26 +07:00
Nevo David
d3a5c97c0e feat: check plugins 2024-10-12 22:14:34 +07:00
Nevo David
5b5d319956
Merge pull request #354 from bilalmirza74/main
Fix: 404 - page not found #353
2024-10-12 14:17:59 +07:00
bilalmirza74
4c0012f5bf Fix: 404 - page not found #353 2024-10-12 11:18:51 +05:30
Nevo David
0bea6c900c feat: checkbox fixes 2024-10-11 19:38:26 +07:00
Nevo David
185e737608 Merge remote-tracking branch 'origin/main' 2024-10-11 19:25:50 +07:00
Nevo David
d83806350b feat: tiktok changes to be in their terms and services 2024-10-11 19:20:15 +07:00
James Read
2bd4fc3aa3
Merge pull request #347 from gitroomhq/security-depbump-2024-10
security: depbump 2024-10
2024-10-09 19:38:40 +01:00
jamesread
af35af804e security, depdump 2024-10-09 19:31:26 +01:00
jamesread
20476a02b1 security: depbump 2024-10 2024-10-09 18:52:51 +01:00
jamesread
7b56badaec Trigger for public website issues 2024-10-09 18:14:49 +01:00
jamesread
26a7d5a3f7 ci: Issue label triggers 2024-10-09 18:05:12 +01:00
James Read
76cc074c77
Merge pull request #260 from OleksandrKucherenko/AB0001-developer-environment
[AB-0001]: added web ui for redis docker-compose.dev.yaml
2024-10-09 09:51:48 +01:00
Nevo David
208f522f0d Merge remote-tracking branch 'origin/main' 2024-10-08 16:40:36 +07:00
Nevo David
16c9c45d1e feat: tiktok fixes 2024-10-08 16:40:16 +07:00
Nevo David
46ef91b9d8
Merge pull request #339 from gitroomhq/feat/file-path
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
fix file path
2024-10-07 22:20:20 +07:00
Nevo David
5a7be6e184 feat: fixed file path 2024-10-07 22:19:24 +07:00
Nevo David
2a16bce7cf
Merge pull request #337 from gitroomhq/feat/fix-variables
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
fix storage provider
2024-10-07 20:21:54 +07:00
Nevo David
2aaac8633b feat: fix storage provider 2024-10-07 20:20:51 +07:00
Nevo David
dec4763b25
Merge pull request #336 from gitroomhq/feat/fix-variables
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
fix frontend
2024-10-07 14:22:58 +07:00
Nevo David
c9af76224f feat: fix frontend provider 2024-10-07 14:22:32 +07:00
Nevo David
52e3746350
Merge pull request #335 from gitroomhq/feat/fix-variables
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
Fix variables injections when building a docker
2024-10-07 14:16:35 +07:00
Nevo David
b818e580cf Merge remote-tracking branch 'origin/main' 2024-10-07 14:14:12 +07:00
Nevo David
95c73b8702 feat: variables 2024-10-07 14:13:57 +07:00
James Read
68af7c5b8f
Merge pull request #330 from gitroomhq/doc-contributing-point-to-dev-guide
doc: Update CONTRIBUTING.md to point to Developer Guide [skip ci]
2024-10-06 22:39:45 +01:00
jamesread
6818d10e80 doc: Update CONTRIBUTING.md to point to Developer Guide [skip ci] 2024-10-06 22:37:15 +01:00
Nevo David
91823079c4
Allow for filesystem upload
feature/media uploader
2024-10-06 19:47:50 +07:00
Nevo David
a4f062c9c1 feat: fixes for uploading 2024-10-06 19:41:22 +07:00
Nevo David
e7273c418e Merge branch 'main' into feature/media-uploader 2024-10-06 17:24:42 +07:00
Nevo David
3f3157c35c feat: change to url 2024-10-06 17:24:29 +07:00
James Read
09f269d7e7
Merge pull request #326 from gitroomhq/jamesread-patch-1
Proxy /uploads in containers
2024-10-06 10:51:01 +01:00
James Read
160842ade2
Proxy /uploads in containers 2024-10-06 10:49:53 +01:00
Nevo David
69435a5530 feat: remove a massive amount of code 2024-10-06 11:59:38 +07:00
Oleksandr Kucherenko
00447296d7 added dev:docker helper script into package.json 2024-10-05 22:15:46 +02:00
Oleksandr Kucherenko
b62abdced9 updated ignore files, .secrets folder exclude 2024-10-05 22:15:02 +02:00
Oleksandr Kucherenko
81c7b943e0 added redis web ui for developer needs 2024-10-05 22:14:22 +02:00
Nevo David
3a03185206 Merge remote-tracking branch 'origin/main' 2024-10-06 00:53:34 +07:00
Nevo David
21f9d2323f fix(linkedin): 1300 characters instead of 3000 - api limitaion 2024-10-06 00:53:16 +07:00
James Read
77d38a4f52
Merge branch 'main' into feature/media-uploader 2024-10-05 17:53:02 +01:00
James Read
376932855f
Merge pull request #320 from JeevaRamanathan/patch-1
fix: path of contributing guide in PULL_REQUEST_TEMPLATE.md
2024-10-05 17:50:19 +01:00
Nevo David
300ccc7297
Update README.md 2024-10-05 23:06:31 +07:00
Nevo David
25a0260a8f feat: env for new social networks
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-10-05 23:00:25 +07:00
JeevaRamanathan
9c2f9806f1
fix: path of contributing guide in PULL_REQUEST_TEMPLATE.md 2024-10-05 21:17:58 +05:30
Nevo David
c25132ca3e feat: save post 2024-10-05 22:45:04 +07:00
Nevo David
3bfac7a38d feat: bluesky 2024-10-05 21:54:52 +07:00
Nevo David
934296955a feat: integrations 2024-10-05 15:11:26 +07:00
Nevo David
0f2ac5f28d Merge remote-tracking branch 'origin/main' 2024-10-05 12:11:37 +07:00
Nevo David
5206ce16b6 Merge branch 'feat/external-social-media' 2024-10-05 12:11:15 +07:00
Nevo David
022af75434 feat: mastodon 2024-10-05 12:11:06 +07:00
James Read
98b0fc4e38
ci: Add /uploads to Docker containers
ci: Add /uploads to Docker containers [skip ci]
2024-10-04 23:02:46 +01:00
jamesread
71f8541463 ci: Add /uploads to Docker containers [skip ci] 2024-10-04 23:01:03 +01:00
James Read
0a5820b146
Merge pull request #274 from Zor0000/rounded-button-style
Updated button style to rounded edges
2024-10-04 22:29:55 +01:00
James Read
3c7029d634
Merge pull request #314 from gitroomhq/pr-template-checklist
doc: The pull request template needs a checklist to avoid common issues [skip ci]
2024-10-04 22:28:25 +01:00
jamesread
635b9b396f doc: The pull request template needs a checklist to avoid common issues. 2024-10-04 22:27:08 +01:00
James Read
d790d5f99e
Merge pull request #311 from Mujtaba500/bugfix/button-hover-cursor
fix:Change button cursor to pointer on hover
2024-10-04 21:30:45 +01:00
James Read
faf4ae154b
Merge pull request #286 from AkashJana18/doc-Improving-CONTRIBUTING.md
doc: Update CONTRIBUTING.md
2024-10-04 21:28:05 +01:00
James Read
1bfd5b150e
Merge pull request #299 from Vignesh025/main
Create SECURITY.md
2024-10-04 21:19:58 +01:00
James Read
efe22d8e29
Fix email addresses. 2024-10-04 21:19:16 +01:00
James Read
e7640f37b7
Merge pull request #308 from JeevaRamanathan/fix/faq_description
fix: updated faq descriptions
2024-10-04 21:10:47 +01:00
James Read
aaefbbc96f
Merge pull request #302 from prathamesh424/main
Fixed 🐛 Bug Report :  Profile Settings UI errors [fixed : #301]
2024-10-04 20:08:18 +01:00
Nevo David
7f72ccf31f feat: fix facebook video upload 2024-10-04 22:06:49 +07:00
Nevo David
7fdad8d0b4 feat: x can have maximum 4 pictures 2024-10-04 17:05:40 +07:00
Nevo David
237bfcbfec feat: fix instagram 2024-10-04 16:53:07 +07:00
Mujtaba
220cad3086 fix:Change button cursor to pointer on hover 2024-10-04 13:07:25 +05:00
Nevo David
3b35ca3ac8 feat: external social media 2024-10-04 12:23:01 +07:00
JeevaRamanathan
205ae034c3 fix 2024-10-04 03:42:37 +05:30
JeevaRamanathan
8d48b071ad updated faq description 2024-10-04 03:40:15 +05:30
JeevaRamanathan
79b8189341 updated faq descriptions 2024-10-04 03:22:14 +05:30
GURSAL PRATHAMESH APPASAHEB
c081584ce8
change the percentage color in the progress bar 2024-10-03 14:48:44 +05:30
GURSAL PRATHAMESH APPASAHEB
70cdff4c7d
Updated the save button and add hover effect to the remove button 2024-10-03 14:46:41 +05:30
Nevo David
cf9a2e6990 feat: fixes 2024-10-03 15:45:33 +07:00
Nevo David
d87b642ab8 feat: frontend changes 2024-10-03 13:36:44 +07:00
Nevo David
f2e64aa977 Merge remote-tracking branch 'origin/main' 2024-10-03 13:33:43 +07:00
Nevo David
8d4d450fee feat: slack and discord 2024-10-03 13:33:29 +07:00
Nevo David
37a674dced
Merge pull request #269 from JeevaRamanathan/checkbox_issue
fix: Checkbox tick visible on both modes
2024-10-03 12:08:55 +07:00
Vignesh J
969ea32c2e
Create SECURITY.md 2024-10-03 10:38:29 +05:30
Nevo David
3465b099a0
Merge pull request #294 from JeevaRamanathan/visual_inconsistency/toast_profile
fix: Improve Remove Icon and Toast Text Visibility in light mode
2024-10-03 12:07:26 +07:00
JeevaRamanathan
b2be32cad7 fix:Improve Icon and Toast Text Visibility in Profile Settings Screen for Light Mode 2024-10-02 19:25:06 +05:30
Akash Jana
c274e26b17
doc: Changes according to review 2024-10-02 16:42:24 +05:30
Akash Jana
9c9c7329fc
doc: Update CONTRIBUTING.md 2024-10-02 14:16:54 +05:30
James Read
9eccc14d6b
Merge pull request #265 from eltociear/patch-2
docs: update CONTRIBUTING.md
2024-10-02 09:40:01 +02:00
Zor0000
e2e06f6f4c Updated button style to rounded edges 2024-10-02 01:19:24 +05:30
JeevaRamanathan
f21ea604ce removed formatting 2024-10-01 17:33:34 +05:30
JeevaRamanathan
57a3a90941 fix: Checkbox tick visible on both modes
Signed-off-by: JeevaRamanathan <jeevaramanathan.m@infosys.com>
2024-10-01 17:18:00 +05:30
Ikko Eltociear Ashimine
566d13f015
docs: update CONTRIBUTING.md
Brabch -> Branch
2024-10-01 01:07:49 +09:00
Nevo David
fde1efa154
Update README.md 2024-09-30 14:28:56 +07:00
Nevo David
c40039423f feat: fix bad body 2024-09-29 19:55:17 +07:00
Nevo David
44688ee77a feat: better errors 2024-09-29 19:50:42 +07:00
Nevo David
98384105b5 feat: threads 2024-09-29 19:26:14 +07:00
Nevo David
94157b10ae feat: redirectmeto 2024-09-29 19:25:14 +07:00
Nevo David
2ce05febcd feat: redirectmeto 2024-09-29 19:17:15 +07:00
Nevo David
9235a8de1c feat: fix linkedin chunks upload 2024-09-27 22:02:06 +07:00
Nevo David
967fe62b1b Merge remote-tracking branch 'origin/main'
Some checks failed
Build Containers / build-containers-common (push) Has been cancelled
Build Containers / build-containers (amd64, ubuntu-latest) (push) Has been cancelled
Build Containers / build-containers (arm64, [self-hosted ARM64]) (push) Has been cancelled
Build Containers / build-container-manifest (push) Has been cancelled
2024-09-27 13:38:03 +07:00
Nevo David
940fc7e583 feat: choosable email 2024-09-27 13:36:42 +07:00
Nevo David
533ca48afc
Merge pull request #242 from gitroomhq/doc-contributor-guide
doc: Add contribitors guide
2024-09-26 21:38:24 +07:00
Nevo David
129b21b46b feat: check tiktok error 2024-09-26 16:49:45 +07:00
Nevo David
9c98311623 Merge remote-tracking branch 'origin/main' 2024-09-26 10:48:31 +07:00
Nevo David
69da6489ee feat: find linkedin error 2024-09-26 10:28:48 +07:00
James Read
d25a33e773
Merge pull request #203 from jamesread/configuration-checking
feat: Configuration checking on backend startup, and via cli.
2024-09-26 01:14:38 +02:00
James Read
c766d53040
Merge branch 'main' into configuration-checking 2024-09-26 01:08:59 +02:00
jamesread
5fcc365efb feat: Dont send activate=true if activation isnt required 2024-09-25 23:56:50 +01:00
Nevo David
c84d8af915 feat: console error 2024-09-25 11:56:25 +07:00
Nevo David
b4beee65da Merge remote-tracking branch 'origin/main' 2024-09-25 11:13:21 +07:00
Nevo David
3db361367b feat: remove cron add logs 2024-09-25 11:12:59 +07:00
James Read
e3b1966be5
Update build-containers.yml 2024-09-24 17:25:55 +02:00
James Read
e3764a1f18
Update build-containers.yml 2024-09-24 17:16:19 +02:00
jamesread
f4341a218b ci: Fix container matrix job 2024-09-24 13:25:14 +01:00
jamesread
abeff59cf6 ci: Fix container matrix job 2024-09-24 13:16:22 +01:00
jamesread
c6ef1a81c3 ci: bugfix ARM64 runner 2024-09-24 12:51:36 +01:00
jamesread
ef9b58fde5 ci: GitHub workflow for ARM64 2024-09-24 12:46:50 +01:00
jamesread
6ded2719c5 rename .adoc to .md 2024-09-24 11:47:22 +01:00
Nevo David
9e2c825f3d
Merge pull request #253 from gitroomhq/feat-better-registration-errors
feat: Better registration errors
2024-09-24 16:55:18 +07:00
jamesread
2e24c78c5d Add number type to registration failure func 2024-09-24 00:55:34 +00:00
jamesread
dbf58a9f09 Add type to registration failure func 2024-09-24 00:48:22 +00:00
jamesread
3e32e24748 feat: Better registration errors 2024-09-24 00:40:01 +00:00
Nevo David
ec0259d23e feat: fix login for any url 2024-09-24 01:04:55 +07:00
Nevo David
25aa3d5a20 Merge remote-tracking branch 'origin/main' 2024-09-23 22:29:47 +07:00
Nevo David
0c6e3b1067 feat: app is running 2024-09-23 22:29:31 +07:00
James Read
d7ff7dd794
Merge branch 'main' into feature/media-uploader 2024-09-23 09:57:47 +01:00
jamesread
f62f287984 docker: Wait 3 secs for each process, and fix caddy supervisor unit 2024-09-23 09:47:48 +01:00
SanadKhan
67ca693ceb added dynamic path in media directory for nignx host 2024-09-23 12:46:13 +05:30
SanadKhan
92cd484212 uppy uploader 2024-09-23 12:22:37 +05:30
James Read
396a7cea63
Update Caddyfile - remove deprecated path 2024-09-22 17:32:38 +01:00
Nevo David
94170d1ce1 Merge remote-tracking branch 'origin/main' 2024-09-22 21:00:48 +07:00
Nevo David
4262755fce feat: set ultimate 2024-09-22 21:00:23 +07:00
jamesread
e981ef3e66 bugfix: Install caddy config after making supervisord dir 2024-09-22 14:42:38 +01:00
jamesread
367e82bee2 bugfix: Install caddy config after making supervisord dir 2024-09-22 14:41:49 +01:00
James Read
032835a114
Merge pull request #250 from gitroomhq/feat-internal-proxy-no-cors
feat: Host an internal proxy to get around CORs issues
2024-09-22 14:52:07 +02:00
jamesread
bcaade98f9 feat: Host an internal proxy to get around CORs issues 2024-09-22 13:49:56 +01:00
Nevo David
3b9d951ed5 feat: fix general undefined in regsitration 2024-09-21 00:31:13 +07:00
Nevo David
e43488cd1c feat: move prevent window 2024-09-21 00:21:15 +07:00
jamesread
423ac38573 doc: Add contribitors guide 2024-09-16 22:21:59 +01:00
James Read
b270259565
Merge branch 'main' into configuration-checking 2024-09-14 22:22:18 +01:00
James Read
73be4e9bc4
Merge branch 'main' into configuration-checking 2024-09-12 23:20:38 +01:00
James Read
5e9dfa0172
Merge branch 'main' into configuration-checking 2024-09-10 20:15:03 +01:00
jamesread
db472df764 bug: typo 2024-09-06 23:50:25 +01:00
jamesread
d13c71d1f6 feat: Configuration checking on backend startup, and via cli. 2024-09-06 23:34:26 +01:00
991 changed files with 160436 additions and 78271 deletions

177
.coderabbit.yaml Normal file
View file

@ -0,0 +1,177 @@
language: en-US
tone_instructions: ''
early_access: false
enable_free_tier: true
reviews:
profile: chill
request_changes_workflow: false
high_level_summary: true
high_level_summary_placeholder: '@coderabbitai summary'
high_level_summary_in_walkthrough: false
auto_title_placeholder: '@coderabbitai'
auto_title_instructions: ''
review_status: false
commit_status: true
fail_commit_status: false
collapse_walkthrough: false
changed_files_summary: true
sequence_diagrams: true
estimate_code_review_effort: true
assess_linked_issues: true
related_issues: true
related_prs: true
suggested_labels: true
auto_apply_labels: false
suggested_reviewers: true
auto_assign_reviewers: false
poem: true
labeling_instructions: []
path_filters: []
path_instructions: []
abort_on_close: true
disable_cache: false
auto_review:
enabled: false
auto_incremental_review: true
ignore_title_keywords: []
labels: []
drafts: false
base_branches: []
finishing_touches:
docstrings:
enabled: true
unit_tests:
enabled: true
pre_merge_checks:
docstrings:
mode: warning
threshold: 80
title:
mode: warning
requirements: ''
description:
mode: warning
issue_assessment:
mode: warning
tools:
ast-grep:
rule_dirs: []
util_dirs: []
essential_rules: true
packages: []
shellcheck:
enabled: true
ruff:
enabled: true
markdownlint:
enabled: true
github-checks:
enabled: true
timeout_ms: 90000
languagetool:
enabled: true
enabled_rules: []
disabled_rules: []
enabled_categories: []
disabled_categories: []
enabled_only: false
level: default
biome:
enabled: true
hadolint:
enabled: true
swiftlint:
enabled: true
phpstan:
enabled: true
level: default
phpmd:
enabled: true
phpcs:
enabled: true
golangci-lint:
enabled: true
yamllint:
enabled: true
gitleaks:
enabled: true
checkov:
enabled: true
detekt:
enabled: true
eslint:
enabled: true
flake8:
enabled: true
rubocop:
enabled: true
buf:
enabled: true
regal:
enabled: true
actionlint:
enabled: true
pmd:
enabled: true
cppcheck:
enabled: true
semgrep:
enabled: true
circleci:
enabled: true
clippy:
enabled: true
sqlfluff:
enabled: true
prismaLint:
enabled: true
pylint:
enabled: true
oxc:
enabled: true
shopifyThemeCheck:
enabled: true
luacheck:
enabled: true
brakeman:
enabled: true
dotenvLint:
enabled: true
htmlhint:
enabled: true
checkmake:
enabled: true
chat:
auto_reply: true
integrations:
jira:
usage: auto
linear:
usage: auto
knowledge_base:
opt_out: false
web_search:
enabled: true
code_guidelines:
enabled: true
filePatterns: []
learnings:
scope: auto
issues:
scope: auto
jira:
usage: auto
project_keys: []
linear:
usage: auto
team_keys: []
pull_requests:
scope: auto
code_generation:
docstrings:
language: en-US
path_instructions: []
unit_tests:
path_instructions: []
autopilot:
enabled: false

View file

@ -2,12 +2,22 @@
# any half-built stuff in the build context as a pre-caution (also saves copying
# 180k files in node_modules that isn't used!).
**/node_modules
node_modules/*
node_modules
docker-data/*
dist
.nx
/apps/frontend/.next
/apps/backend/dist
/apps/workers/dist
/apps/cron/dist
/apps/commands/dist
.devcontainer
**/.git
**/dist
**/*.md
**/LICENSE
**/npm-debug.log
**/*.vscode
.git
.github
reports

View file

@ -4,22 +4,22 @@
DATABASE_URL="postgresql://postiz-user:postiz-password@localhost:5432/postiz-db-local"
REDIS_URL="redis://localhost:6379"
JWT_SECRET="random string for your JWT secret, make it long"
# === This needs to be exactly the URL you're accessing Postiz on
FRONTEND_URL="http://localhost:4200"
NEXT_PUBLIC_BACKEND_URL="http://localhost:3000"
BACKEND_INTERNAL_URL="http://localhost:3000"
## These are dummy values, you must create your own from Cloudflare.
## Remember to set your public internet IP address in the allow-list for the API token.
##
## Cloudflare is currently required to save things like social media avatars for accounts.
CLOUDFLARE_ACCOUNT_ID="QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu"
CLOUDFLARE_ACCESS_KEY="dcfCMSuFEeCNfvByUureMZEfxWJmDqZe"
CLOUDFLARE_SECRET_ACCESS_KEY="zTTMXBmtyLPwHEdpACGHgDgzRTNpTJewiNriLnUS"
CLOUDFLARE_BUCKETNAME="postiz"
CLOUDFLARE_BUCKET_URL="https://QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu.r2.cloudflarestorage.com/"
CLOUDFLARE_ACCOUNT_ID="your-account-id"
CLOUDFLARE_ACCESS_KEY="your-access-key"
CLOUDFLARE_SECRET_ACCESS_KEY="your-secret-access-key"
CLOUDFLARE_BUCKETNAME="your-bucket-name"
CLOUDFLARE_BUCKET_URL="https://your-bucket-url.r2.cloudflarestorage.com/"
CLOUDFLARE_REGION="auto"
# === Common optional Settings
## This is a dummy key, you must create your own from Resend.
@ -28,19 +28,21 @@ CLOUDFLARE_REGION="auto"
#RESEND_API_KEY="RzeTwHijvxvPUerScFcenUZUALuQJzSaGSMJ"
#EMAIL_FROM_ADDRESS=""
#EMAIL_FROM_NAME=""
#DISABLE_REGISTRATION=false
# Where will social media icons be saved - local or cloudflare.
STORAGE_PROVIDER="local"
# Your upload directory path if you host your files locally, otherwise Cloudflare will be used.
#UPLOAD_DIRECTORY="/opt/postiz/uploads/"
#UPLOAD_DIRECTORY=""
# Your upload directory path if you host your files locally, otherwise Cloudflare will be used.
#NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY="/opt/postiz/uploads/"
#NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY=""
# Social Media API Settings
X_URL=""
X_API_KEY=""
X_API_SECRET=""
X_CLIENT=""
X_SECRET=""
LINKEDIN_CLIENT_ID=""
LINKEDIN_CLIENT_SECRET=""
REDDIT_CLIENT_ID=""
@ -49,6 +51,10 @@ GITHUB_CLIENT_ID=""
GITHUB_CLIENT_SECRET=""
BEEHIIVE_API_KEY=""
BEEHIIVE_PUBLICATION_ID=""
LISTMONK_DOMAIN=""
LISTMONK_USER=""
LISTMONK_API_KEY=""
LISTMONK_LIST_ID=""
THREADS_APP_ID=""
THREADS_APP_SECRET=""
FACEBOOK_APP_ID=""
@ -61,11 +67,25 @@ PINTEREST_CLIENT_ID=""
PINTEREST_CLIENT_SECRET=""
DRIBBBLE_CLIENT_ID=""
DRIBBBLE_CLIENT_SECRET=""
DISCORD_CLIENT_ID=""
DISCORD_CLIENT_SECRET=""
DISCORD_BOT_TOKEN_ID=""
SLACK_ID=""
SLACK_SECRET=""
SLACK_SIGNING_SECRET=""
MASTODON_URL="https://mastodon.social"
MASTODON_CLIENT_ID=""
MASTODON_CLIENT_SECRET=""
# Chrome Extension Settings (for cookie-based platform integrations like Skool)
EXTENSION_ID=""
# Misc Settings
OPENAI_API_KEY=""
NEXT_PUBLIC_DISCORD_SUPPORT=""
NEXT_PUBLIC_POLOTNO=""
# NOT_SECURED=false
API_LIMIT=30 # The limit of the public API hour limit
# Payment settings
FEE_AMOUNT=0.05
@ -77,3 +97,28 @@ STRIPE_SIGNING_KEY_CONNECT=""
# Developer Settings
NX_ADD_PLUGINS=false
IS_GENERAL="true" # required for now
NEXT_PUBLIC_POSTIZ_OAUTH_DISPLAY_NAME="Authentik"
NEXT_PUBLIC_POSTIZ_OAUTH_LOGO_URL="https://raw.githubusercontent.com/walkxcode/dashboard-icons/master/png/authentik.png"
POSTIZ_GENERIC_OAUTH="false"
POSTIZ_OAUTH_URL="https://auth.example.com"
POSTIZ_OAUTH_AUTH_URL="https://auth.example.com/application/o/authorize"
POSTIZ_OAUTH_TOKEN_URL="https://auth.example.com/application/o/token"
POSTIZ_OAUTH_USERINFO_URL="https://authentik.example.com/application/o/userinfo"
POSTIZ_OAUTH_CLIENT_ID=""
POSTIZ_OAUTH_CLIENT_SECRET=""
# POSTIZ_OAUTH_SCOPE="openid profile email" # default values
# Short Link Service Settings
# DUB_TOKEN="" # Your self-hosted Dub API token
# DUB_API_ENDPOINT="https://api.dub.co" # Your self-hosted Dub API endpoint
# DUB_SHORT_LINK_DOMAIN="dub.sh" # Your self-hosted Dub domain
# SHORT_IO_SECRET_KEY="" # Your Short.io API secret key
# KUTT_API_KEY="" # Your Kutt.it API key
# KUTT_API_ENDPOINT="https://kutt.it/api/v2" # Your self-hosted Kutt API endpoint
# KUTT_SHORT_LINK_DOMAIN="kutt.it" # Your self-hosted Kutt domain
# LINK_DRIP_API_KEY="" # Your LinkDrip API key
# LINK_DRIP_API_ENDPOINT="https://api.linkdrip.com/v1/" # Your self-hosted LinkDrip API endpoint
# LINK_DRIP_SHORT_LINK_DOMAIN="dripl.ink" # Your self-hosted LinkDrip domain

View file

@ -1,27 +0,0 @@
{
"root": true,
"ignorePatterns": ["**/*"],
"plugins": ["@nx"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {
}
},
{
"files": ["*.ts", "*.tsx"],
"extends": ["plugin:@nx/typescript"],
"rules": {
"@typescript-eslint/no-non-null-asserted-optional-chain": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/ban-ts-comment": "off",
"react/display-name": "off"
}
},
{
"files": ["*.js", "*.jsx"],
"extends": ["plugin:@nx/javascript"],
"rules": {}
}
]
}

11
.github/Dependabot.yml vendored Normal file
View file

@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
- package-ecosystem: "npm" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"

3
.github/FUNDING.yaml vendored Normal file
View file

@ -0,0 +1,3 @@
#patreon: Postiz
open_collective: postiz
# github: gitroomhq

14
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View file

@ -0,0 +1,14 @@
# Disable the default option to open a blank issue
blank_issues_enabled: true
# Define your custom links
contact_links:
# The first link definition
- name: 🙏 Installation Issue
url: https://discord.postiz.com
about: If you have an installation / configuration issue.
# You can add more links if needed
- name: Security Issue
url: https://github.com/gitroomhq/postiz-app/security/advisories/new
about: Please submit security Issues our GitHub Security Advisories.

View file

@ -1,11 +1,22 @@
<!-- Remember to first apply via [the contribution form](https://contribute.postiz.com/p/postiz) before submitting a PR. -->
# What kind of change does this PR introduce?
eg: Bug fix, feature, docs update, ...
# Why was this change needed?
Please link to related issues when possible.
Please link to related issues when possible, and explain WHY you changed things, not WHAT you changed.
# Other information:
eg: Did you discuss this change with anybody before working on it (not required, but can be a good idea for bigger changes). Any plans for the future, etc?
eg: Did you discuss this change with anybody before working on it (not required, but can be a good idea for bigger changes). Any plans for the future, etc?
# Checklist:
Put a "X" in the boxes below to indicate you have followed the checklist;
- [ ] I have read the [CONTRIBUTING](https://github.com/gitroomhq/postiz-app/blob/main/CONTRIBUTING.md) guide.
- [ ] I confirm I have not used AI to submit this PR or generate code for it.
- [ ] I checked that there were no similar issues or PRs already open for this.
- [ ] This PR fixes just ONE issue

116
.github/copilot-instructions.md vendored Normal file
View file

@ -0,0 +1,116 @@
# Copilot Coding Agent Instructions for Postiz
## Project Architecture
- Monorepo managed by NX, with apps in `apps/` and shared code in `libraries/`.
- Main services: `frontend` (Next.js), `backend` (NestJS), `cron`, `commands`, `extension`, `sdk`, and `workers`.
- Data layer uses Prisma ORM (`libraries/nestjs-libraries/src/database/prisma/schema.prisma`) with PostgreSQL as the default database.
- Redis (BullMQ) is used for queues and caching.
- Email notifications via Resend.
- Social login integrations (Instagram, Facebook) and Make.com/N8N integrations.
## Developer Workflows
- Use Node.js 20.17.0 and pnpm 8+.
- Install dependencies: `pnpm install`
- Build all apps: `pnpm run build`
- Run all apps in dev mode: `pnpm run dev`
- Test: `pnpm test` (Jest, coverage enabled)
- Individual app scripts are in each app's `package.json` (e.g., `pnpm --filter ./apps/backend run dev`).
- Prisma DB commands: `pnpm run prisma-generate`, `pnpm run prisma-db-push`, `pnpm run prisma-reset`.
- Docker: `docker compose -f ./docker-compose.dev.yaml up -d`
## Conventions & Patterns
- Use conventional commits (`feat:`, `fix:`, `chore:`).
- PRs should include clear descriptions, related issue links, and UI screenshots/GIFs if relevant.
- Comments are required for complex logic.
- Shared code lives in `libraries/` (e.g., helpers, React shared libraries, NestJS modules).
- Environment variables are managed via `.env` and referenced in Docker and scripts.
- Make sure to keep the `.env.example` file updated with new environment variables.
## Integration Points
- External APIs: Social media (Instagram, Facebook), Make.com, N8N, Resend, Stripe, etc.
- SDK (`apps/sdk`) provides programmatic access to Postiz features.
- Extension (`apps/extension`) is built with Vite, React, TypeScript, and Tailwind CSS.
## Key Files & Directories
- `apps/` — Main services and applications
- `libraries/` — Shared code and modules
- `docker-compose.dev.yaml` — Local development Docker setup
- `.env` — Environment configuration
- `jest.config.ts` — Test configuration
- `pnpm-workspace.yaml` — Workspace package management
- `README.md` — General project overview
- `libraries/nestjs-libraries/src/database/prisma/schema.prisma` — Database schema
## Documentation
- Main docs: https://docs.postiz.com/
- Developer guide: https://docs.postiz.com/developer-guide
- Public API: https://docs.postiz.com/public-api
---
# Logs
- Where logs are used, ensure Sentry is imported using `import * as Sentry from "@sentry/nextjs"`
- Enable logging in Sentry using `Sentry.init({ enableLogs: true })`
- Reference the logger using `const { logger } = Sentry`
- Sentry offers a `consoleLoggingIntegration` that can be used to log specific console error types automatically without instrumenting the individual logger calls
## Configuration
The Sentry initialization needs to be updated to enable the logs feature.
### Baseline
```javascript
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
enableLogs: true,
});
```
### Logger Integration
```javascript
Sentry.init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
integrations: [
// send console.log, console.error, and console.warn calls as logs to Sentry
Sentry.consoleLoggingIntegration({ levels: ["log", "error", "warn"] }),
],
});
```
## Logger Examples
`logger.fmt` is a template literal function that should be used to bring variables into the structured logs.
```javascript
import * as Sentry from "@sentry/nextjs";
const { logger } = Sentry;
logger.trace("Starting database connection", { database: "users" });
logger.debug(logger.fmt`Cache miss for user: ${userId}`);
logger.info("Updated profile", { profileId: 345 });
logger.warn("Rate limit reached for endpoint", {
endpoint: "/api/results/",
isEnterprise: false,
});
logger.error("Failed to process payment", {
orderId: "order_123",
amount: 99.99,
});
logger.fatal("Database connection pool exhausted", {
database: "users",
activeConnections: 100,
});
```
---
For questions or unclear conventions, check the main README or ask for clarification in your PR description.

BIN
.github/sponsors/hostinger.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View file

@ -8,14 +8,35 @@ on:
- '*'
jobs:
build-containers:
build-containers-common:
runs-on: ubuntu-latest
outputs:
containerver: ${{ steps.getcontainerver.outputs.containerver }}
steps:
- name: Get Container Version
id: getcontainerver
run: |
echo "containerver=${{ github.ref_name }}" >> "$GITHUB_OUTPUT"
build-containers:
needs: build-containers-common
strategy:
matrix:
include:
- runnertags: ubuntu-latest
arch: amd64
- runnertags: ubuntu-24.04-arm
arch: arm64
runs-on: ${{ matrix.runnertags }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to ghcr
uses: docker/login-action@v3
with:
@ -23,27 +44,60 @@ jobs:
username: ${{ github.actor }}
password: ${{ github.token }}
- name: docker build
run: ./var/docker/docker-build.sh
- name: Get date
- name: Build and Push Image
env:
CONTAINERVER: ${{ needs.build-containers-common.outputs.containerver }}
NEXT_PUBLIC_VERSION: ${{ github.ref_name }}
run: |
echo "DATE=$(date +'%s')" >> "$GITHUB_ENV"
docker buildx build --platform linux/${{ matrix.arch }} \
-f Dockerfile.dev \
-t ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }}-${{ matrix.arch }} \
--build-arg NEXT_PUBLIC_VERSION=${{ env.NEXT_PUBLIC_VERSION }} \
--pull \
--no-cache \
--provenance=false --sbom=false \
--output "type=registry,name=ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }}-${{ matrix.arch }}" .
- name: Print post-build debug info
build-container-manifest:
needs: [build-containers, build-containers-common]
runs-on: ubuntu-latest
steps:
- name: Login to ghcr
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ github.token }}
- name: Create Docker Manifest
env:
CONTAINERVER: ${{ needs.build-containers-common.outputs.containerver }}
run: |
docker images
# Verify the architecture images
echo "Verifying AMD64 image:"
docker buildx imagetools inspect ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }}-amd64
echo "Verifying ARM64 image:"
docker buildx imagetools inspect ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }}-arm64
# Try to remove any existing manifests first
docker manifest rm ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }} || true
docker manifest rm ghcr.io/gitroomhq/postiz-app:latest || true
# Create and push the version-specific manifest
docker manifest create ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }} \
--amend ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }}-amd64 \
--amend ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }}-arm64
- name: docker tag
docker manifest push ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }}
# Create and push the latest manifest
docker manifest create ghcr.io/gitroomhq/postiz-app:latest \
--amend ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }}-amd64 \
--amend ghcr.io/gitroomhq/postiz-app:${{ env.CONTAINERVER }}-arm64
docker manifest push ghcr.io/gitroomhq/postiz-app:latest
- name: Verify Manifest
run: |
docker tag localhost/postiz ghcr.io/gitroomhq/postiz-app:${{ env.DATE }}
docker push ghcr.io/gitroomhq/postiz-app:${{ env.DATE }}
docker tag ghcr.io/gitroomhq/postiz-app:${{ env.DATE }} ghcr.io/gitroomhq/postiz-app:latest
docker push ghcr.io/gitroomhq/postiz-app:latest
docker tag localhost/postiz-devcontainer ghcr.io/gitroomhq/postiz-devcontainer:${{ env.DATE }}
docker push ghcr.io/gitroomhq/postiz-devcontainer:${{ env.DATE }}
docker tag ghcr.io/gitroomhq/postiz-devcontainer:${{ env.DATE }} ghcr.io/gitroomhq/postiz-devcontainer:latest
docker push ghcr.io/gitroomhq/postiz-devcontainer:latest
docker manifest inspect ghcr.io/gitroomhq/postiz-app:latest

34
.github/workflows/build-extension.yaml vendored Normal file
View file

@ -0,0 +1,34 @@
name: Build Extension
on:
workflow_dispatch:
jobs:
submit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install
- name: Zip extensions
run: FRONTEND_URL=https://platform.postiz.com pnpm run build:extension
- name: Upload to Nextcloud
env:
NEXTCLOUD_URL: ${{ secrets.NEXTCLOUD_URL }}
NEXTCLOUD_USERNAME: ${{ secrets.NEXTCLOUD_USERNAME }}
NEXTCLOUD_PASSWORD: ${{ secrets.NEXTCLOUD_PASSWORD }}
run: |
curl -T apps/extension/extension.zip \
-u "$NEXTCLOUD_USERNAME:$NEXTCLOUD_PASSWORD" \
"$NEXTCLOUD_URL/extension.zip"

View file

@ -1,52 +0,0 @@
---
name: Build
on:
push:
branches:
- main
paths:
- package.json
- apps/**
- '!apps/docs/**'
- libraries/**
pull_request:
paths:
- package.json
- apps/**
- '!apps/docs/**'
- libraries/**
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: ['20.17.0']
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
cache-dependency-path: |
**/package-lock.json
# https://nextjs.org/docs/pages/building-your-application/deploying/ci-build-caching#github-actions
- uses: actions/cache@v4
with:
path: |
~/.npm
${{ github.workspace }}/.next/cache
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
restore-keys: |
${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-
- run: npm ci
- run: npm run build

54
.github/workflows/build.yml vendored Normal file
View file

@ -0,0 +1,54 @@
---
name: Build
on:
push:
merge_group:
pull_request:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: ['22.12.0']
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Install pnpm
uses: pnpm/action-setup@v2
with:
version: 10
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
# - name: Setup pnpm cache
# uses: actions/cache@v4
# with:
# path: |
# ${{ env.STORE_PATH }}
# ${{ github.workspace }}/.next/cache
# key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
# restore-keys: |
# ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}-
- name: Install dependencies
run: pnpm install
- name: Build
run: pnpm run build

View file

@ -1,5 +1,5 @@
---
name: "Code Quality Analysis"
name: "Code Quality Analysis"
on:
push:
@ -9,12 +9,8 @@ on:
- apps/**
- '!apps/docs/**'
- libraries/**
merge_group:
pull_request:
paths:
- apps/**
- '!apps/docs/**'
- libraries/**
jobs:
analyze:

View file

@ -39,7 +39,7 @@ jobs:
node-version: '20'
cache: 'npm'
cache-dependency-path: |
**/package-lock.json
**/pnpm-lock.yaml
- name: Install ESLint
run: |

View file

@ -0,0 +1,28 @@
---
name: Issue Label Triggers
on:
issues:
types:
- labeled
jobs:
closed-public-website:
if: github.event.label.name == 'trigger-public-website'
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- name: Add comment
run: gh issue comment "$NUMBER" --body "$BODY" && gh issue close "$NUMBER"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
NUMBER: ${{ github.event.issue.number }}
BODY: >
This issue concerns the public website, which is not open source and is not part of this repository.
If you have a question or concern about the content of the public website, please contact Nevo David.
If you are looking to contribute to the open source Postiz project code, this is the correct repository, and we welcome your contributions in a new GitHub issue.

32
.github/workflows/publish-extension.yml vendored Normal file
View file

@ -0,0 +1,32 @@
name: Publish Extension
on:
workflow_dispatch:
jobs:
submit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install
- name: Zip extensions
run: FRONTEND_URL=https://platform.postiz.com pnpm run build:extension
- name: Publish to Chrome Web Store
uses: mnao305/chrome-extension-upload@v5.0.0
with:
extension-id: ${{ secrets.CHROME_EXTENSION_ID }}
client-id: ${{ secrets.CHROME_CLIENT_ID }}
client-secret: ${{ secrets.CHROME_CLIENT_SECRET }}
refresh-token: ${{ secrets.CHROME_REFRESH_TOKEN }}
file-path: apps/extension/extension.zip

33
.github/workflows/stale.yml vendored Normal file
View file

@ -0,0 +1,33 @@
name: Close inactive issues
on:
workflow_dispatch:
schedule:
- cron: "*/30 * * * *"
jobs:
close-issues:
if: github.repository == 'gitroomhq/postiz-app'
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v9
with:
days-before-issue-stale: 90
days-before-issue-close: 7
stale-issue-label: "stale"
stale-issue-message: "This issue is stale because it has been open for 90 days with no activity."
close-issue-message: "This issue was closed because it has been inactive for 7 days since being marked as stale."
exempt-issue-labels: "no-stale-bot"
days-before-pr-stale: 90
days-before-pr-close: 7
stale-pr-label: "stale"
stale-pr-message: "This PR is stale because it has been open for 90 days with no activity."
close-pr-message: "This PR was closed because it has been inactive for 7 days since being marked as stale."
exempt-pr-label: "no-stale-bot"
repo-token: ${{ secrets.GITHUB_TOKEN }}
operations-per-run: 180

16
.gitignore vendored
View file

@ -16,9 +16,10 @@ node_modules
*.launch
.settings/
*.sublime-workspace
.vscode/*
# IDE - VSCode
.vscode/*
.vscode/
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
@ -47,3 +48,16 @@ Thumbs.db
# Vim files
**/*.swp
**/*.swo
# Temporary files
*.orig
*.~*~
*.tsbuildinfo
# ignore Secrets folder
.secrets/
libraries/plugins/src/plugins.ts
i18n.cache
# Generated by apps/frontend/scripts/fetch-gtm.mjs on install
apps/frontend/public/g.js

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "libraries/plugins/src/list/public-api"]
path = libraries/plugins/src/list/public-api
url = git@github.com:gitroomhq/public-api.git

5
.npmrc Normal file
View file

@ -0,0 +1,5 @@
ignore-workspace-root-check=true
node-linker=hoisted
restrict-manifest-changes=true
sync-injected-deps-after-scripts[]=build
inject-workspace-packages=true

View file

@ -1,8 +0,0 @@
{
"recommendations": [
"nrwl.angular-console",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"firsttris.vscode-jest-runner"
]
}

61
CLAUDE.md Normal file
View file

@ -0,0 +1,61 @@
This project is Postiz, a tool to schedule social media and chat posts to 28+ channels.
You can add posts to the calendar, they will be added into a workflow and posted at the right time.
You can find things like:
- Schedule posts
- Calendar view
- Analytics
- Team management
- Media library
This project is a monorepo with a root only package.json of dependencies.
Made with PNPM.
We have 3 important folders
- apps/backend - this is where the API code is (NESTJS)
- apps/orchestrator - this is temporal, it's for background jobs (NESTJS) it contains all the workflows and activities
- apps/frontend - this is the code of the frontend (Vite ReactJS)
- /libraries contains a lot of services shared between backend and orchestrator and frontend components.
We are using only pnpm, don't use any other dependency manager.
Never install frontend components from npmjs, focus on writing native components.
The project uses tailwind 3, before writing any component look at:
- /apps/frontend/src/app/colors.scss
- /apps/frontend/src/app/global.scss
- /apps/frontend/tailwind.config.js
All the --color-custom* are deprecated, don't use them.
And check other components in the system before to get the right design.
When working on the backend we need to pass the 3 layers:
Controller >> Service >> Repository (no shortcuts)
In some cases we will have
Controller >> Mananger >> Service >> Repository.
Most of the server logic should be inside of libs/server.
The backend repository is mostly used to write controller, and import files from libs.server.
For the frontend follow this:
- Many of the UI components lives in /apps/frontend/src/components/ui
- Routing is in /apps/frontend/src/app
- Components are in /apps/frontend/src/components
- always use SWR to fetch stuff, and use "useFetch" hook from /libraries/helpers/src/utils/custom.fetch.tsx
When using SWR, each one have to be in a seperate hook and must comply with react-hooks/rules-of-hooks, never put eslint-disable-next-line on it.
It means that this is valid:
const useCommunity = () => {
return useSWR....
}
This is not valid:
const useCommunity = () => {
return {
communities: () => useSWR<CommunitiesListResponse>("communities", getCommunities),
providers: () => useSWR<ProvidersListResponse>("providers", getProviders),
};
}
- Linting of the project can run only from the root.
- Use only pnpm.

View file

@ -17,23 +17,23 @@ diverse, inclusive, and healthy community.
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
- Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
- The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
@ -106,7 +106,7 @@ Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within

63
CONTRIBUTING.md Normal file
View file

@ -0,0 +1,63 @@
# Contributing
Contributions are welcome - code, docs, whatever it might be! If this is your first contribution to an Open Source project or you're a core maintainer of multiple projects, your time and interest in contributing to this project is most welcome.
## Read the developers guide
The main documentation site has a [developer guide](https://docs.postiz.com/developer-guide) . That guide provides you a good understanding of the project structure, and how to setup your development environment. Read this document after you have read that guide. This document is intended to provide you a good understanding of how to submit your first contribution.
## Apply via the contribution form
To submit your contribution, please fill out the [contribution form](https://contribute.postiz.com/p/postiz). This helps us evaluate whether your contribution is a good fit for the project. We will review your submission and get back to you as soon as possible.
## Write code with others
This is an open source project, with an open and welcoming community that is always keen to welcome new contributors. We recommend the two best ways to interact with the community are:
- **GitHub issues**: To discuss more slowly, or longer-written messages.
- **[Discord chat](https://discord.postiz.com)**: To chat with people [Discord chat](https://discord.postiz.com/) and a quicker feedback.
As a general rule;
- **If a change is less than 3 lines**: You're probably safe just to submit the change without a discussion. This includes typos, dependency changes, and quick fixes, etc.
- **If a change is more than 3 lines**: It's probably best to discuss the change in an issue or on discord first. This is simply because you might not be aware of the roadmap for the project, or understand the impact this change might have. We're just trying to save you time here, and importantly, avoid you being disappointed if your change isn't accepted.
## Types of Contributions
Contributions can include:
- **Code improvements:** Fixing bugs or adding new features.
- **Documentation updates:** Enhancing clarity or adding missing information.
- **Feature requests:** Suggesting new capabilities or integrations.
- **Bug reports:** Identifying and reporting issues.
## AI
To ensure the quality and maintainability of the codebase, **we do not accept Pull Requests generated primarily by AI tools** (e.g., ChatGPT, GitHub Copilot, Claude Code, etc.).
All contributions must be the original work of the author. We reserve the right to close any PR that appears to be AI-generated without further review.
## How to contribute
This project follows a Fork/Feature Branch/Pull Request model. If you're not familiar with this, here's how it works:
1. **Fork the project:** Create a personal copy of the repository on your GitHub account.
2. **Clone your fork:** Bring a copy of your fork to your local machine.
```bash
git clone https://github.com/YOUR_USERNAME/postiz.git
```
3. **Create a new branch**: Start a new branch for your changes
```bash
git checkout -b feature/your-feature-name
```
4. **Make your changes**: Implement the changes you wish to contribute.
5. **Push your changes**: Upload your changes to your fork.
```bash
git push -u origin feature/your-feature-name
```
6. **Create a pull request**: Propose your changes **to the main branch**.
# Need Help?
Again, do check the [developer guide](https://docs.postiz.com/developer-guide). Much of what you probably need to know is in there.
If you encounter any issues, please visit our [support page](https://docs.postiz.com/support) or check the community forums. Your contributions help make Postiz better!

View file

@ -1,72 +1,28 @@
# This Dockerfile is used for producing 3 container images.
#
# base - which is thrown away, that contains node and the basic infrastructure.
# devcontainer - which is used for development, and contains the source code and the node_modules.
# dist - which is used for production, and contains the built source code and the node_modules.
FROM node:22.20-bookworm-slim
ARG NEXT_PUBLIC_VERSION
ENV NEXT_PUBLIC_VERSION=$NEXT_PUBLIC_VERSION
RUN apt-get update && apt-get install -y --no-install-recommends \
g++ \
make \
python3-pip \
bash \
nginx \
&& rm -rf /var/lib/apt/lists/*
ARG NODE_VERSION="20.17"
RUN addgroup --system www \
&& adduser --system --ingroup www --home /www --shell /usr/sbin/nologin www \
&& mkdir -p /www \
&& chown -R www:www /www /var/lib/nginx
# Base image
FROM docker.io/node:${NODE_VERSION}-alpine3.19 AS base
## Just reduce unccessary noise in the logs.
ENV NPM_CONFIG_UPDATE_NOTIFIER=false
ENV NEXT_TELEMETRY_DISABLED=1
RUN apk add --no-cache \
bash=5.2.21-r0 \
supervisor=4.2.5-r4
RUN npm --no-update-notifier --no-fund --global install pnpm@10.6.1 pm2
WORKDIR /app
EXPOSE 4200
EXPOSE 3000
COPY . /app
COPY var/docker/nginx.conf /etc/nginx/nginx.conf
COPY var/docker/entrypoint.sh /app/entrypoint.sh
COPY var/docker/supervisord.conf /etc/supervisord.conf
COPY var/docker/supervisord /app/supervisord_available_configs/
COPY .env.example /config/postiz.env
RUN pnpm install
RUN NODE_OPTIONS="--max-old-space-size=4096" pnpm run build
VOLUME /config
LABEL org.opencontainers.image.source=https://github.com/gitroomhq/postiz-app
ENTRYPOINT ["/app/entrypoint.sh"]
# Builder image
FROM base AS devcontainer
RUN apk add --no-cache \
pkgconfig \
gcc \
pixman-dev \
cairo-dev \
pango-dev \
make \
build-base
COPY nx.json tsconfig.base.json package.json package-lock.json /app/
COPY apps /app/apps/
COPY libraries /app/libraries/
RUN npm ci --no-fund && npx nx run-many --target=build --projects=frontend,backend,workers,cron
VOLUME /config
LABEL org.opencontainers.image.title="Postiz App (DevContainer)"
# Output image
FROM base AS dist
COPY --from=devcontainer /app/node_modules/ /app/node_modules/
COPY --from=devcontainer /app/dist/ /app/dist/
# Required for prisma
COPY --from=devcontainer /app/libraries/ /app/libraries/
COPY package.json nx.json /app/
VOLUME /config
## Labels at the bottom, because CI will eventually add dates, commit hashes, etc.
LABEL org.opencontainers.image.title="Postiz App (Production)"
CMD ["sh", "-c", "nginx && pnpm run pm2"]

96
Jenkins/Build.Jenkinsfile Normal file
View file

@ -0,0 +1,96 @@
// Declarative Pipeline for building Node.js application and running SonarQube analysis triggered by a push event.
pipeline {
// Defines the execution environment. Using 'agent any' to ensure an agent is available.
agent any
// Global environment block removed to prevent Groovy scoping issues with manual path calculation.
stages {
// Stage 1: Checkout the code (Relies on the initial SCM checkout done by Jenkins)
stage('Source Checkout') {
steps {
echo "Workspace already populated by the initial SCM checkout. Proceeding."
}
}
// Stage 2: Setup Node.js v20 and install pnpm
stage('Setup Environment and Tools') {
steps {
sh '''
echo "Ensuring required utilities and Node.js are installed..."
sudo apt-get update
sudo apt-get install -y curl unzip nodejs
# 1. Install Node.js v20
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
echo "Node.js version: \$(node -v)"
# 2. Install pnpm globally (version 8)
npm install -g pnpm@8
echo "pnpm version: \$(pnpm -v)"
'''
}
}
// Stage 3: Install dependencies and build the application
stage('Install and Build') {
steps {
sh 'pnpm install'
sh 'pnpm run build'
}
}
// Stage 4: Run SonarQube analysis: Install scanner, get version, and execute.
stage('SonarQube Analysis') {
steps {
script {
// 1. Get the short 8-character commit SHA for project versioning
def commitShaShort = sh(returnStdout: true, script: 'git rev-parse --short=8 HEAD').trim()
echo "Commit SHA (short) is: ${commitShaShort}"
// --- 2. MANUALLY INSTALL THE SONAR SCANNER CLI LOCALLY IN THIS STAGE ---
sh """
echo "Manually downloading and installing Sonar Scanner CLI..."
# Download the stable scanner CLI package
curl -sS -o sonar-scanner.zip \
"https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747.zip"
# Added -o flag to force overwrite and prevent interactive prompt failure
unzip -o -q sonar-scanner.zip -d .
"""
// 3. Find the extracted directory name and capture the full absolute bin path in Groovy
// This is defined locally and used directly, avoiding environment variable issues.
def scannerBinPath = sh(
returnStdout: true,
script: '''
SCANNER_DIR=$(find . -maxdepth 1 -type d -name "sonar-scanner*" | head -n 1)
# Get the full absolute path to the executable file
echo \$(pwd)/\${SCANNER_DIR}/bin/sonar-scanner
'''
).trim()
echo "Scanner executable path captured: ${scannerBinPath}"
// 4. Use withSonarQubeEnv to set up the secure variables (HOST and TOKEN)
withSonarQubeEnv(installationName: 'SonarQube-Server') {
// 5. Execute the scanner using the Groovy variable directly.
sh """
echo "Starting SonarQube Analysis for project version: ${commitShaShort}"
# Execute the full, absolute path captured in the Groovy variable.
'${scannerBinPath}' \\
-Dsonar.projectVersion=${commitShaShort} \\
-Dsonar.sources=.
# SONAR_HOST_URL and SONAR_TOKEN are automatically passed as environment variables
# by the withSonarQubeEnv block.
"""
}
}
}
}
}
}

100
Jenkins/BuildPR.Jenkinsfile Normal file
View file

@ -0,0 +1,100 @@
// Declarative Pipeline for building Node.js application and running SonarQube analysis for a Pull Request.
pipeline {
// Defines the execution environment. Using 'agent any' to ensure an agent is available.
agent any
// Environment variables that hold PR details, provided by Jenkins Multibranch setup.
environment {
// FIX: Environment variables must be quoted or wrapped in a function call.
// We quote the 'env.CHANGE_ID' reference to fix the compilation error.
PR_KEY = "${env.CHANGE_ID}"
PR_BRANCH = "${env.CHANGE_BRANCH}"
PR_BASE = "${env.CHANGE_TARGET}"
}
stages {
// Stage 1: Checkout the code (Relies on the initial SCM checkout done by Jenkins)
stage('Source Checkout') {
steps {
echo "Workspace already populated by the initial SCM checkout. Proceeding."
}
}
// Stage 2: Setup Node.js v20, install pnpm, and install required tools (curl, unzip)
stage('Setup Environment and Tools') {
steps {
sh '''
echo "Ensuring required utilities and Node.js are installed..."
sudo apt-get update
sudo apt-get install -y curl unzip nodejs
# 1. Install Node.js v20 (closest matching the specified version '20.17.0')
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
echo "Node.js version: \$(node -v)"
# 2. Install pnpm globally (version 8)
npm install -g pnpm@8
echo "pnpm version: \$(pnpm -v)"
'''
}
}
// Stage 3: Install dependencies and build the application
stage('Install and Build') {
steps {
sh 'pnpm install'
sh 'pnpm run build'
}
}
// Stage 4: Run SonarQube PR analysis: Install scanner locally, get version, and execute.
stage('SonarQube Pull Request Analysis') {
steps {
script {
// 1. Get the short 8-character commit SHA for project versioning
def commitShaShort = sh(returnStdout: true, script: 'git rev-parse --short=8 HEAD').trim()
echo "Commit SHA (short) is: ${commitShaShort}"
// --- 2. MANUALLY INSTALL THE SONAR SCANNER CLI LOCALLY ---
sh """
echo "Manually downloading and installing Sonar Scanner CLI..."
curl -sS -o sonar-scanner.zip \
"https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747.zip"
unzip -o -q sonar-scanner.zip -d .
"""
// 3. Find the extracted directory name and capture the full absolute executable path.
def scannerBinPath = sh(
returnStdout: true,
script: '''
SCANNER_DIR=$(find . -maxdepth 1 -type d -name "sonar-scanner*" | head -n 1)
# Get the full absolute path to the executable file
echo \$(pwd)/\${SCANNER_DIR}/bin/sonar-scanner
'''
).trim()
echo "Scanner executable path captured: ${scannerBinPath}"
// 4. Use withSonarQubeEnv to set up the secure variables (HOST and TOKEN)
withSonarQubeEnv(installationName: 'SonarQube-Server') {
// 5. Execute the scanner using the Groovy variable directly with PR parameters.
sh """
echo "Starting SonarQube Pull Request Analysis for PR #${PR_KEY}"
'${scannerBinPath}' \\
-Dsonar.projectVersion=${commitShaShort} \\
-Dsonar.sources=. \\
-Dsonar.pullrequest.key=${PR_KEY} \\
-Dsonar.pullrequest.branch=${PR_BRANCH} \\
-Dsonar.pullrequest.base=${PR_BASE}
# SONAR_HOST_URL and SONAR_TOKEN are automatically passed as environment variables
# by the withSonarQubeEnv block.
"""
}
}
}
}
}
}

798
LICENSE
View file

@ -1,201 +1,661 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
1. Definitions.
Preamble
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
The precise terms and conditions for copying, distribution and
modification follow.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
TERMS AND CONDITIONS
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
0. Definitions.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
"This License" refers to version 3 of the GNU Affero General Public License.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
A "covered work" means either the unmodified Program or a work based
on the Program.
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
1. Source Code.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
END OF TERMS AND CONDITIONS
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
APPENDIX: How to apply the Apache License to your work.
The Corresponding Source for a work in source code form is that
same work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
2. Basic Permissions.
Copyright 2024 Gitroom, LLC
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
http://www.apache.org/licenses/LICENSE-2.0
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Postiz - Social media schedule tool
Copyright (C) 2025 Nevo David
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.

113
README.md
View file

@ -1,42 +1,27 @@
<p align="center">
<a href="https://x.com/intent/follow?screen_name=nevodavid" target="_blank">
<img alt="Follow me" src="https://github.com/user-attachments/assets/1562c93f-95c6-4307-8a85-e62003e26348" />
</a>
<br />
<a href="https://devfest.ai" target="_blank">
<img alt="DevFest" src="https://github.com/user-attachments/assets/cab9a4e5-e88e-4a28-be7d-28ed749e537a" width="850" />
</a>
<br /><br />
</p>
<p align="center">
<a href="https://postiz.com" target="_blank">
<a href="https://postiz.com/" target="_blank">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/765e9d72-3ee7-4a56-9d59-a2c9befe2311">
<img alt="Novu Logo" src="https://github.com/user-attachments/assets/f0d30d70-dddb-4142-8876-e9aa6ed1cb99" width="280"/>
<img alt="Postiz Logo" src="https://github.com/user-attachments/assets/f0d30d70-dddb-4142-8876-e9aa6ed1cb99" width="280"/>
</picture>
</a>
</p>
<p align="center">
<a href="https://opensource.org/licenses/Apache-2.0">
<img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License">
<a href="https://opensource.org/license/agpl-v3">
<img src="https://img.shields.io/badge/License-AGPL%203.0-blue.svg" alt="License">
</a>
</p>
<h3 align="center"><strong><a href="https://github.com/gitroomhq/postiz-agent">NEW: check out Postiz agent CLI! perfect for OpenClaw and other agents</a></strong></h3>
<div align="center">
<strong>
<h2>Your ultimate AI social media scheduling tool</h2><br />
<a href="https://postiz.com">Postiz</a>: An alternative to: Buffer.com, Hypefury, Twitter Hunter, Etc...<br /><br />
<a href="https://postiz.com">Postiz</a>: An alternative to: Buffer.com, Hypefury, Twitter Hunter, etc...<br /><br />
</strong>
Postiz offers everything you need to manage your social media posts,<br />build an audience, capture leads, and grow your business.
</div>
<div class="flex" align="center">
<br />
<img alt="Instagram" src="https://postiz.com/svgs/socials/Instagram.svg" width="32">
@ -49,6 +34,10 @@
<img alt="Pinterest" src="https://postiz.com/svgs/socials/Pinterest.svg" width="32">
<img alt="Threads" src="https://postiz.com/svgs/socials/Threads.svg" width="32">
<img alt="X" src="https://postiz.com/svgs/socials/X.svg" width="32">
<img alt="Slack" src="https://postiz.com/svgs/socials/Slack.svg" width="32">
<img alt="Discord" src="https://postiz.com/svgs/socials/Discord.svg" width="32">
<img alt="Mastodon" src="https://postiz.com/svgs/socials/Mastodon.svg" width="32">
<img alt="Bluesky" src="https://postiz.com/svgs/socials/Bluesky.svg" width="32">
</div>
<p align="center">
@ -56,28 +45,51 @@
<a href="https://docs.postiz.com" rel="dofollow"><strong>Explore the docs »</strong></a>
<br />
<br/>
<a href="https://platform.postiz.com">Register</a>
·
<a href="https://discord.postiz.com">Join Our Discord</a>
·
<a href="https://twitter.com/nevodavid">X</a>
·
<a href="https://gitroom.com">Gitroom</a>
</p>
<br />
<br />
<a href="https://youtube.com/@postizofficial" rel="dofollow"><strong>Watch the YouTube Tutorials»</strong></a>
<br />
</p>
<p align="center">
<video src="https://github.com/user-attachments/assets/05436a01-19c8-4827-b57f-05a5e7637a67" width="100%" />
<a href="https://platform.postiz.com">Register</a>
·
<a href="https://discord.postiz.com">Join Our Discord (devs only)</a>
·
<a href="https://docs.postiz.com/public-api">Public API</a><br />
</p>
<p align="center">
<a href="https://www.npmjs.com/package/@postiz/node">NodeJS SDK</a>
·
<a href="https://www.npmjs.com/package/n8n-nodes-postiz">N8N custom node</a>
·
<a href="https://apps.make.com/postiz">Make.com integration</a>
</p>
<br /><br />
## 🔌 See the leading Postiz features
<p align="center">
<a href="https://www.youtube.com/watch?v=BdsCVvEYgHU" target="_blank">
<img alt="Postiz" src="https://github.com/user-attachments/assets/8b9b7939-da1a-4be5-95be-42c6fce772de" />
</a>
</p>
## ✨ Features
| ![Image 1](https://github.com/user-attachments/assets/a27ee220-beb7-4c7e-8c1b-2c44301f82ef) | ![Image 2](https://github.com/user-attachments/assets/eb5f5f15-ed90-47fc-811c-03ccba6fa8a2) |
|--------------------------------|--------------------------------|
| ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| ![Image 3](https://github.com/user-attachments/assets/d51786ee-ddd8-4ef8-8138-5192e9cfe7c3) | ![Image 4](https://github.com/user-attachments/assets/91f83c89-22f6-43d6-b7aa-d2d3378289fb) |
### Our Sponsors
| Sponsor | Logo | Description |
|---------|:-----------------------------------------------------------------------:|-----------------|
| [Hostinger](https://www.hostinger.com/vps/docker/postiz?ref=postiz) | <img src=".github/sponsors/hostinger.png" alt="Hostinger" width="500"/> | Hostinger is on a mission to make online success possible for anyone from developers to aspiring bloggers and business owners |
| [Virlo](https://dev.virlo.ai/?ref=postiz) | <img src="https://github.com/user-attachments/assets/25182598-5344-45fc-b9cd-e4cfa16aabfd" alt="Virlo" width="500"/> | Virlo is the #1 social media trend spotting and all-in-one GTM tool for teams leveraging short-form video |
# Intro
- Schedule all your social media posts (many AI features)
@ -85,30 +97,49 @@
- Collaborate with other team members to exchange or buy posts.
- Invite your team members to collaborate, comment, and schedule posts.
- At the moment there is no difference between the hosted version to the self-hosted version
- Perfect for automation (API) with platforms like N8N, Make.com, Zapier, etc.
## Tech Stack
- NX (Monorepo)
- Pnpm workspaces (Monorepo)
- NextJS (React)
- NestJS
- Prisma (Default to PostgreSQL)
- Redis (BullMQ)
- Temporal
- Resend (email notifications)
## Quick Start
To have the project up and running, please follow the [Quick Start Guide](https://docs.postiz.com/quickstart)
##
## Sponsor Postiz
We now give a few options to Sponsor Postiz:
- Just a donation: You like what we are building, and want to buy us some coffees so we can build faster.
- Main Repository: Get your logo with a backlink from the main Postiz repository. Postiz has almost 3m downloads and 20k views per month.
- Main Repository + Website: Get your logo on the central repository and the main website. Here are some metrics: - Website has 20k hits per month + 65 DR (strong backlink) - Repository has 20k hits per month + Almost 3m docker downloads.
# License
Link: https://opencollective.com/postiz
This repository's source code is available under the [Apache 2.0 License](LICENSE).
## Postiz Compliance
- Postiz is an open-source, self-hosted social media scheduling tool that supports platforms like X (formerly Twitter), Bluesky, Mastodon, Discord, and others.
- Postiz hosted service uses official, platform-approved OAuth flows.
- Postiz does not automate or scrape content from social media platforms.
- Postiz does not collect, store, or proxy API keys or access tokens from users.
- Postiz never ask users to paste API keys into our hosted product.
- Postiz Users always authenticate directly with the social platform (e.g., X, Discord, etc.), ensuring platform compliance and data privacy.
## Star History
[![Star History Chart](https://api.star-history.com/svg?repos=gitroomhq/postiz-app&type=date&legend=top-left)](https://www.star-history.com/#gitroomhq/postiz-app&type=date&legend=top-left)
## License
This repository's source code is available under the [AGPL-3.0 license](LICENSE).
<br /><br /><br />
<p align="center">
<a href="https://www.g2.com/products/postiz/take_survey" target="blank"><img alt="g2" src="https://github.com/user-attachments/assets/892cb74c-0b49-4589-b2f5-fbdbf7a98f66" /></a>
</p>

69
SECURITY.md Normal file
View file

@ -0,0 +1,69 @@
# Security Policy
## Introduction
The Postiz app is committed to ensuring the security and integrity of our users' data. This security policy outlines our procedures for handling security vulnerabilities and our disclosure policy.
## Scope
We, at Postiz (gitroomhq), cover the following scopes for vulnerability disclosures:
- The core repository for `postiz-app` (github.com/gitroomhq/postiz-app)
- All `gitroomhq` repositories that are official components, tooling, or integrations of Postiz
- Official Postiz container images published under `gitroomhq` on GHCR
- Official Postiz CLI tools and NPM packages (NPM org: @postiz)
- Postiz-Cloud related infrastructure & services. (API, Frontend, Configurations etc.)
- Plugins for Postiz maintained within the `gitroomhq` organization
Vulnerabilities in third-party dependencies or user-hosted infrastructure are outside of this scope.
## Supported Versions
This project currently only supports the latest release. We recommend that users always use the latest version of the Postiz app to ensure they have the latest security patches.
*CVE IDs will only be assigned to vulnerabilities affecting currently supported versions.*
## Reporting Security Vulnerabilities
If you discover a security vulnerability in the Postiz app, please report it through the [GitHub Security Advisory system](https://github.com/gitroomhq/postiz-app/security/advisories/new).
When reporting a security vulnerability, please provide as much detail as possible, including:
- A clear description of the vulnerability
- Proof of concept (PoC), where possible
- Steps to reproduce the vulnerability
- Any relevant code or configuration files
If the report has immediate urgency, please contact one (or more) of the maintainers via email:
- @egelhaus ([E-Mail](mailto:egelhaus@ennogelhaus.de))
### AI Reports
Reports that appear to be LLM-generated without meaningful human analysis — typically lacking a working proof of concept, reproducible steps, or accurate impact assessment — will be closed without detailed response.
Reports that include AI-assisted analysis are welcome provided they have been validated by the reporter and include a proof of concept, reproduction steps, and impact assessment.
## Disclosure Guidelines
We follow a private disclosure policy. If you discover a security vulnerability, please report it to us privately via GitHub Security Advisories, and if immediate urgency, via email as listed above. We will respond promptly to reports of vulnerabilities and work to resolve them as quickly as possible.
We will not publicly disclose security vulnerabilities until a patch or fix is available to prevent malicious actors from exploiting the vulnerability before a fix is released.
## Security Vulnerability Response Process
We take security vulnerabilities seriously and will respond promptly to reports of vulnerabilities. Our response process includes:
- Investigating the report and verifying the vulnerability.
- Developing a patch or fix for the vulnerability.
- Releasing the patch or fix as soon as possible.
- Notifying users of the vulnerability and the patch or fix.
## Response Timelines
We aim to follow these timelines:
- **Initial Acknowledgment:** Within 72 hours of initial report.
- **Completed Triage / Verification:** Within 7 days of initial acknowledgment.
- **Critical Issue Remediation:** Within 90 days of completed triage.
- **Non-Critical Issue Remediation:** Within 180 days of completed triage.
- **CVE Publication:** Within 24 hours of remediation release.

View file

@ -1,18 +0,0 @@
{
"extends": ["../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}

8
apps/backend/.gitignore vendored Normal file
View file

@ -0,0 +1,8 @@
dist/
node_modules/
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]

View file

@ -1,11 +0,0 @@
/* eslint-disable */
export default {
displayName: 'backend',
preset: '../../jest.preset.js',
testEnvironment: 'node',
transform: {
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
},
moduleFileExtensions: ['ts', 'js', 'html'],
coverageDirectory: '../../coverage/apps/backend',
};

View file

@ -0,0 +1,20 @@
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"monorepo": false,
"sourceRoot": "src",
"entryFile": "../../dist/backend/apps/backend/src/main",
"language": "ts",
"generateOptions": {
"spec": false
},
"compilerOptions": {
"manualRestart": true,
"tsConfigPath": "./tsconfig.build.json",
"webpack": false,
"deleteOutDir": true,
"assets": [],
"watchAssets": false,
"plugins": []
}
}

14
apps/backend/package.json Normal file
View file

@ -0,0 +1,14 @@
{
"name": "postiz-backend",
"version": "1.0.0",
"description": "",
"scripts": {
"dev": "dotenv -e ../../.env -- nest start --watch --entryFile=./apps/backend/src/main",
"build": "cross-env NODE_ENV=production nest build",
"start": "dotenv -e ../../.env -- node --experimental-require-module ./dist/apps/backend/src/main.js",
"pm2": "pm2 start pnpm --name backend -- start"
},
"keywords": [],
"author": "",
"license": "ISC"
}

View file

@ -1,65 +0,0 @@
{
"name": "backend",
"$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "apps/backend/src",
"projectType": "application",
"targets": {
"build": {
"executor": "@nx/webpack:webpack",
"outputs": ["{options.outputPath}"],
"defaultConfiguration": "production",
"options": {
"target": "node",
"compiler": "tsc",
"outputPath": "dist/apps/backend",
"main": "apps/backend/src/main.ts",
"tsConfig": "apps/backend/tsconfig.app.json",
"assets": ["apps/backend/src/assets"],
"webpackConfig": "apps/backend/webpack.config.js",
"transformers": [
{
"name": "@nestjs/swagger/plugin",
"options": {
"dtoFileNameSuffix": [".dto.ts"],
"controllerFileNameSuffix": [".controller.ts"],
"introspectComments": true,
"classValidatorShim": true
}
}
]
},
"configurations": {
"development": {},
"production": {}
}
},
"serve": {
"executor": "@nx/js:node",
"defaultConfiguration": "development",
"options": {
"buildTarget": "backend:build",
"inspect": false
},
"configurations": {
"development": {
"buildTarget": "backend:build:development"
},
"production": {
"buildTarget": "backend:build:production"
}
}
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": ["{options.outputFile}"]
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"options": {
"jestConfig": "apps/backend/jest.config.ts"
}
}
},
"tags": []
}

View file

@ -11,22 +11,39 @@ import { PermissionsService } from '@gitroom/backend/services/auth/permissions/p
import { IntegrationsController } from '@gitroom/backend/api/routes/integrations.controller';
import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager';
import { SettingsController } from '@gitroom/backend/api/routes/settings.controller';
import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service';
import { PostsController } from '@gitroom/backend/api/routes/posts.controller';
import { MediaController } from '@gitroom/backend/api/routes/media.controller';
import { UploadModule } from '@gitroom/nestjs-libraries/upload/upload.module';
import { ServeStaticModule } from '@nestjs/serve-static';
import { CommentsController } from '@gitroom/backend/api/routes/comments.controller';
import { BillingController } from '@gitroom/backend/api/routes/billing.controller';
import { NotificationsController } from '@gitroom/backend/api/routes/notifications.controller';
import { MarketplaceController } from '@gitroom/backend/api/routes/marketplace.controller';
import { MessagesController } from '@gitroom/backend/api/routes/messages.controller';
import { OpenaiService } from '@gitroom/nestjs-libraries/openai/openai.service';
import { ExtractContentService } from '@gitroom/nestjs-libraries/openai/extract.content.service';
import { CodesService } from '@gitroom/nestjs-libraries/services/codes.service';
import { CopilotController } from '@gitroom/backend/api/routes/copilot.controller';
import { AgenciesController } from '@gitroom/backend/api/routes/agencies.controller';
import { PublicController } from '@gitroom/backend/api/routes/public.controller';
import { RootController } from '@gitroom/backend/api/routes/root.controller';
import { TrackService } from '@gitroom/nestjs-libraries/track/track.service';
import { ShortLinkService } from '@gitroom/nestjs-libraries/short-linking/short.link.service';
import { Nowpayments } from '@gitroom/nestjs-libraries/crypto/nowpayments';
import { WebhookController } from '@gitroom/backend/api/routes/webhooks.controller';
import { SignatureController } from '@gitroom/backend/api/routes/signature.controller';
import { AutopostController } from '@gitroom/backend/api/routes/autopost.controller';
import { SetsController } from '@gitroom/backend/api/routes/sets.controller';
import { ThirdPartyController } from '@gitroom/backend/api/routes/third-party.controller';
import { MonitorController } from '@gitroom/backend/api/routes/monitor.controller';
import { NoAuthIntegrationsController } from '@gitroom/backend/api/routes/no.auth.integrations.controller';
import { EnterpriseController } from '@gitroom/backend/api/routes/enterprise.controller';
import { OAuthAppController } from '@gitroom/backend/api/routes/oauth-app.controller';
import { ApprovedAppsController } from '@gitroom/backend/api/routes/approved-apps.controller';
import { OAuthController, OAuthAuthorizedController } from '@gitroom/backend/api/routes/oauth.controller';
import { AnnouncementsController } from '@gitroom/backend/api/routes/announcements.controller';
import { AdminController } from '@gitroom/backend/api/routes/admin.controller';
import { AuthProviderManager } from '@gitroom/backend/services/auth/providers/providers.manager';
import { GithubProvider } from '@gitroom/backend/services/auth/providers/github.provider';
import { GoogleProvider } from '@gitroom/backend/services/auth/providers/google.provider';
import { FarcasterProvider } from '@gitroom/backend/services/auth/providers/farcaster.provider';
import { WalletProvider } from '@gitroom/backend/services/auth/providers/wallet.provider';
import { OauthProvider } from '@gitroom/backend/services/auth/providers/oauth.provider';
const authenticatedController = [
UsersController,
@ -35,34 +52,31 @@ const authenticatedController = [
SettingsController,
PostsController,
MediaController,
CommentsController,
BillingController,
NotificationsController,
MarketplaceController,
MessagesController,
CopilotController,
AgenciesController,
WebhookController,
SignatureController,
AutopostController,
SetsController,
ThirdPartyController,
OAuthAppController,
ApprovedAppsController,
OAuthAuthorizedController,
AnnouncementsController,
AdminController,
];
@Module({
imports: [
UploadModule,
...(!!process.env.UPLOAD_DIRECTORY &&
!!process.env.NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY
? [
ServeStaticModule.forRoot({
rootPath: process.env.UPLOAD_DIRECTORY,
serveRoot: '/' + process.env.NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY,
serveStaticOptions: {
index: false,
},
}),
]
: []),
],
imports: [UploadModule],
controllers: [
RootController,
StripeController,
AuthController,
PublicController,
MonitorController,
EnterpriseController,
NoAuthIntegrationsController,
OAuthController,
...authenticatedController,
],
providers: [
@ -75,6 +89,15 @@ const authenticatedController = [
PermissionsService,
CodesService,
IntegrationManager,
TrackService,
ShortLinkService,
Nowpayments,
AuthProviderManager,
GithubProvider,
GoogleProvider,
FarcasterProvider,
WalletProvider,
OauthProvider,
],
get exports() {
return [...this.imports, ...this.providers];

View file

@ -0,0 +1,47 @@
import {
Controller,
Get,
HttpException,
Query,
} from '@nestjs/common';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { User } from '@prisma/client';
import { ApiTags } from '@nestjs/swagger';
import { ErrorsService } from '@gitroom/nestjs-libraries/database/prisma/errors/errors.service';
@ApiTags('Admin')
@Controller('/admin')
export class AdminController {
constructor(private _errorsService: ErrorsService) {}
private assertSuperAdmin(user: User) {
if (!user?.isSuperAdmin) {
throw new HttpException('Unauthorized', 400);
}
}
@Get('/errors')
async listErrors(
@GetUserFromRequest() user: User,
@Query('page') page?: string,
@Query('limit') limit?: string,
@Query('platform') platform?: string,
@Query('email') email?: string,
@Query('unknownFirst') unknownFirst?: string
) {
this.assertSuperAdmin(user);
return this._errorsService.listErrors({
page: page ? parseInt(page, 10) : 0,
limit: limit ? parseInt(limit, 10) : 20,
platform: platform || undefined,
email: email || undefined,
unknownFirst: unknownFirst === 'true' || unknownFirst === '1',
});
}
@Get('/errors/platforms')
async listPlatforms(@GetUserFromRequest() user: User) {
this.assertSuperAdmin(user);
return this._errorsService.listPlatforms();
}
}

View file

@ -1,37 +0,0 @@
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import { User } from '@prisma/client';
import { ApiTags } from '@nestjs/swagger';
import { AgenciesService } from '@gitroom/nestjs-libraries/database/prisma/agencies/agencies.service';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { CreateAgencyDto } from '@gitroom/nestjs-libraries/dtos/agencies/create.agency.dto';
@ApiTags('Agencies')
@Controller('/agencies')
export class AgenciesController {
constructor(private _agenciesService: AgenciesService) {}
@Get('/')
async getAgencyByUser(@GetUserFromRequest() user: User) {
return (await this._agenciesService.getAgencyByUser(user)) || {};
}
@Post('/')
async createAgency(
@GetUserFromRequest() user: User,
@Body() body: CreateAgencyDto
) {
return this._agenciesService.createAgency(user, body);
}
@Post('/action/:action/:id')
async updateAgency(
@GetUserFromRequest() user: User,
@Param('action') action: string,
@Param('id') id: string
) {
if (!user.isSuperAdmin) {
return 400;
}
return this._agenciesService.approveOrDecline(user.email, action, id);
}
}

View file

@ -1,60 +1,17 @@
import {
Body,
Controller,
Get,
Inject,
Param,
Post,
Query,
} from '@nestjs/common';
import { Controller, Get, Param, Query } from '@nestjs/common';
import { Organization } from '@prisma/client';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { StarsService } from '@gitroom/nestjs-libraries/database/prisma/stars/stars.service';
import dayjs from 'dayjs';
import { StarsListDto } from '@gitroom/nestjs-libraries/dtos/analytics/stars.list.dto';
import { ApiTags } from '@nestjs/swagger';
import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service';
import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager';
import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service';
import { RefreshToken } from '@gitroom/nestjs-libraries/integrations/social.abstract';
import { timer } from '@gitroom/helpers/utils/timer';
import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service';
@ApiTags('Analytics')
@Controller('/analytics')
export class AnalyticsController {
constructor(
private _starsService: StarsService,
private _integrationService: IntegrationService,
private _integrationManager: IntegrationManager
private _postsService: PostsService
) {}
@Get('/')
async getStars(@GetOrgFromRequest() org: Organization) {
return this._starsService.getStars(org.id);
}
@Get('/trending')
async getTrending() {
const todayTrending = dayjs(dayjs().format('YYYY-MM-DDT12:00:00'));
const last = todayTrending.isAfter(dayjs())
? todayTrending.subtract(1, 'day')
: todayTrending;
const nextTrending = last.add(1, 'day');
return {
last: last.format('YYYY-MM-DD HH:mm:ss'),
predictions: nextTrending.format('YYYY-MM-DD HH:mm:ss'),
};
}
@Post('/stars')
async getStarsFilter(
@GetOrgFromRequest() org: Organization,
@Body() starsFilter: StarsListDto
) {
return {
stars: await this._starsService.getStarsFilter(org.id, starsFilter),
};
}
@Get('/:integration')
async getIntegration(
@ -64,4 +21,13 @@ export class AnalyticsController {
) {
return this._integrationService.checkAnalytics(org, integration, date);
}
@Get('/post/:postId')
async getPostAnalytics(
@GetOrgFromRequest() org: Organization,
@Param('postId') postId: string,
@Query('date') date: string
) {
return this._postsService.checkPostAnalytics(org.id, postId, +date);
}
}

View file

@ -0,0 +1,47 @@
import {
Body,
Controller,
Delete,
Get,
HttpException,
Param,
Post,
} from '@nestjs/common';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { User } from '@prisma/client';
import { ApiTags } from '@nestjs/swagger';
import { AnnouncementsService } from '@gitroom/nestjs-libraries/database/prisma/announcements/announcements.service';
import { AnnouncementDto } from '@gitroom/nestjs-libraries/dtos/announcements/announcements.dto';
@ApiTags('Announcements')
@Controller('/announcements')
export class AnnouncementsController {
constructor(private _announcementsService: AnnouncementsService) {}
@Get('/')
async getAnnouncements() {
return this._announcementsService.getAnnouncements();
}
@Post('/')
async createAnnouncement(
@GetUserFromRequest() user: User,
@Body() body: AnnouncementDto
) {
if (!user.isSuperAdmin) {
throw new HttpException('Unauthorized', 400);
}
return this._announcementsService.createAnnouncement(body);
}
@Delete('/:id')
async deleteAnnouncement(
@GetUserFromRequest() user: User,
@Param('id') id: string
) {
if (!user.isSuperAdmin) {
throw new HttpException('Unauthorized', 400);
}
return this._announcementsService.deleteAnnouncement(id);
}
}

View file

@ -0,0 +1,24 @@
import { Controller, Delete, Get, Param } from '@nestjs/common';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { User } from '@prisma/client';
import { ApiTags } from '@nestjs/swagger';
import { OAuthService } from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service';
@ApiTags('Approved Apps')
@Controller('/user/approved-apps')
export class ApprovedAppsController {
constructor(private _oauthService: OAuthService) {}
@Get('/')
async list(@GetUserFromRequest() user: User) {
return this._oauthService.getApprovedApps(user.id);
}
@Delete('/:id')
async revoke(
@GetUserFromRequest() user: User,
@Param('id') id: string
) {
return this._oauthService.revokeApp(user.id, id);
}
}

View file

@ -1,4 +1,13 @@
import { Body, Controller, Get, Param, Post, Req, Res } from '@nestjs/common';
import {
Body,
Controller,
Get,
Param,
Post,
Query,
Req,
Res,
} from '@nestjs/common';
import { Response, Request } from 'express';
import { CreateOrgUserDto } from '@gitroom/nestjs-libraries/dtos/auth/create.org.user.dto';
@ -6,18 +15,37 @@ import { LoginUserDto } from '@gitroom/nestjs-libraries/dtos/auth/login.user.dto
import { AuthService } from '@gitroom/backend/services/auth/auth.service';
import { ForgotReturnPasswordDto } from '@gitroom/nestjs-libraries/dtos/auth/forgot-return.password.dto';
import { ForgotPasswordDto } from '@gitroom/nestjs-libraries/dtos/auth/forgot.password.dto';
import { ResendActivationDto } from '@gitroom/nestjs-libraries/dtos/auth/resend-activation.dto';
import { ApiTags } from '@nestjs/swagger';
import { getCookieUrlFromDomain } from '@gitroom/helpers/subdomain/subdomain.management';
import { EmailService } from '@gitroom/nestjs-libraries/services/email.service';
import { RealIP } from 'nestjs-real-ip';
import { UserAgent } from '@gitroom/nestjs-libraries/user/user.agent';
import { Provider } from '@prisma/client';
import * as Sentry from '@sentry/nestjs';
@ApiTags('Auth')
@Controller('/auth')
export class AuthController {
constructor(private _authService: AuthService) {}
constructor(
private _authService: AuthService,
private _emailService: EmailService
) {}
@Get('/can-register')
async canRegister() {
return {
register: await this._authService.canRegister(Provider.LOCAL as string),
};
}
@Post('/register')
async register(
@Req() req: Request,
@Body() body: CreateOrgUserDto,
@Res({ passthrough: true }) response: Response
@Res({ passthrough: false }) response: Response,
@RealIP() ip: string,
@UserAgent() userAgent: string
) {
try {
const getOrgFromCookie = this._authService.getOrgFromCookie(
@ -27,10 +55,15 @@ export class AuthController {
const { jwt, addedOrg } = await this._authService.routeAuth(
body.provider,
body,
ip,
userAgent,
getOrgFromCookie
);
if (body.provider === 'LOCAL') {
const activationRequired =
body.provider === 'LOCAL' && this._emailService.hasProvider();
if (activationRequired) {
response.header('activate', 'true');
response.status(200).json({ activate: true });
return;
@ -38,27 +71,44 @@ export class AuthController {
response.cookie('auth', jwt, {
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
if (process.env.NOT_SECURED) {
response.header('auth', jwt);
}
if (typeof addedOrg !== 'boolean' && addedOrg?.organizationId) {
response.cookie('showorg', addedOrg.organizationId, {
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
if (process.env.NOT_SECURED) {
response.header('showorg', addedOrg.organizationId);
}
}
Sentry.metrics.count('new_user', 1);
response.header('onboarding', 'true');
response.status(200).json({
register: true,
});
} catch (e) {
} catch (e: any) {
response.status(400).send(e.message);
}
}
@ -67,7 +117,9 @@ export class AuthController {
async login(
@Req() req: Request,
@Body() body: LoginUserDto,
@Res({ passthrough: true }) response: Response
@Res({ passthrough: false }) response: Response,
@RealIP() ip: string,
@UserAgent() userAgent: string
) {
try {
const getOrgFromCookie = this._authService.getOrgFromCookie(
@ -77,32 +129,50 @@ export class AuthController {
const { jwt, addedOrg } = await this._authService.routeAuth(
body.provider,
body,
ip,
userAgent,
getOrgFromCookie
);
response.cookie('auth', jwt, {
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
if (process.env.NOT_SECURED) {
response.header('auth', jwt);
}
if (typeof addedOrg !== 'boolean' && addedOrg?.organizationId) {
response.cookie('showorg', addedOrg.organizationId, {
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
if (process.env.NOT_SECURED) {
response.header('showorg', addedOrg.organizationId);
}
}
response.header('reload', 'true');
response.status(200).json({
login: true,
});
} catch (e) {
} catch (e: any) {
response.status(400).send(e.message);
}
}
@ -129,52 +199,107 @@ export class AuthController {
};
}
@Get('/oauth-mobile-callback')
mobileCallback(
@Query('code') code: string,
@Query('state') state: string,
@Res({ passthrough: false }) response: Response
) {
const scheme = process.env.MOBILE_APP_SCHEME || 'postiz://auth/callback';
const params = new URLSearchParams();
if (code) params.set('code', code);
if (state) params.set('state', state);
return response.redirect(302, `${scheme}?${params.toString()}`);
}
@Get('/oauth/:provider')
async oauthLink(@Param('provider') provider: string) {
return this._authService.oauthLink(provider);
async oauthLink(@Param('provider') provider: string, @Query() query: any) {
return this._authService.oauthLink(provider, query);
}
@Post('/activate')
async activate(
@Body('code') code: string,
@Res({ passthrough: true }) response: Response
@Body('datafast_visitor_id') datafast_visitor_id: string,
@Res({ passthrough: false }) response: Response
) {
const activate = await this._authService.activate(code);
const activate = await this._authService.activate(
code,
datafast_visitor_id
);
if (!activate) {
return response.status(200).send({ can: false });
return response.status(200).json({ can: false });
}
response.cookie('auth', activate, {
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
if (process.env.NOT_SECURED) {
response.header('auth', activate);
}
response.header('onboarding', 'true');
return response.status(200).send({ can: true });
return response.status(200).json({ can: true });
}
@Post('/resend-activation')
async resendActivation(@Body() body: ResendActivationDto) {
try {
await this._authService.resendActivationEmail(body.email);
return {
success: true,
};
} catch (e: any) {
return {
success: false,
message: e.message,
};
}
}
@Post('/oauth/:provider/exists')
async oauthExists(
@Body('code') code: string,
@Body('redirect_uri') redirect_uri: string,
@Param('provider') provider: string,
@Res({ passthrough: true }) response: Response
@Res({ passthrough: false }) response: Response
) {
const { jwt, token } = await this._authService.checkExists(provider, code);
const { jwt, token } = await this._authService.checkExists(
provider,
code,
redirect_uri
);
if (token) {
return response.json({ token });
}
response.cookie('auth', jwt, {
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
if (process.env.NOT_SECURED) {
response.header('auth', jwt);
}
response.header('reload', 'true');
response.status(200).json({

View file

@ -0,0 +1,69 @@
import {
Body,
Controller,
Delete,
Get,
Param,
Post,
Put,
Query,
} from '@nestjs/common';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization } from '@prisma/client';
import { ApiTags } from '@nestjs/swagger';
import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability';
import { AutopostService } from '@gitroom/nestjs-libraries/database/prisma/autopost/autopost.service';
import { AutopostDto } from '@gitroom/nestjs-libraries/dtos/autopost/autopost.dto';
import { AuthorizationActions, Sections } from '@gitroom/backend/services/auth/permissions/permission.exception.class';
import { OnlyURL } from '@gitroom/nestjs-libraries/dtos/webhooks/webhooks.dto';
@ApiTags('Autopost')
@Controller('/autopost')
export class AutopostController {
constructor(private _autopostsService: AutopostService) {}
@Get('/')
async getAutoposts(@GetOrgFromRequest() org: Organization) {
return this._autopostsService.getAutoposts(org.id);
}
@Post('/')
@CheckPolicies([AuthorizationActions.Create, Sections.WEBHOOKS])
async createAutopost(
@GetOrgFromRequest() org: Organization,
@Body() body: AutopostDto
) {
return this._autopostsService.createAutopost(org.id, body);
}
@Put('/:id')
async updateAutopost(
@GetOrgFromRequest() org: Organization,
@Body() body: AutopostDto,
@Param('id') id: string
) {
return this._autopostsService.createAutopost(org.id, body, id);
}
@Delete('/:id')
async deleteAutopost(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
return this._autopostsService.deleteAutopost(org.id, id);
}
@Post('/:id/active')
async changeActive(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body('active') active: boolean
) {
return this._autopostsService.changeActive(org.id, id, active);
}
@Post('/send')
async sendWebhook(@Query() query: OnlyURL) {
return this._autopostsService.loadXML(query.url);
}
}

View file

@ -1,4 +1,4 @@
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import { Body, Controller, Get, HttpException, Param, Post, Req } from '@nestjs/common';
import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service';
import { StripeService } from '@gitroom/nestjs-libraries/services/stripe.service';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
@ -6,13 +6,19 @@ import { Organization, User } from '@prisma/client';
import { BillingSubscribeDto } from '@gitroom/nestjs-libraries/dtos/billing/billing.subscribe.dto';
import { ApiTags } from '@nestjs/swagger';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service';
import { Request } from 'express';
import { Nowpayments } from '@gitroom/nestjs-libraries/crypto/nowpayments';
import { AuthService } from '@gitroom/helpers/auth/auth.service';
@ApiTags('Billing')
@Controller('/billing')
export class BillingController {
constructor(
private _subscriptionService: SubscriptionService,
private _stripeService: StripeService
private _stripeService: StripeService,
private _notificationService: NotificationService,
private _nowpayments: Nowpayments
) {}
@Get('/check/:id')
@ -21,19 +27,73 @@ export class BillingController {
@Param('id') body: string
) {
return {
exists: !!(await this._subscriptionService.checkSubscription(
org.id,
body
)),
status: await this._stripeService.checkSubscription(org.id, body),
};
}
@Get('/check-discount')
async checkDiscount(@GetOrgFromRequest() org: Organization) {
return {
offerCoupon: !(await this._stripeService.checkDiscount(org.paymentId))
? false
: AuthService.signJWT({ discount: true }),
};
}
@Post('/apply-discount')
async applyDiscount(@GetOrgFromRequest() org: Organization) {
await this._stripeService.applyDiscount(org.paymentId);
}
@Post('/finish-trial')
async finishTrial(@GetOrgFromRequest() org: Organization) {
try {
await this._stripeService.finishTrial(org.paymentId);
} catch (err) {}
return {
finish: true,
};
}
@Get('/is-trial-finished')
async isTrialFinished(@GetOrgFromRequest() org: Organization) {
return {
finished: !org.isTrailing,
};
}
@Post('/embedded')
embedded(
@GetOrgFromRequest() org: Organization,
@GetUserFromRequest() user: User,
@Body() body: BillingSubscribeDto,
@Req() req: Request
) {
const uniqueId = req?.cookies?.track;
return this._stripeService.embedded(
uniqueId,
org.id,
user.id,
body,
org.allowTrial
);
}
@Post('/subscribe')
subscribe(
@GetOrgFromRequest() org: Organization,
@Body() body: BillingSubscribeDto
@GetUserFromRequest() user: User,
@Body() body: BillingSubscribeDto,
@Req() req: Request
) {
return this._stripeService.subscribe(org.id, body);
const uniqueId = req?.cookies?.track;
return this._stripeService.subscribe(
uniqueId,
org.id,
user.id,
body,
org.allowTrial
);
}
@Get('/portal')
@ -53,7 +113,18 @@ export class BillingController {
}
@Post('/cancel')
cancel(@GetOrgFromRequest() org: Organization) {
async cancel(
@GetOrgFromRequest() org: Organization,
@GetUserFromRequest() user: User,
@Body() body: { feedback: string }
) {
await this._notificationService.sendEmail(
process.env.EMAIL_FROM_ADDRESS,
'Subscription Cancelled',
`Organization ${org.name} has cancelled their subscription because: ${body.feedback}`,
user.email
);
return this._stripeService.setToCancel(org.id);
}
@ -73,6 +144,43 @@ export class BillingController {
return this._stripeService.lifetimeDeal(org.id, body.code);
}
@Get('/charges')
async getCharges(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() org: Organization
) {
if (!user.isSuperAdmin) {
throw new HttpException('Unauthorized', 400);
}
return this._stripeService.getCharges(org.id);
}
@Post('/refund-charges')
async refundCharges(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() org: Organization,
@Body() body: { chargeIds: string[] }
) {
if (!user.isSuperAdmin) {
throw new HttpException('Unauthorized', 400);
}
return this._stripeService.refundCharges(org.id, body.chargeIds);
}
@Post('/cancel-subscription')
async cancelSubscription(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() org: Organization
) {
if (!user.isSuperAdmin) {
throw new HttpException('Unauthorized', 400);
}
return this._stripeService.cancelSubscription(org.id);
}
@Post('/add-subscription')
async addSubscription(
@Body() body: { subscription: string },
@ -83,6 +191,15 @@ export class BillingController {
throw new Error('Unauthorized');
}
await this._subscriptionService.addSubscription(org.id, user.id, body.subscription);
await this._subscriptionService.addSubscription(
org.id,
user.id,
body.subscription
);
}
@Get('/crypto')
async crypto(@GetOrgFromRequest() org: Organization) {
return this._nowpayments.createPaymentPage(org.id);
}
}

View file

@ -1,82 +0,0 @@
import {Body, Controller, Delete, Get, Param, Post, Put} from '@nestjs/common';
import { CommentsService } from '@gitroom/nestjs-libraries/database/prisma/comments/comments.service';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization, User } from '@prisma/client';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { AddCommentDto } from '@gitroom/nestjs-libraries/dtos/comments/add.comment.dto';
import {ApiTags} from "@nestjs/swagger";
@ApiTags('Comments')
@Controller('/comments')
export class CommentsController {
constructor(private _commentsService: CommentsService) {}
@Post('/')
addComment(
@GetOrgFromRequest() org: Organization,
@GetUserFromRequest() user: User,
@Body() addCommentDto: AddCommentDto
) {
return this._commentsService.addAComment(
org.id,
user.id,
addCommentDto.content,
addCommentDto.date
);
}
@Post('/:id')
addCommentTocComment(
@GetOrgFromRequest() org: Organization,
@GetUserFromRequest() user: User,
@Body() addCommentDto: AddCommentDto,
@Param('id') id: string
) {
return this._commentsService.addACommentToComment(
org.id,
user.id,
id,
addCommentDto.content,
addCommentDto.date
);
}
@Put('/:id')
editComment(
@GetOrgFromRequest() org: Organization,
@GetUserFromRequest() user: User,
@Body() addCommentDto: AddCommentDto,
@Param('id') id: string
) {
return this._commentsService.updateAComment(
org.id,
user.id,
id,
addCommentDto.content
);
}
@Delete('/:id')
deleteComment(
@GetOrgFromRequest() org: Organization,
@GetUserFromRequest() user: User,
@Param('id') id: string
) {
return this._commentsService.deleteAComment(
org.id,
user.id,
id,
);
}
@Get('/:date')
loadAllCommentsAndSubCommentsForADate(
@GetOrgFromRequest() org: Organization,
@Param('date') date: string
) {
return this._commentsService.loadAllCommentsAndSubCommentsForADate(
org.id,
date
);
}
}

View file

@ -1,37 +1,154 @@
import { Controller, Get, Post, Req, Res } from '@nestjs/common';
import {
Logger,
Controller,
Get,
Post,
Req,
Res,
Query,
Param,
} from '@nestjs/common';
import {
CopilotRuntime,
OpenAIAdapter,
copilotRuntimeNestEndpoint,
copilotRuntimeNodeHttpEndpoint,
copilotRuntimeNextJSAppRouterEndpoint,
} from '@copilotkit/runtime';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization } from '@prisma/client';
import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service';
import { MastraAgent } from '@ag-ui/mastra';
import { MastraService } from '@gitroom/nestjs-libraries/chat/mastra.service';
import { Request, Response } from 'express';
import { RequestContext } from '@mastra/core/di';
import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability';
import { AuthorizationActions, Sections } from '@gitroom/backend/services/auth/permissions/permission.exception.class';
export type ChannelsContext = {
integrations: string;
organization: string;
ui: string;
};
@Controller('/copilot')
export class CopilotController {
constructor(private _subscriptionService: SubscriptionService) {}
constructor(
private _subscriptionService: SubscriptionService,
private _mastraService: MastraService
) {}
@Post('/chat')
chat(@Req() req: Request, @Res() res: Response) {
const copilotRuntimeHandler = copilotRuntimeNestEndpoint({
chatAgent(@Req() req: Request, @Res() res: Response) {
if (
process.env.OPENAI_API_KEY === undefined ||
process.env.OPENAI_API_KEY === ''
) {
Logger.warn('OpenAI API key not set, chat functionality will not work');
return;
}
const copilotRuntimeHandler = copilotRuntimeNodeHttpEndpoint({
endpoint: '/copilot/chat',
runtime: new CopilotRuntime(),
serviceAdapter: new OpenAIAdapter({
model:
// @ts-ignore
req?.body?.variables?.data?.metadata?.requestType ===
'TextareaCompletion'
? 'gpt-4o-mini'
: 'gpt-4o-2024-08-06',
model: 'gpt-4.1',
}),
});
// @ts-ignore
return copilotRuntimeHandler(req, res);
}
@Post('/agent')
@CheckPolicies([AuthorizationActions.Create, Sections.AI])
async agent(
@Req() req: Request,
@Res() res: Response,
@GetOrgFromRequest() organization: Organization
) {
if (
process.env.OPENAI_API_KEY === undefined ||
process.env.OPENAI_API_KEY === ''
) {
Logger.warn('OpenAI API key not set, chat functionality will not work');
return;
}
const mastra = await this._mastraService.mastra();
const requestContext = new RequestContext<ChannelsContext>();
requestContext.set(
'integrations',
req?.body?.variables?.properties?.integrations || []
);
requestContext.set('organization', JSON.stringify(organization));
requestContext.set('ui', 'true');
const agents = MastraAgent.getLocalAgents({
resourceId: organization.id,
mastra,
requestContext: requestContext as any,
});
const runtime = new CopilotRuntime({
agents,
});
const copilotRuntimeHandler = copilotRuntimeNextJSAppRouterEndpoint({
endpoint: '/copilot/agent',
runtime,
// properties: req.body.variables.properties,
serviceAdapter: new OpenAIAdapter({
model: 'gpt-4.1',
}),
});
return copilotRuntimeHandler.handleRequest(req, res);
}
@Get('/credits')
calculateCredits(@GetOrgFromRequest() organization: Organization) {
return this._subscriptionService.checkCredits(organization);
calculateCredits(
@GetOrgFromRequest() organization: Organization,
@Query('type') type: 'ai_images' | 'ai_videos'
) {
return this._subscriptionService.checkCredits(
organization,
type || 'ai_images'
);
}
@Get('/:thread/list')
@CheckPolicies([AuthorizationActions.Create, Sections.AI])
async getMessagesList(
@GetOrgFromRequest() organization: Organization,
@Param('thread') threadId: string
): Promise<any> {
const mastra = await this._mastraService.mastra();
const memory = await mastra.getAgent('postiz').getMemory();
try {
return await memory.recall({
resourceId: organization.id,
threadId,
});
} catch (err) {
return { messages: [] };
}
}
@Get('/list')
@CheckPolicies([AuthorizationActions.Create, Sections.AI])
async getList(@GetOrgFromRequest() organization: Organization) {
const mastra = await this._mastraService.mastra();
const memory = await mastra.getAgent('postiz').getMemory();
const list = await memory.listThreads({
filter: { resourceId: organization.id },
perPage: 100000,
page: 0,
orderBy: { field: 'createdAt', direction: 'DESC' },
});
return {
threads: list.threads.map((p) => ({
id: p.id,
title: p.title,
})),
};
}
}

View file

@ -0,0 +1,128 @@
import { Body, Controller, Param, Post, Res } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { AuthService } from '@gitroom/helpers/auth/auth.service';
import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service';
import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager';
import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service';
import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service';
import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service';
@ApiTags('Enterprise')
@Controller('/enterprise')
export class EnterpriseController {
constructor(
private _integrationManager: IntegrationManager,
private _organizationService: OrganizationService,
private _integrationService: IntegrationService,
private _postsService: PostsService
) {}
@Post('/create-user')
async createUser(@Body('params') params: string) {
try {
const { id, name, saasName, email } = AuthService.verifyJWT(params) as {
id: string;
name: string;
email: string;
saasName: string;
};
try {
return await this._organizationService.createMaxUser(
id,
name,
saasName,
email
);
} catch (err) {
return { create: false };
}
} catch (err) {
return { success: false };
}
}
@Post('/url')
async redirectParams(@Body('params') params: string) {
try {
const load = AuthService.verifyJWT(params) as {
redirectUrl: string;
apiKey: string;
refreshId?: string;
provider: string;
webhookUrl: string;
};
if (!load || !load.redirectUrl || !load.apiKey || !load.provider) {
return;
}
const org = await this._organizationService.getOrgByApiKey(load.apiKey);
if (!org) {
throw new Error('Organization not found');
}
if (
!this._integrationManager
.getAllowedSocialsIntegrations()
.includes(load.provider)
) {
throw new Error('Integration not allowed');
}
const integrationProvider = this._integrationManager.getSocialIntegration(
load.provider
);
const { codeVerifier, state, url } =
await integrationProvider.generateAuthUrl();
if (load.refreshId) {
await ioRedis.set(`refresh:${state}`, load.refreshId, 'EX', 3600);
}
await ioRedis.set(`webhookUrl:${state}`, load.webhookUrl, 'EX', 3600);
await ioRedis.set(`redirect:${state}`, load.redirectUrl, 'EX', 3600);
await ioRedis.set(`organization:${state}`, org.id, 'EX', 3600);
await ioRedis.set(`login:${state}`, codeVerifier, 'EX', 3600);
return url;
} catch (err) {}
}
@Post('/delete-channel')
async deleteChannel(@Body('params') params: string) {
try {
const load = AuthService.verifyJWT(params) as {
apiKey: string;
id: string;
};
if (!load || !load.apiKey || !load.id) {
return { success: false };
}
const org = await this._organizationService.getOrgByApiKey(load.apiKey);
if (!org) {
return { success: false };
}
const isTherePosts = await this._integrationService.getPostsForChannel(
org.id,
load.id
);
if (isTherePosts.length) {
for (const post of isTherePosts) {
this._postsService.deletePost(org.id, post.group).catch(() => {});
}
}
await this._integrationService.deleteChannel(org.id, load.id);
return { success: true };
} catch (err) {
return { success: false };
}
}
}

View file

@ -5,28 +5,33 @@ import {
Get,
Param,
Post,
Put,
Query,
UseFilters,
} from '@nestjs/common';
import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service';
import { ConnectIntegrationDto } from '@gitroom/nestjs-libraries/dtos/integrations/connect.integration.dto';
import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager';
import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization, User } from '@prisma/client';
import { ApiKeyDto } from '@gitroom/nestjs-libraries/dtos/integrations/api.key.dto';
import { IntegrationFunctionDto } from '@gitroom/nestjs-libraries/dtos/integrations/integration.function.dto';
import {
AuthorizationActions,
Sections,
} from '@gitroom/backend/services/auth/permissions/permissions.service';
import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability';
import { pricing } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/pricing';
import { ApiTags } from '@nestjs/swagger';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { NotEnoughScopesFilter } from '@gitroom/nestjs-libraries/integrations/integration.missing.scopes';
import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service';
import { IntegrationTimeDto } from '@gitroom/nestjs-libraries/dtos/integrations/integration.time.dto';
import { PlugDto } from '@gitroom/nestjs-libraries/dtos/plugs/plug.dto';
import { RefreshToken } from '@gitroom/nestjs-libraries/integrations/social.abstract';
import { timer } from '@gitroom/helpers/utils/timer';
import { TelegramProvider } from '@gitroom/nestjs-libraries/integrations/social/telegram.provider';
import { MoltbookProvider } from '@gitroom/nestjs-libraries/integrations/social/moltbook.provider';
import {
AuthorizationActions,
Sections,
} from '@gitroom/backend/services/auth/permissions/permission.exception.class';
import { uniqBy } from 'lodash';
import { RefreshIntegrationService } from '@gitroom/nestjs-libraries/integrations/refresh.integration.service';
@ApiTags('Integrations')
@Controller('/integrations')
@ -34,33 +39,142 @@ export class IntegrationsController {
constructor(
private _integrationManager: IntegrationManager,
private _integrationService: IntegrationService,
private _postService: PostsService
private _postService: PostsService,
private _refreshIntegrationService: RefreshIntegrationService
) {}
@Get('/')
getIntegration() {
return this._integrationManager.getAllIntegrations();
@Post('/provider/:id/connect')
@CheckPolicies([AuthorizationActions.Create, Sections.CHANNEL])
async saveProviderPage(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body() body: any
) {
return this._integrationService.saveProviderPage(org.id, id, body);
}
@Get('/:identifier/internal-plugs')
getInternalPlugs(@Param('identifier') identifier: string) {
return this._integrationManager.getInternalPlugs(identifier);
}
@Get('/customers')
getCustomers(@GetOrgFromRequest() org: Organization) {
return this._integrationService.customers(org.id);
}
@Put('/:id/group')
async updateIntegrationGroup(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body() body: { group: string }
) {
return this._integrationService.updateIntegrationGroup(
org.id,
id,
body.group
);
}
@Put('/:id/customer-name')
async updateOnCustomerName(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body() body: { name: string }
) {
return this._integrationService.updateOnCustomerName(org.id, id, body.name);
}
@Get('/list')
async getIntegrationList(@GetOrgFromRequest() org: Organization) {
return {
integrations: (
await this._integrationService.getIntegrationsList(org.id)
).map((p) => ({
name: p.name,
id: p.id,
internalId: p.internalId,
disabled: p.disabled,
picture: p.picture,
identifier: p.providerIdentifier,
inBetweenSteps: p.inBetweenSteps,
refreshNeeded: p.refreshNeeded,
type: p.type,
time: JSON.parse(p.postingTimes)
})),
integrations: await Promise.all(
(
await this._integrationService.getIntegrationsList(org.id)
).map(async (p) => {
const findIntegration = this._integrationManager.getSocialIntegration(
p.providerIdentifier
);
return {
name: p.name,
id: p.id,
internalId: p.internalId,
disabled: p.disabled,
editor: findIntegration.editor,
stripLinks: !!findIntegration?.stripLinks?.(),
picture: p.picture || '/no-picture.jpg',
identifier: p.providerIdentifier,
inBetweenSteps: p.inBetweenSteps,
refreshNeeded: p.refreshNeeded,
isCustomFields: !!findIntegration.customFields,
...(findIntegration.customFields
? { customFields: await findIntegration.customFields() }
: {}),
display: p.profile,
type: p.type,
time: JSON.parse(p.postingTimes),
changeProfilePicture: !!findIntegration?.changeProfilePicture,
changeNickName: !!findIntegration?.changeNickname,
customer: p.customer,
additionalSettings: p.additionalSettings || '[]',
};
})
),
};
}
@Post('/:id/settings')
async updateProviderSettings(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body('additionalSettings') body: string
) {
if (typeof body !== 'string') {
throw new Error('Invalid body');
}
await this._integrationService.updateProviderSettings(org.id, id, body);
}
@Post('/:id/nickname')
async setNickname(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body() body: { name: string; picture: string }
) {
const integration = await this._integrationService.getIntegrationById(
org.id,
id
);
if (!integration) {
throw new Error('Invalid integration');
}
const manager = this._integrationManager.getSocialIntegration(
integration.providerIdentifier
);
if (!manager.changeProfilePicture && !manager.changeNickname) {
throw new Error('Invalid integration');
}
const { url } = manager.changeProfilePicture
? await manager.changeProfilePicture(
integration.internalId,
integration.token,
body.picture
)
: { url: '' };
const { name } = manager.changeNickname
? await manager.changeNickname(
integration.internalId,
integration.token,
body.name
)
: { name: '' };
return this._integrationService.updateNameAndUrl(id, name, url);
}
@Get('/:id')
getSingleIntegration(
@Param('id') id: string,
@ -80,7 +194,11 @@ export class IntegrationsController {
@CheckPolicies([AuthorizationActions.Create, Sections.CHANNEL])
async getIntegrationUrl(
@Param('integration') integration: string,
@Query('refresh') refresh: string
@Query('refresh') refresh: string,
@Query('externalUrl') externalUrl: string,
@Query('redirectUrl') redirectUrl: string,
@Query('onboarding') onboarding: string,
@GetOrgFromRequest() org: Organization
) {
if (
!this._integrationManager
@ -92,11 +210,47 @@ export class IntegrationsController {
const integrationProvider =
this._integrationManager.getSocialIntegration(integration);
const { codeVerifier, state, url } =
await integrationProvider.generateAuthUrl(refresh);
await ioRedis.set(`login:${state}`, codeVerifier, 'EX', 300);
return { url };
if (integrationProvider.externalUrl && !externalUrl) {
throw new Error('Missing external url');
}
try {
const getExternalUrl = integrationProvider.externalUrl
? {
...(await integrationProvider.externalUrl(externalUrl)),
instanceUrl: externalUrl,
}
: undefined;
const { codeVerifier, state, url } =
await integrationProvider.generateAuthUrl(getExternalUrl);
if (refresh) {
await ioRedis.set(`refresh:${state}`, refresh, 'EX', 3600);
}
if (onboarding === 'true') {
await ioRedis.set(`onboarding:${state}`, 'true', 'EX', 3600);
}
if (redirectUrl) {
await ioRedis.set(`redirect:${state}`, redirectUrl, 'EX', 3600);
}
await ioRedis.set(`organization:${state}`, org.id, 'EX', 3600);
await ioRedis.set(`login:${state}`, codeVerifier, 'EX', 3600);
await ioRedis.set(
`external:${state}`,
JSON.stringify(getExternalUrl),
'EX',
3600
);
return { url };
} catch (err) {
return { err: true };
}
}
@Post('/:id/time')
@ -107,8 +261,9 @@ export class IntegrationsController {
) {
return this._integrationService.setTimes(org.id, id, body);
}
@Post('/function')
async functionIntegration(
@Post('/mentions')
async mentions(
@GetOrgFromRequest() org: Organization,
@Body() body: IntegrationFunctionDto
) {
@ -120,137 +275,107 @@ export class IntegrationsController {
throw new Error('Invalid integration');
}
if (getIntegration.type === 'social') {
const integrationProvider = this._integrationManager.getSocialIntegration(
getIntegration.providerIdentifier
let newList: any[] | { none: true } = [];
try {
newList = (await this.functionIntegration(org, body)) || [];
} catch (err) {
console.log(err);
}
if (!Array.isArray(newList) && newList?.none) {
return newList;
}
const list = await this._integrationService.getMentions(
getIntegration.providerIdentifier,
body?.data?.query
);
if (Array.isArray(newList) && newList.length) {
await this._integrationService.insertMentions(
getIntegration.providerIdentifier,
newList
.map((p: any) => ({
name: p.label || '',
username: p.id || '',
image: p.image || '',
doNotCache: p.doNotCache || false,
}))
.filter((f: any) => f.name && !f.doNotCache)
);
if (!integrationProvider) {
throw new Error('Invalid provider');
}
if (integrationProvider[body.name]) {
return integrationProvider[body.name](getIntegration.token, body.data);
}
throw new Error('Function not found');
}
if (getIntegration.type === 'article') {
const integrationProvider =
this._integrationManager.getArticlesIntegration(
getIntegration.providerIdentifier
return uniqBy(
[
...list.map((p) => ({
id: p.username,
image: p.image,
label: p.name,
})),
...(newList as any[]),
],
(p) => p.id
).filter((f) => f.label && f.id);
}
@Post('/function')
async functionIntegration(
@GetOrgFromRequest() org: Organization,
@Body() body: IntegrationFunctionDto
): Promise<any> {
const getIntegration = await this._integrationService.getIntegrationById(
org.id,
body.id
);
if (!getIntegration) {
throw new Error('Invalid integration');
}
const integrationProvider = this._integrationManager.getSocialIntegration(
getIntegration.providerIdentifier
);
if (!integrationProvider) {
throw new Error('Invalid provider');
}
// @ts-ignore
if (integrationProvider[body.name]) {
try {
// @ts-ignore
const load = await integrationProvider[body.name](
getIntegration.token,
body.data,
getIntegration.internalId,
getIntegration
);
if (!integrationProvider) {
throw new Error('Invalid provider');
return load;
} catch (err) {
if (err instanceof RefreshToken) {
const data = await this._refreshIntegrationService.refresh(
getIntegration
);
if (!data) {
return;
}
const { accessToken } = data;
if (accessToken) {
if (integrationProvider.refreshWait) {
await timer(10000);
}
return this.functionIntegration(org, body);
}
return false;
}
return false;
}
if (integrationProvider[body.name]) {
return integrationProvider[body.name](getIntegration.token, body.data);
}
throw new Error('Function not found');
}
}
@Post('/article/:integration/connect')
@CheckPolicies([AuthorizationActions.Create, Sections.CHANNEL])
async connectArticle(
@GetOrgFromRequest() org: Organization,
@Param('integration') integration: string,
@Body() api: ApiKeyDto
) {
if (
!this._integrationManager
.getAllowedArticlesIntegrations()
.includes(integration)
) {
throw new Error('Integration not allowed');
}
if (!api) {
throw new Error('Missing api');
}
const integrationProvider =
this._integrationManager.getArticlesIntegration(integration);
const { id, name, token, picture, username } =
await integrationProvider.authenticate(api.api);
if (!id) {
throw new Error('Invalid api key');
}
return this._integrationService.createOrUpdateIntegration(
org.id,
name,
picture,
'article',
String(id),
integration,
token,
'',
undefined,
username,
false
);
}
@Post('/social/:integration/connect')
@CheckPolicies([AuthorizationActions.Create, Sections.CHANNEL])
@UseFilters(new NotEnoughScopesFilter())
async connectSocialMedia(
@GetOrgFromRequest() org: Organization,
@Param('integration') integration: string,
@Body() body: ConnectIntegrationDto
) {
if (
!this._integrationManager
.getAllowedSocialsIntegrations()
.includes(integration)
) {
throw new Error('Integration not allowed');
}
const getCodeVerifier = await ioRedis.get(`login:${body.state}`);
if (!getCodeVerifier) {
throw new Error('Invalid state');
}
await ioRedis.del(`login:${body.state}`);
const integrationProvider =
this._integrationManager.getSocialIntegration(integration);
const {
accessToken,
expiresIn,
refreshToken,
id,
name,
picture,
username,
} = await integrationProvider.authenticate({
code: body.code,
codeVerifier: getCodeVerifier,
refresh: body.refresh,
});
if (!id) {
throw new Error('Invalid api key');
}
return this._integrationService.createOrUpdateIntegration(
org.id,
name,
picture,
'social',
String(id),
integration,
accessToken,
refreshToken,
expiresIn,
username,
integrationProvider.isBetweenSteps,
body.refresh,
+body.timezone
);
throw new Error('Function not found');
}
@Post('/disable')
@ -261,33 +386,6 @@ export class IntegrationsController {
return this._integrationService.disableChannel(org.id, id);
}
@Post('/instagram/:id')
async saveInstagram(
@Param('id') id: string,
@Body() body: { pageId: string; id: string },
@GetOrgFromRequest() org: Organization
) {
return this._integrationService.saveInstagram(org.id, id, body);
}
@Post('/facebook/:id')
async saveFacebook(
@Param('id') id: string,
@Body() body: { page: string },
@GetOrgFromRequest() org: Organization
) {
return this._integrationService.saveFacebook(org.id, id, body.page);
}
@Post('/linkedin-page/:id')
async saveLinkedin(
@Param('id') id: string,
@Body() body: { page: string },
@GetOrgFromRequest() org: Organization
) {
return this._integrationService.saveLinkedin(org.id, id, body.page);
}
@Post('/enable')
enableChannel(
@GetOrgFromRequest() org: Organization,
@ -312,10 +410,72 @@ export class IntegrationsController {
);
if (isTherePosts.length) {
for (const post of isTherePosts) {
await this._postService.deletePost(org.id, post.group);
this._postService.deletePost(org.id, post.group).catch((err) => {});
}
}
return this._integrationService.deleteChannel(org.id, id);
}
@Get('/plug/list')
async getPlugList() {
return { plugs: this._integrationManager.getAllPlugs() };
}
@Get('/:id/plugs')
async getPlugsByIntegrationId(
@Param('id') id: string,
@GetOrgFromRequest() org: Organization
) {
return this._integrationService.getPlugsByIntegrationId(org.id, id);
}
@Post('/:id/plugs')
async postPlugsByIntegrationId(
@Param('id') id: string,
@GetOrgFromRequest() org: Organization,
@Body() body: PlugDto
) {
return this._integrationService.createOrUpdatePlug(org.id, id, body);
}
@Put('/plugs/:id/activate')
async changePlugActivation(
@Param('id') id: string,
@GetOrgFromRequest() org: Organization,
@Body('status') status: boolean
) {
return this._integrationService.changePlugActivation(org.id, id, status);
}
@Get('/telegram/updates')
async getUpdates(@Query() query: { word: string; id?: number }) {
return new TelegramProvider().getBotId(query);
}
@Post('/moltbook/register')
async moltbookRegister(@Body() body: { name: string; description: string }) {
try {
const provider = new MoltbookProvider();
const result = await provider.registerAgent(body.name, body.description);
return {
apiKey: result.api_key,
claimUrl: result.claim_url,
verificationCode: result.verification_code,
};
} catch (err: any) {
return { error: err.message || 'Registration failed' };
}
}
@Get('/moltbook/status')
async moltbookStatus(@Query('apiKey') apiKey: string) {
try {
const provider = new MoltbookProvider();
const result = await provider.checkAgentStatus(apiKey);
return { claimed: result?.status === 'claimed' };
} catch (err) {
return { claimed: false };
}
}
}

View file

@ -1,231 +0,0 @@
import { Body, Controller, Get, Param, Post, Query } from '@nestjs/common';
import { Organization, User } from '@prisma/client';
import { ApiTags } from '@nestjs/swagger';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { ItemUserService } from '@gitroom/nestjs-libraries/database/prisma/marketplace/item.user.service';
import { AddRemoveItemDto } from '@gitroom/nestjs-libraries/dtos/marketplace/add.remove.item.dto';
import { StripeService } from '@gitroom/nestjs-libraries/services/stripe.service';
import { UsersService } from '@gitroom/nestjs-libraries/database/prisma/users/users.service';
import { ChangeActiveDto } from '@gitroom/nestjs-libraries/dtos/marketplace/change.active.dto';
import { ItemsDto } from '@gitroom/nestjs-libraries/dtos/marketplace/items.dto';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { AudienceDto } from '@gitroom/nestjs-libraries/dtos/marketplace/audience.dto';
import { NewConversationDto } from '@gitroom/nestjs-libraries/dtos/marketplace/new.conversation.dto';
import { MessagesService } from '@gitroom/nestjs-libraries/database/prisma/marketplace/messages.service';
import { CreateOfferDto } from '@gitroom/nestjs-libraries/dtos/marketplace/create.offer.dto';
import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service';
@ApiTags('Marketplace')
@Controller('/marketplace')
export class MarketplaceController {
constructor(
private _itemUserService: ItemUserService,
private _stripeService: StripeService,
private _userService: UsersService,
private _messagesService: MessagesService,
private _postsService: PostsService
) {}
@Post('/')
getInfluencers(
@GetOrgFromRequest() organization: Organization,
@GetUserFromRequest() user: User,
@Body() body: ItemsDto
) {
return this._userService.getMarketplacePeople(
organization.id,
user.id,
body
);
}
@Post('/conversation')
createConversation(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization,
@Body() body: NewConversationDto
) {
return this._messagesService.createConversation(
user.id,
organization.id,
body
);
}
@Get('/bank')
connectBankAccount(
@GetUserFromRequest() user: User,
@Query('country') country: string
) {
return this._stripeService.createAccountProcess(user.id, user.email, country);
}
@Post('/item')
async addItems(
@GetUserFromRequest() user: User,
@Body() body: AddRemoveItemDto
) {
return this._itemUserService.addOrRemoveItem(body.state, user.id, body.key);
}
@Post('/active')
async changeActive(
@GetUserFromRequest() user: User,
@Body() body: ChangeActiveDto
) {
await this._userService.changeMarketplaceActive(user.id, body.active);
}
@Post('/audience')
async changeAudience(
@GetUserFromRequest() user: User,
@Body() body: AudienceDto
) {
await this._userService.changeAudienceSize(user.id, body.audience);
}
@Get('/item')
async getItems(@GetUserFromRequest() user: User) {
return this._itemUserService.getItems(user.id);
}
@Get('/orders')
async getOrders(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization,
@Query('type') type: 'seller' | 'buyer'
) {
return this._messagesService.getOrders(user.id, organization.id, type);
}
@Get('/account')
async getAccount(@GetUserFromRequest() user: User) {
const { account, marketplace, connectedAccount, name, picture, audience } =
await this._userService.getUserByEmail(user.email);
return {
account,
marketplace,
connectedAccount,
fullname: name,
audience,
picture,
};
}
@Post('/offer')
async createOffer(
@GetUserFromRequest() user: User,
@Body() body: CreateOfferDto
) {
return this._messagesService.createOffer(user.id, body);
}
@Get('/posts/:id')
async post(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization,
@Param('id') id: string
) {
const getPost = await this._messagesService.getPost(user.id, organization.id, id);
if (!getPost) {
return ;
}
return {...await this._postsService.getPost(getPost.organizationId, id), providerId: getPost.integration.providerIdentifier};
}
@Post('/posts/:id/revision')
async revision(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization,
@Param('id') id: string,
@Body('message') message: string
) {
return this._messagesService.requestRevision(
user.id,
organization.id,
id,
message
);
}
@Post('/posts/:id/approve')
async approve(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization,
@Param('id') id: string,
@Body('message') message: string
) {
return this._messagesService.requestApproved(
user.id,
organization.id,
id,
message
);
}
@Post('/posts/:id/cancel')
async cancel(
@GetOrgFromRequest() organization: Organization,
@Param('id') id: string
) {
return this._messagesService.requestCancel(organization.id, id);
}
@Post('/offer/:id/complete')
async completeOrder(
@GetOrgFromRequest() organization: Organization,
@Param('id') id: string
) {
const order = await this._messagesService.completeOrderAndPay(
organization.id,
id
);
if (!order) {
return;
}
try {
await this._stripeService.payout(
id,
order.charge,
order.account,
order.price
);
} catch (e) {
await this._messagesService.payoutProblem(
id,
order.sellerId,
order.price
);
}
await this._messagesService.completeOrder(id);
}
@Post('/orders/:id/payment')
async payOrder(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization,
@Param('id') id: string
) {
const orderDetails = await this._messagesService.getOrderDetails(
user.id,
organization.id,
id
);
const payment = await this._stripeService.payAccountStepOne(
user.id,
organization,
orderDetails.seller,
orderDetails.order.id,
orderDetails.order.ordersItems.map((p) => ({
quantity: p.quantity,
integrationType: p.integration.providerIdentifier,
price: p.price,
})),
orderDetails.order.messageGroupId
);
return payment;
}
}

View file

@ -1,5 +1,16 @@
import {
Body, Controller, Get, Param, Post, Query, Req, Res, UploadedFile, UseInterceptors, UsePipes
Body,
Controller,
Delete,
Get,
Param,
Post,
Query,
Req,
Res,
UploadedFile,
UseInterceptors,
UsePipes,
} from '@nestjs/common';
import { Request, Response } from 'express';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
@ -10,27 +21,110 @@ import handleR2Upload from '@gitroom/nestjs-libraries/upload/r2.uploader';
import { FileInterceptor } from '@nestjs/platform-express';
import { CustomFileValidationPipe } from '@gitroom/nestjs-libraries/upload/custom.upload.validation';
import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service';
import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory';
import { SaveMediaInformationDto } from '@gitroom/nestjs-libraries/dtos/media/save.media.information.dto';
import { VideoDto } from '@gitroom/nestjs-libraries/dtos/videos/video.dto';
import { VideoFunctionDto } from '@gitroom/nestjs-libraries/dtos/videos/video.function.dto';
@ApiTags('Media')
@Controller('/media')
export class MediaController {
private storage = UploadFactory.createStorage();
constructor(
private _mediaService: MediaService,
private _subscriptionService: SubscriptionService
) {}
@Delete('/:id')
deleteMedia(@GetOrgFromRequest() org: Organization, @Param('id') id: string) {
return this._mediaService.deleteMedia(org.id, id);
}
@Post('/generate-video')
generateVideo(
@GetOrgFromRequest() org: Organization,
@Body() body: VideoDto
) {
console.log('hello');
return this._mediaService.generateVideo(org, body);
}
@Post('/generate-image')
async generateImage(
@GetOrgFromRequest() org: Organization,
@Req() req: Request,
@Body('prompt') prompt: string
@Body('prompt') prompt: string,
isPicturePrompt = false
) {
const total = await this._subscriptionService.checkCredits(org);
if (total.credits <= 0) {
if (process.env.STRIPE_PUBLISHABLE_KEY && total.credits <= 0) {
return false;
}
return {output: 'data:image/png;base64,' + await this._mediaService.generateImage(prompt, org)};
return {
output:
(isPicturePrompt ? '' : 'data:image/png;base64,') +
(await this._mediaService.generateImage(prompt, org, isPicturePrompt)),
};
}
@Post('/generate-image-with-prompt')
async generateImageFromText(
@GetOrgFromRequest() org: Organization,
@Req() req: Request,
@Body('prompt') prompt: string
) {
const image = await this.generateImage(org, req, prompt, true);
if (!image) {
return false;
}
const file = await this.storage.uploadSimple(image.output);
return this._mediaService.saveFile(org.id, file.split('/').pop(), file);
}
@Post('/upload-server')
@UseInterceptors(FileInterceptor('file'))
@UsePipes(new CustomFileValidationPipe())
async uploadServer(
@GetOrgFromRequest() org: Organization,
@UploadedFile() file: Express.Multer.File
) {
const originalName = file?.originalname || '';
const uploadedFile = await this.storage.uploadFile(file);
return this._mediaService.saveFile(
org.id,
uploadedFile.originalname,
uploadedFile.path,
originalName
);
}
@Post('/save-media')
async saveMedia(
@GetOrgFromRequest() org: Organization,
@Req() req: Request,
@Body('name') name: string,
@Body('originalName') originalName: string
) {
if (!name) {
return false;
}
return this._mediaService.saveFile(
org.id,
name,
process.env.CLOUDFLARE_BUCKET_URL + '/' + name,
originalName || undefined
);
}
@Post('/information')
saveMediaInformation(
@GetOrgFromRequest() org: Organization,
@Body() body: SaveMediaInformationDto
) {
return this._mediaService.saveMediaInformation(org.id, body);
}
@Post('/upload-simple')
@ -38,26 +132,31 @@ export class MediaController {
@UsePipes(new CustomFileValidationPipe())
async uploadSimple(
@GetOrgFromRequest() org: Organization,
@UploadedFile('file')
file: Express.Multer.File
@UploadedFile('file') file: Express.Multer.File,
@Body('preventSave') preventSave: string = 'false'
) {
const filePath =
file.path.indexOf('http') === 0
? file.path
: file.path.replace(process.env.UPLOAD_DIRECTORY, '');
return this._mediaService.saveFile(org.id, file.originalname, filePath);
const originalName = file.originalname;
const getFile = await this.storage.uploadFile(file);
if (preventSave === 'true') {
const { path } = getFile;
return { path };
}
return this._mediaService.saveFile(
org.id,
getFile.originalname,
getFile.path,
originalName
);
}
@Post('/:endpoint')
// @UseInterceptors(FileInterceptor('file'))
// @UsePipes(new CustomFileValidationPipe())
async uploadFile(
@GetOrgFromRequest() org: Organization,
@Req() req: Request,
@Res() res: Response,
@Param('endpoint') endpoint: string
// @UploadedFile('file')
// file: Express.Multer.File
) {
const upload = await handleR2Upload(endpoint, req, res);
if (endpoint !== 'complete-multipart-upload') {
@ -66,23 +165,45 @@ export class MediaController {
// @ts-ignore
const name = upload.Location.split('/').pop();
const originalName = req.body?.file?.name;
// @ts-ignore
await this._mediaService.saveFile(org.id, name, upload.Location);
const saveFile = await this._mediaService.saveFile(
org.id,
name,
// @ts-ignore
upload.Location,
originalName || undefined
);
res.status(200).json(upload);
// const filePath =
// file.path.indexOf('http') === 0
// ? file.path
// : file.path.replace(process.env.UPLOAD_DIRECTORY, '');
// return this._mediaService.saveFile(org.id, file.originalname, filePath);
res.status(200).json({ ...upload, saved: saveFile });
}
@Get('/')
getMedia(
@GetOrgFromRequest() org: Organization,
@Query('page') page: number
@Query('page') page: number,
@Query('search') search?: string
) {
return this._mediaService.getMedia(org.id, page);
return this._mediaService.getMedia(org.id, page, search);
}
@Get('/video-options')
getVideos() {
return this._mediaService.getVideoOptions();
}
@Post('/video/function')
videoFunction(
@Body() body: VideoFunctionDto
) {
return this._mediaService.videoFunction(body.identifier, body.functionName, body.params);
}
@Get('/generate-video/:type/allowed')
generateVideoAllowed(
@GetOrgFromRequest() org: Organization,
@Param('type') type: string
) {
return this._mediaService.generateVideoAllowed(org, type);
}
}

View file

@ -1,40 +0,0 @@
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { MessagesService } from '@gitroom/nestjs-libraries/database/prisma/marketplace/messages.service';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { Organization, User } from '@prisma/client';
import { AddMessageDto } from '@gitroom/nestjs-libraries/dtos/messages/add.message';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
@ApiTags('Messages')
@Controller('/messages')
export class MessagesController {
constructor(private _messagesService: MessagesService) {}
@Get('/')
getMessagesGroup(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization
) {
return this._messagesService.getMessagesGroup(user.id, organization.id);
}
@Get('/:groupId/:page')
getMessages(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization,
@Param('groupId') groupId: string,
@Param('page') page: string
) {
return this._messagesService.getMessages(user.id, organization.id, groupId, +page);
}
@Post('/:groupId')
createMessage(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization,
@Param('groupId') groupId: string,
@Body() message: AddMessageDto
) {
return this._messagesService.createMessage(user.id, organization.id, groupId, message);
}
}

View file

@ -0,0 +1,14 @@
import { Controller, Get, Param } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
@ApiTags('Monitor')
@Controller('/monitor')
export class MonitorController {
@Get('/queue/:name')
async getMessagesGroup(@Param('name') name: string) {
return {
status: 'success',
message: `Queue ${name} is healthy.`,
};
}
}

View file

@ -0,0 +1,395 @@
import {
Body,
Controller,
Get,
HttpException,
Param,
Post,
UseFilters,
} from '@nestjs/common';
import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service';
import { ConnectIntegrationDto } from '@gitroom/nestjs-libraries/dtos/integrations/connect.integration.dto';
import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager';
import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service';
import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability';
import { ApiTags } from '@nestjs/swagger';
import { NotEnoughScopesFilter } from '@gitroom/nestjs-libraries/integrations/integration.missing.scopes';
import { AuthService } from '@gitroom/helpers/auth/auth.service';
import { AuthTokenDetails } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface';
import { NotEnoughScopes } from '@gitroom/nestjs-libraries/integrations/social.abstract';
import {
AuthorizationActions,
Sections,
} from '@gitroom/backend/services/auth/permissions/permission.exception.class';
import { RefreshIntegrationService } from '@gitroom/nestjs-libraries/integrations/refresh.integration.service';
import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service';
@ApiTags('Integrations')
@Controller('/integrations')
export class NoAuthIntegrationsController {
constructor(
private _integrationManager: IntegrationManager,
private _integrationService: IntegrationService,
private _refreshIntegrationService: RefreshIntegrationService,
private _organizationService: OrganizationService
) {}
@Get('/')
getIntegrations() {
return this._integrationManager.getAllIntegrations();
}
@Post('/social-connect/:integration')
@CheckPolicies([AuthorizationActions.Create, Sections.CHANNEL])
@UseFilters(new NotEnoughScopesFilter())
async connectSocialMedia(
@Param('integration') integration: string,
@Body() body: ConnectIntegrationDto
) {
if (
!this._integrationManager
.getAllowedSocialsIntegrations()
.includes(integration)
) {
throw new Error('Integration not allowed');
}
const integrationProvider =
this._integrationManager.getSocialIntegration(integration);
const getCodeVerifier = integrationProvider.customFields
? 'none'
: await ioRedis.get(`login:${body.state}`);
if (!getCodeVerifier) {
throw new Error('Invalid state');
}
const organization = await ioRedis.get(`organization:${body.state}`);
if (!organization) {
throw new Error('Organization not found');
}
const org = await this._organizationService.getOrgById(organization);
if (!integrationProvider.customFields) {
await ioRedis.del(`login:${body.state}`);
}
const details = integrationProvider.externalUrl
? await ioRedis.get(`external:${body.state}`)
: undefined;
if (details) {
await ioRedis.del(`external:${body.state}`);
}
const refresh = await ioRedis.get(`refresh:${body.state}`);
if (refresh) {
await ioRedis.del(`refresh:${body.state}`);
}
const onboarding = await ioRedis.get(`onboarding:${body.state}`);
if (onboarding) {
await ioRedis.del(`onboarding:${body.state}`);
}
const {
error,
accessToken,
expiresIn,
refreshToken,
id,
name,
picture,
username,
additionalSettings,
// eslint-disable-next-line no-async-promise-executor
} = await new Promise<AuthTokenDetails>(async (res) => {
try {
const auth = await integrationProvider.authenticate(
{
code: body.code,
codeVerifier: getCodeVerifier,
refresh: body.refresh,
},
details ? JSON.parse(details) : undefined
);
if (typeof auth === 'string') {
return res({
error: auth,
accessToken: '',
id: '',
name: '',
picture: '',
username: '',
additionalSettings: [],
});
}
if (refresh && integrationProvider.reConnect) {
console.log('reconnect');
try {
const newAuth = await integrationProvider.reConnect(
auth.id,
refresh,
auth.accessToken
);
return res({ ...newAuth, refreshToken: body.refresh });
} catch (err: any) {
return res({
error: err.message,
accessToken: '',
id: '',
name: '',
picture: '',
username: '',
additionalSettings: [],
});
}
}
return res(auth);
} catch (err) {
if (err instanceof NotEnoughScopes) {
return res({
error: err.message,
accessToken: '',
id: '',
name: '',
picture: '',
username: '',
additionalSettings: [],
});
}
return res({
error: 'Authentication failed',
accessToken: '',
id: '',
name: '',
picture: '',
username: '',
additionalSettings: [],
});
}
});
if (error) {
throw new NotEnoughScopes(error);
}
if (!id) {
throw new NotEnoughScopes('Invalid API key');
}
if (refresh && String(id) !== String(refresh)) {
throw new NotEnoughScopes(
'Please refresh the channel that needs to be refreshed'
);
}
let validName = name;
if (!validName) {
if (username) {
validName = username.split('.')[0] ?? username;
} else {
validName = `Channel_${String(id).slice(0, 8)}`;
}
}
if (
process.env.STRIPE_PUBLISHABLE_KEY &&
org.isTrailing &&
(await this._integrationService.checkPreviousConnections(
org.id,
String(id)
))
) {
throw new HttpException('', 412);
}
const createUpdate =
await this._integrationService.createOrUpdateIntegration(
additionalSettings,
!!integrationProvider.oneTimeToken,
org.id,
validName.trim(),
picture,
'social',
String(id),
integration,
accessToken,
refreshToken,
expiresIn,
username,
refresh ? false : integrationProvider.isBetweenSteps,
body.refresh,
+body.timezone,
details
? AuthService.fixedEncryption(details)
: integrationProvider.customFields
? AuthService.fixedEncryption(
Buffer.from(body.code, 'base64').toString()
)
: integrationProvider.isChromeExtension
? AuthService.signJWT(
JSON.parse(Buffer.from(body.code, 'base64').toString())
)
: undefined
);
this._refreshIntegrationService
.startRefreshWorkflow(org.id, createUpdate.id, integrationProvider)
.catch((err) => {
console.log(err);
});
// Fetch pages if this is a two-step provider and not a refresh
let pages: any[] = [];
if (integrationProvider.isBetweenSteps && !refresh) {
try {
// Check which method the provider uses (pages or companies)
const fetchMethod =
'pages' in integrationProvider
? 'pages'
: 'companies' in integrationProvider
? 'companies'
: null;
if (fetchMethod) {
// @ts-ignore - dynamic method call
pages = await integrationProvider[fetchMethod](accessToken);
}
} catch (err) {
console.log('Failed to fetch pages:', err);
}
}
const webhookUrl = await ioRedis.get(`webhookUrl:${body.state}`);
if (webhookUrl) {
try {
await fetch(webhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
params: AuthService.signJWT({
apiKey: org.apiKey,
}),
}),
});
} catch (err) {}
await ioRedis.del(`webhookUrl:${body.state}`);
}
const returnURL = await ioRedis.get(`redirect:${body.state}`);
if (returnURL) {
await ioRedis.del(`redirect:${body.state}`);
}
const extensionToken = integrationProvider.isChromeExtension
? AuthService.signJWT({
integrationId: createUpdate.id,
organizationId: org.id,
internalId: String(id),
provider: integration,
})
: undefined;
return {
...createUpdate,
onboarding: onboarding === 'true',
pages,
...(returnURL ? { returnURL } : {}),
...(extensionToken ? { extensionToken } : {}),
};
}
@Post('/public/provider/:id/connect')
async saveProviderPage(@Param('id') id: string, @Body() body: any) {
if (!body.state) {
throw new Error('Invalid state');
}
const organization = await ioRedis.get(`organization:${body.state}`);
if (!organization) {
throw new Error('Organization not found');
}
const org = await this._organizationService.getOrgById(organization);
return this._integrationService.saveProviderPage(org.id, id, body);
}
@Post('/extension-refresh')
async extensionRefreshCookies(
@Body() body: { jwt: string; cookies: string }
) {
let payload: any;
try {
payload = AuthService.verifyJWT(body.jwt);
} catch {
throw new HttpException('Invalid token', 401);
}
const { integrationId, organizationId, internalId, provider } = payload;
if (!integrationId || !organizationId || !internalId || !provider) {
throw new HttpException('Invalid token payload', 400);
}
const integration = await this._integrationService.getIntegrationById(
organizationId,
integrationId
);
if (!integration || integration.internalId !== internalId) {
throw new HttpException('Integration not found', 404);
}
const integrationProvider =
this._integrationManager.getSocialIntegration(provider);
if (!integrationProvider?.isChromeExtension) {
throw new HttpException('Not a Chrome extension integration', 400);
}
const authResult = await integrationProvider.authenticate({
code: body.cookies,
codeVerifier: '',
});
if (typeof authResult === 'string') {
throw new HttpException(authResult, 400);
}
if (String(authResult.id) !== String(integration.internalId)) {
await this._integrationService.refreshNeeded(
organizationId,
integrationId
);
return { success: false, reason: 'account_mismatch' };
}
await this._integrationService.createOrUpdateIntegration(
undefined,
false,
organizationId,
integration.name,
undefined,
'social',
integration.internalId,
integration.providerIdentifier,
authResult.accessToken,
'',
authResult.expiresIn,
undefined,
false,
undefined,
undefined,
AuthService.signJWT(
JSON.parse(Buffer.from(body.cookies, 'base64').toString())
)
);
return { success: true };
}
}

View file

@ -3,7 +3,7 @@ import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.req
import { Organization, User } from '@prisma/client';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service';
import {ApiTags} from "@nestjs/swagger";
import { ApiTags } from '@nestjs/swagger';
@ApiTags('Notifications')
@Controller('/notifications')

View file

@ -0,0 +1,54 @@
import { Body, Controller, Delete, Get, Post, Put } from '@nestjs/common';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization } from '@prisma/client';
import { ApiTags } from '@nestjs/swagger';
import { OAuthService } from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service';
import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability';
import {
AuthorizationActions,
Sections,
} from '@gitroom/backend/services/auth/permissions/permission.exception.class';
import { CreateOAuthAppDto } from '@gitroom/nestjs-libraries/dtos/oauth/create-oauth-app.dto';
import { UpdateOAuthAppDto } from '@gitroom/nestjs-libraries/dtos/oauth/update-oauth-app.dto';
@ApiTags('OAuth App')
@Controller('/user/oauth-app')
export class OAuthAppController {
constructor(private _oauthService: OAuthService) {}
@Get('/')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async getApp(@GetOrgFromRequest() org: Organization) {
return this._oauthService.getApp(org.id);
}
@Post('/')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async createApp(
@GetOrgFromRequest() org: Organization,
@Body() body: CreateOAuthAppDto
) {
return this._oauthService.createApp(org.id, body);
}
@Put('/')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async updateApp(
@GetOrgFromRequest() org: Organization,
@Body() body: UpdateOAuthAppDto
) {
return this._oauthService.updateApp(org.id, body);
}
@Delete('/')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async deleteApp(@GetOrgFromRequest() org: Organization) {
return this._oauthService.deleteApp(org.id);
}
@Post('/rotate-secret')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async rotateSecret(@GetOrgFromRequest() org: Organization) {
return this._oauthService.rotateSecret(org.id);
}
}

View file

@ -0,0 +1,95 @@
import {
Body,
Controller,
Get,
HttpException,
HttpStatus,
Post,
Query,
} from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { OAuthService } from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { User, Organization } from '@prisma/client';
import { AuthorizeOAuthQueryDto, ApproveOAuthDto } from '@gitroom/nestjs-libraries/dtos/oauth/authorize-oauth.dto';
import { TokenExchangeDto } from '@gitroom/nestjs-libraries/dtos/oauth/token-exchange.dto';
@ApiTags('OAuth')
@Controller('/oauth')
export class OAuthController {
constructor(private _oauthService: OAuthService) {}
@Get('/authorize')
async authorize(@Query() query: AuthorizeOAuthQueryDto) {
const app = await this._oauthService.validateAuthorizationRequest(
query.client_id
);
return {
app: {
name: app.name,
description: app.description,
picture: app.picture,
clientId: app.clientId,
redirectUrl: app.redirectUrl,
},
state: query.state,
};
}
@Post('/token')
async token(@Body() body: TokenExchangeDto) {
if (body.grant_type !== 'authorization_code') {
throw new HttpException(
{ error: 'unsupported_grant_type' },
HttpStatus.BAD_REQUEST
);
}
return this._oauthService.exchangeCodeForToken(
body.code,
body.client_id,
body.client_secret
);
}
}
@ApiTags('OAuth')
@Controller('/oauth')
export class OAuthAuthorizedController {
constructor(private _oauthService: OAuthService) {}
@Post('/authorize')
async approveOrDeny(
@Body() body: ApproveOAuthDto,
@GetUserFromRequest() user: User,
@GetOrgFromRequest() org: Organization
) {
const app = await this._oauthService.validateAuthorizationRequest(
body.client_id
);
if (body.action === 'deny') {
const redirectUrl = new URL(app.redirectUrl);
redirectUrl.searchParams.set('error', 'access_denied');
if (body.state) {
redirectUrl.searchParams.set('state', body.state);
}
return { redirect: redirectUrl.toString() };
}
const code = await this._oauthService.createAuthorizationCode(
app.id,
user.id,
org.id
);
const redirectUrl = new URL(app.redirectUrl);
redirectUrl.searchParams.set('code', code);
if (body.state) {
redirectUrl.searchParams.set('state', body.state);
}
return { redirect: redirectUrl.toString() };
}
}

View file

@ -3,42 +3,109 @@ import {
Controller,
Delete,
Get,
HttpException,
Param,
Post,
Put,
Query,
Res,
} from '@nestjs/common';
import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization, User } from '@prisma/client';
import { CreatePostDto } from '@gitroom/nestjs-libraries/dtos/posts/create.post.dto';
import { GetPostsDto } from '@gitroom/nestjs-libraries/dtos/posts/get.posts.dto';
import { StarsService } from '@gitroom/nestjs-libraries/database/prisma/stars/stars.service';
import { GetPostsListDto } from '@gitroom/nestjs-libraries/dtos/posts/get.posts.list.dto';
import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability';
import { ApiTags } from '@nestjs/swagger';
import { GeneratorDto } from '@gitroom/nestjs-libraries/dtos/generator/generator.dto';
import { CreateGeneratedPostsDto } from '@gitroom/nestjs-libraries/dtos/generator/create.generated.posts.dto';
import { AgentGraphService } from '@gitroom/nestjs-libraries/agent/agent.graph.service';
import { Response } from 'express';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { ShortLinkService } from '@gitroom/nestjs-libraries/short-linking/short.link.service';
import { CreateTagDto } from '@gitroom/nestjs-libraries/dtos/posts/create.tag.dto';
import {
AuthorizationActions,
Sections,
} from '@gitroom/backend/services/auth/permissions/permissions.service';
import { ApiTags } from '@nestjs/swagger';
import { MessagesService } from '@gitroom/nestjs-libraries/database/prisma/marketplace/messages.service';
import { GeneratorDto } from '@gitroom/nestjs-libraries/dtos/generator/generator.dto';
import { CreateGeneratedPostsDto } from '@gitroom/nestjs-libraries/dtos/generator/create.generated.posts.dto';
} from '@gitroom/backend/services/auth/permissions/permission.exception.class';
@ApiTags('Posts')
@Controller('/posts')
export class PostsController {
constructor(
private _postsService: PostsService,
private _starsService: StarsService,
private _messagesService: MessagesService
private _agentGraphService: AgentGraphService,
private _shortLinkService: ShortLinkService
) {}
@Get('/marketplace/:id?')
async getMarketplacePosts(
@Get('/:id/statistics')
async getStatistics(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
return this._messagesService.getMarketplaceAvailableOffers(org.id, id);
return this._postsService.getStatistics(org.id, id);
}
@Get('/:id/missing')
async getMissingContent(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
return this._postsService.getMissingContent(org.id, id);
}
@Put('/:id/release-id')
async updateReleaseId(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body('releaseId') releaseId: string
) {
return this._postsService.updateReleaseId(org.id, id, releaseId);
}
@Post('/should-shortlink')
async shouldShortlink(@Body() body: { messages: string[] }) {
return { ask: this._shortLinkService.askShortLinkedin(body.messages) };
}
@Post('/:id/comments')
async createComment(
@GetOrgFromRequest() org: Organization,
@GetUserFromRequest() user: User,
@Param('id') id: string,
@Body() body: { comment: string }
) {
return this._postsService.createComment(org.id, user.id, id, body.comment);
}
@Get('/tags')
async getTags(@GetOrgFromRequest() org: Organization) {
return { tags: await this._postsService.getTags(org.id) };
}
@Post('/tags')
async createTag(
@GetOrgFromRequest() org: Organization,
@Body() body: CreateTagDto
) {
return this._postsService.createTag(org.id, body);
}
@Put('/tags/:id')
async editTag(
@GetOrgFromRequest() org: Organization,
@Body() body: CreateTagDto,
@Param('id') id: string
) {
return this._postsService.editTag(id, org.id, body);
}
@Delete('/tags/:id')
async deleteTag(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
return this._postsService.deleteTag(id, org.id);
}
@Get('/')
@ -46,24 +113,28 @@ export class PostsController {
@GetOrgFromRequest() org: Organization,
@Query() query: GetPostsDto
) {
const [posts] = await Promise.all([
this._postsService.getPosts(org.id, query),
// this._commentsService.getAllCommentsByWeekYear(
// org.id,
// query.year,
// query.week
// ),
]);
return {
posts,
// comments,
};
return this._postsService.getPostsMinified(org.id, query);
}
@Get('/predict-trending')
predictTrending() {
return this._starsService.predictTrending();
@Get('/find-slot')
async findSlot(@GetOrgFromRequest() org: Organization) {
return { date: await this._postsService.findFreeDateTime(org.id) };
}
@Get('/find-slot/:id')
async findSlotIntegration(
@GetOrgFromRequest() org: Organization,
@Param('id') id?: string
) {
return { date: await this._postsService.findFreeDateTime(org.id, id) };
}
@Get('/list')
async getPostsList(
@GetOrgFromRequest() org: Organization,
@Query() query: GetPostsListDto
) {
return this._postsService.getPostsList(org.id, query);
}
@Get('/old')
@ -74,6 +145,23 @@ export class PostsController {
return this._postsService.getOldPosts(org.id, date);
}
@Get('/group/:group/debug-export')
async getPostGroupDebugExport(
@GetOrgFromRequest() org: Organization,
@GetUserFromRequest() user: User,
@Param('group') group: string
) {
if (!user.isSuperAdmin) {
throw new HttpException('Forbidden', 403);
}
return this._postsService.getPostGroupDebugExport(org.id, group);
}
@Get('/group/:group')
getPostsByGroup(@GetOrgFromRequest() org: Organization, @Param('group') group: string) {
return this._postsService.getPostsByGroup(org.id, group);
}
@Get('/:id')
getPost(@GetOrgFromRequest() org: Organization, @Param('id') id: string) {
return this._postsService.getPost(org.id, id);
@ -81,12 +169,13 @@ export class PostsController {
@Post('/')
@CheckPolicies([AuthorizationActions.Create, Sections.POSTS_PER_MONTH])
createPost(
async createPost(
@GetOrgFromRequest() org: Organization,
@Body() body: CreatePostDto
@Body() rawBody: any
) {
console.log(JSON.stringify(body, null, 2));
return this._postsService.createPost(org.id, body);
console.log(JSON.stringify(rawBody, null, 2));
const body = await this._postsService.mapTypeToPost(rawBody, org.id);
return this._postsService.createPost(org.id, body, 'WEB');
}
@Post('/generator/draft')
@ -100,11 +189,17 @@ export class PostsController {
@Post('/generator')
@CheckPolicies([AuthorizationActions.Create, Sections.POSTS_PER_MONTH])
generatePosts(
async generatePosts(
@GetOrgFromRequest() org: Organization,
@Body() body: GeneratorDto
@Body() body: GeneratorDto,
@Res({ passthrough: false }) res: Response
) {
return this._postsService.generatePosts(org.id, body);
res.setHeader('Content-Type', 'application/json; charset=utf-8');
for await (const event of this._agentGraphService.start(org.id, body)) {
res.write(JSON.stringify(event) + '\n');
}
res.end();
}
@Delete('/:group')
@ -119,8 +214,17 @@ export class PostsController {
changeDate(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body('date') date: string
@Body('date') date: string,
@Body('action') action: 'schedule' | 'update' = 'schedule'
) {
return this._postsService.changeDate(org.id, id, date);
return this._postsService.changeDate(org.id, id, date, action);
}
@Post('/separate-posts')
async separatePosts(
@GetOrgFromRequest() org: Organization,
@Body() body: { content: string; len: number }
) {
return this._postsService.separatePosts(body.content, body.len);
}
}

View file

@ -1,30 +1,246 @@
import { Controller, Get, Param } from '@nestjs/common';
import {
Body,
Controller,
Get,
Param,
Post,
Query,
Req,
Res,
StreamableFile,
} from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { AgenciesService } from '@gitroom/nestjs-libraries/database/prisma/agencies/agencies.service';
import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service';
import { TrackService } from '@gitroom/nestjs-libraries/track/track.service';
import { RealIP } from 'nestjs-real-ip';
import { UserAgent } from '@gitroom/nestjs-libraries/user/user.agent';
import { TrackEnum } from '@gitroom/nestjs-libraries/user/track.enum';
import { Request, Response } from 'express';
import { makeId } from '@gitroom/nestjs-libraries/services/make.is';
import { getCookieUrlFromDomain } from '@gitroom/helpers/subdomain/subdomain.management';
import { AgentGraphInsertService } from '@gitroom/nestjs-libraries/agent/agent.graph.insert.service';
import { Nowpayments } from '@gitroom/nestjs-libraries/crypto/nowpayments';
import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service';
import { AuthService } from '@gitroom/helpers/auth/auth.service';
import { pricing } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/pricing';
import { Readable, pipeline } from 'stream';
import { promisify } from 'util';
import { OnlyURL } from '@gitroom/nestjs-libraries/dtos/webhooks/webhooks.dto';
import { isSafePublicHttpsUrl } from '@gitroom/nestjs-libraries/dtos/webhooks/webhook.url.validator';
import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher';
const pump = promisify(pipeline);
@ApiTags('Public')
@Controller('/public')
export class PublicController {
constructor(private _agenciesService: AgenciesService) {}
@Get('/agencies-list')
async getAgencyByUser() {
return this._agenciesService.getAllAgencies();
constructor(
private _trackService: TrackService,
private _agentGraphInsertService: AgentGraphInsertService,
private _postsService: PostsService,
private _nowpayments: Nowpayments,
private _subscriptionService: SubscriptionService
) {}
@Post('/agent')
async createAgent(@Body() body: { text: string; apiKey: string }) {
if (
!body.apiKey ||
!process.env.AGENT_API_KEY ||
body.apiKey !== process.env.AGENT_API_KEY
) {
return;
}
return this._agentGraphInsertService.newPost(body.text);
}
@Get('/agencies-list-slug')
async getAgencySlug() {
return this._agenciesService.getAllAgenciesSlug();
@Get(`/posts/:id`)
async getPreview(@Param('id') id: string) {
return (await this._postsService.getPostsRecursively(id, true)).map(
({ childrenPost, ...p }) => ({
...p,
...(p.integration
? {
integration: {
id: p.integration.id,
name: p.integration.name,
picture: p.integration.picture,
providerIdentifier: p.integration.providerIdentifier,
profile: p.integration.profile,
},
}
: {}),
})
);
}
@Get('/agencies-information/:agency')
async getAgencyInformation(
@Param('agency') agency: string,
@Get(`/posts/:id/comments`)
async getComments(@Param('id') postId: string) {
return { comments: await this._postsService.getComments(postId) };
}
@Post('/t')
async trackEvent(
@Res() res: Response,
@Req() req: Request,
@RealIP() ip: string,
@UserAgent() userAgent: string,
@Body()
body: { fbclid?: string; tt: TrackEnum; additional: Record<string, any> }
) {
return this._agenciesService.getAgencyInformation(agency);
const uniqueId = req?.cookies?.track || makeId(10);
const fbclid = req?.cookies?.fbclid || body.fbclid;
await this._trackService.track(
uniqueId,
ip,
userAgent,
body.tt,
body.additional,
fbclid
);
if (!req.cookies.track) {
res.cookie('track', uniqueId, {
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
}
: {}),
sameSite: 'none',
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
}
if (body.fbclid && !req.cookies.fbclid) {
res.cookie('fbclid', body.fbclid, {
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
}
: {}),
sameSite: 'none',
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
}
res.status(200).json({
track: uniqueId,
});
}
@Get('/agencies-list-count')
async getAgenciesCount() {
return this._agenciesService.getCount();
@Post('/modify-subscription')
async modifySubscription(@Body('params') params: string) {
try {
const load = AuthService.verifyJWT(params) as {
orgId: string;
billing: 'FREE' | 'STANDARD' | 'TEAM' | 'PRO' | 'ULTIMATE';
};
if (!load || !load.orgId || !load.billing || !pricing[load.billing]) {
return { success: false };
}
const totalChannels = pricing[load.billing].channel || 0;
await this._subscriptionService.modifySubscriptionByOrg(
load.orgId,
totalChannels,
load.billing
);
return { success: true };
} catch (err) {
return { success: false };
}
}
@Post('/crypto/:path')
async cryptoPost(@Body() body: any, @Param('path') path: string) {
console.log('cryptoPost', body, path);
return this._nowpayments.processPayment(path, body);
}
@Get('/stream')
async streamFile(
@Query() query: OnlyURL,
@Res() res: Response,
@Req() req: Request
) {
const { url } = query;
if (!url.endsWith('mp4')) {
return res.status(400).send('Invalid video URL');
}
const ac = new AbortController();
const onClose = () => ac.abort();
req.on('aborted', onClose);
res.on('close', onClose);
// Manually follow redirects so every hop is re-validated against
// the SSRF blocklist (see GHSA-34w8-5j2v-h6ww). `fetch` defaults to
// `redirect: 'follow'`, which bypasses the DTO-level URL check.
const MAX_REDIRECTS = 5;
let currentUrl = url;
let r: globalThis.Response | undefined;
for (let hop = 0; hop <= MAX_REDIRECTS; hop++) {
if (!(await isSafePublicHttpsUrl(currentUrl))) {
return res.status(400).send('Blocked URL');
}
r = await fetch(currentUrl, {
signal: ac.signal,
redirect: 'manual',
// @ts-ignore — undici option, not in lib.dom fetch types
dispatcher: ssrfSafeDispatcher,
});
if (r.status >= 300 && r.status < 400) {
const location = r.headers.get('location');
if (!location) {
return res.status(502).send('Redirect without Location');
}
try {
currentUrl = new URL(location, currentUrl).toString();
} catch {
return res.status(400).send('Invalid redirect target');
}
continue;
}
break;
}
if (!r) {
return res.status(502).send('No upstream response');
}
if (r.status >= 300 && r.status < 400) {
return res.status(508).send('Too many redirects');
}
if (!r.ok && r.status !== 206) {
res.status(r.status);
throw new Error(`Upstream error: ${r.statusText}`);
}
const type = r.headers.get('content-type') ?? 'application/octet-stream';
res.setHeader('Content-Type', type);
const contentRange = r.headers.get('content-range');
if (contentRange) res.setHeader('Content-Range', contentRange);
const len = r.headers.get('content-length');
if (len) res.setHeader('Content-Length', len);
const acceptRanges = r.headers.get('accept-ranges') ?? 'bytes';
res.setHeader('Accept-Ranges', acceptRanges);
if (r.status === 206) res.status(206); // Partial Content for range responses
try {
await pump(Readable.fromWeb(r.body as any), res);
} catch (err) {}
}
}

View file

@ -0,0 +1,8 @@
import { Controller, Get } from '@nestjs/common';
@Controller('/')
export class RootController {
@Get('/')
getRoot(): string {
return 'App is running!';
}
}

View file

@ -0,0 +1,52 @@
import {
Body,
Controller,
Delete,
Get,
Param,
Post,
Put,
} from '@nestjs/common';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization } from '@prisma/client';
import { ApiTags } from '@nestjs/swagger';
import { SetsService } from '@gitroom/nestjs-libraries/database/prisma/sets/sets.service';
import {
UpdateSetsDto,
SetsDto,
} from '@gitroom/nestjs-libraries/dtos/sets/sets.dto';
@ApiTags('Sets')
@Controller('/sets')
export class SetsController {
constructor(private _setsService: SetsService) {}
@Get('/')
async getSets(@GetOrgFromRequest() org: Organization) {
return this._setsService.getSets(org.id);
}
@Post('/')
async createASet(
@GetOrgFromRequest() org: Organization,
@Body() body: SetsDto
) {
return this._setsService.createSet(org.id, body);
}
@Put('/')
async updateSet(
@GetOrgFromRequest() org: Organization,
@Body() body: UpdateSetsDto
) {
return this._setsService.createSet(org.id, body);
}
@Delete('/:id')
async deleteSet(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
return this._setsService.deleteSet(org.id, id);
}
}

View file

@ -1,130 +1,67 @@
import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization } from '@prisma/client';
import { StarsService } from '@gitroom/nestjs-libraries/database/prisma/stars/stars.service';
import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability';
import {
AuthorizationActions,
Sections,
} from '@gitroom/backend/services/auth/permissions/permissions.service';
import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service';
import {AddTeamMemberDto} from "@gitroom/nestjs-libraries/dtos/settings/add.team.member.dto";
import {ApiTags} from "@nestjs/swagger";
import { AddTeamMemberDto } from '@gitroom/nestjs-libraries/dtos/settings/add.team.member.dto';
import { ShortlinkPreferenceDto } from '@gitroom/nestjs-libraries/dtos/settings/shortlink-preference.dto';
import { ApiTags } from '@nestjs/swagger';
import { AuthorizationActions, Sections } from '@gitroom/backend/services/auth/permissions/permission.exception.class';
@ApiTags('Settings')
@Controller('/settings')
export class SettingsController {
constructor(
private _starsService: StarsService,
private _organizationService: OrganizationService
) {}
@Get('/github')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async getConnectedGithubAccounts(@GetOrgFromRequest() org: Organization) {
return {
github: (
await this._starsService.getGitHubRepositoriesByOrgId(org.id)
).map((repo) => ({
id: repo.id,
login: repo.login,
})),
};
}
@Post('/github')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async addGitHub(
@GetOrgFromRequest() org: Organization,
@Body('code') code: string
) {
if (!code) {
throw new Error('No code provided');
}
await this._starsService.addGitHub(org.id, code);
}
@Get('/github/url')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
authUrl() {
return {
url: `https://github.com/login/oauth/authorize?client_id=${
process.env.GITHUB_CLIENT_ID
}&scope=${encodeURIComponent(
'user:email'
)}&redirect_uri=${encodeURIComponent(
`${process.env.FRONTEND_URL}/settings`
)}`,
};
}
@Get('/organizations/:id')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async getOrganizations(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
return {
organizations: await this._starsService.getOrganizations(org.id, id),
};
}
@Get('/organizations/:id/:github')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async getRepositories(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Param('github') github: string
) {
return {
repositories: await this._starsService.getRepositoriesOfOrganization(
org.id,
id,
github
),
};
}
@Post('/organizations/:id')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async updateGitHubLogin(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body('login') login: string
) {
return this._starsService.updateGitHubLogin(org.id, id, login);
}
@Delete('/repository/:id')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async deleteRepository(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
return this._starsService.deleteRepository(org.id, id);
}
@Get('/team')
@CheckPolicies([AuthorizationActions.Create, Sections.TEAM_MEMBERS], [AuthorizationActions.Create, Sections.ADMIN])
@CheckPolicies(
[AuthorizationActions.Create, Sections.TEAM_MEMBERS],
[AuthorizationActions.Create, Sections.ADMIN]
)
async getTeam(@GetOrgFromRequest() org: Organization) {
return this._organizationService.getTeam(org.id);
}
@Post('/team')
@CheckPolicies([AuthorizationActions.Create, Sections.TEAM_MEMBERS], [AuthorizationActions.Create, Sections.ADMIN])
@CheckPolicies(
[AuthorizationActions.Create, Sections.TEAM_MEMBERS],
[AuthorizationActions.Create, Sections.ADMIN]
)
async inviteTeamMember(
@GetOrgFromRequest() org: Organization,
@Body() body: AddTeamMemberDto,
@GetOrgFromRequest() org: Organization,
@Body() body: AddTeamMemberDto
) {
return this._organizationService.inviteTeamMember(org.id, body);
}
@Delete('/team/:id')
@CheckPolicies([AuthorizationActions.Create, Sections.TEAM_MEMBERS], [AuthorizationActions.Create, Sections.ADMIN])
@CheckPolicies(
[AuthorizationActions.Create, Sections.TEAM_MEMBERS],
[AuthorizationActions.Create, Sections.ADMIN]
)
deleteTeamMember(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
return this._organizationService.deleteTeamMember(org, id);
}
@Get('/shortlink')
async getShortlinkPreference(@GetOrgFromRequest() org: Organization) {
return this._organizationService.getShortlinkPreference(org.id);
}
@Post('/shortlink')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async updateShortlinkPreference(
@GetOrgFromRequest() org: Organization,
@Body() body: ShortlinkPreferenceDto
) {
return this._organizationService.updateShortlinkPreference(
org.id,
body.shortlink
);
}
}

View file

@ -0,0 +1,47 @@
import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization } from '@prisma/client';
import { ApiTags } from '@nestjs/swagger';
import { SignatureService } from '@gitroom/nestjs-libraries/database/prisma/signatures/signature.service';
import { SignatureDto } from '@gitroom/nestjs-libraries/dtos/signature/signature.dto';
@ApiTags('Signatures')
@Controller('/signatures')
export class SignatureController {
constructor(private _signatureService: SignatureService) {}
@Get('/')
async getSignatures(@GetOrgFromRequest() org: Organization) {
return this._signatureService.getSignaturesByOrgId(org.id);
}
@Get('/default')
async getDefaultSignature(@GetOrgFromRequest() org: Organization) {
return (await this._signatureService.getDefaultSignature(org.id)) || {};
}
@Post('/')
async createSignature(
@GetOrgFromRequest() org: Organization,
@Body() body: SignatureDto
) {
return this._signatureService.createOrUpdateSignature(org.id, body);
}
@Delete('/:id')
async deleteSignature(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
return this._signatureService.deleteSignature(org.id, id);
}
@Put('/:id')
async updateSignature(
@Param('id') id: string,
@GetOrgFromRequest() org: Organization,
@Body() body: SignatureDto
) {
return this._signatureService.createOrUpdateSignature(org.id, body, id);
}
}

View file

@ -1,83 +1,54 @@
import {
Controller,
Get,
Header,
Param,
HttpException,
Post,
RawBodyRequest,
Req,
} from '@nestjs/common';
import { StripeService } from '@gitroom/nestjs-libraries/services/stripe.service';
import { ApiTags } from '@nestjs/swagger';
import { CodesService } from '@gitroom/nestjs-libraries/services/codes.service';
@ApiTags('Stripe')
@Controller('/stripe')
export class StripeController {
constructor(
private readonly _stripeService: StripeService,
private readonly _codesService: CodesService
) {}
@Post('/connect')
stripeConnect(@Req() req: RawBodyRequest<Request>) {
const event = this._stripeService.validateRequest(
req.rawBody,
req.headers['stripe-signature'],
process.env.STRIPE_SIGNING_KEY_CONNECT
);
// Maybe it comes from another stripe webhook
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
if (event?.data?.object?.metadata?.service !== 'gitroom') {
return { ok: true };
}
switch (event.type) {
case 'checkout.session.completed':
return this._stripeService.updateOrder(event);
case 'account.updated':
return this._stripeService.updateAccount(event);
default:
return { ok: true };
}
}
@Post('/')
stripe(@Req() req: RawBodyRequest<Request>) {
const event = this._stripeService.validateRequest(
req.rawBody,
// @ts-ignore
req.headers['stripe-signature'],
process.env.STRIPE_SIGNING_KEY
);
// Maybe it comes from another stripe webhook
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
if (event?.data?.object?.metadata?.service !== 'gitroom') {
if (
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
event?.data?.object?.metadata?.service !== 'gitroom' &&
event.type !== 'invoice.payment_succeeded'
) {
return { ok: true };
}
switch (event.type) {
case 'checkout.session.completed':
return this._stripeService.updateOrder(event);
case 'account.updated':
return this._stripeService.updateAccount(event);
case 'customer.subscription.created':
return this._stripeService.createSubscription(event);
case 'customer.subscription.updated':
return this._stripeService.updateSubscription(event);
case 'customer.subscription.deleted':
return this._stripeService.deleteSubscription(event);
default:
return { ok: true };
try {
switch (event.type) {
case 'invoice.payment_succeeded':
return this._stripeService.paymentSucceeded(event);
case 'customer.subscription.created':
return this._stripeService.createSubscription(event);
case 'customer.subscription.updated':
return this._stripeService.updateSubscription(event);
case 'customer.subscription.deleted':
return this._stripeService.deleteSubscription(event);
default:
return { ok: true };
}
} catch (e) {
throw new HttpException(e, 500);
}
}
@Get('/lifetime-deal-codes/:provider')
@Header('Content-disposition', 'attachment; filename=codes.csv')
@Header('Content-type', 'text/csv')
async getStripeCodes(@Param('provider') providerToken: string) {
return this._codesService.generateCodes(providerToken);
}
}

View file

@ -0,0 +1,207 @@
import {
Body,
Controller,
Get,
HttpException,
Param,
Post,
Delete,
} from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { ThirdPartyManager } from '@gitroom/nestjs-libraries/3rdparties/thirdparty.manager';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization } from '@prisma/client';
import { AuthService } from '@gitroom/helpers/auth/auth.service';
import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory';
import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service';
import { ImportMediaDto } from '@gitroom/nestjs-libraries/dtos/third-party/import-media.dto';
@ApiTags('Third Party')
@Controller('/third-party')
export class ThirdPartyController {
private storage = UploadFactory.createStorage();
constructor(
private _thirdPartyManager: ThirdPartyManager,
private _mediaService: MediaService,
) {}
@Get('/list')
async getThirdPartyList() {
return this._thirdPartyManager.getAllThirdParties();
}
@Get('/')
async getSavedThirdParty(@GetOrgFromRequest() organization: Organization) {
return Promise.all(
(
await this._thirdPartyManager.getAllThirdPartiesByOrganization(
organization.id
)
).map((thirdParty) => {
const { description, fields, position, title, identifier } =
this._thirdPartyManager.getThirdPartyByName(thirdParty.identifier);
return {
...thirdParty,
title,
position,
fields,
description,
};
})
);
}
@Delete('/:id')
deleteById(
@GetOrgFromRequest() organization: Organization,
@Param('id') id: string
) {
return this._thirdPartyManager.deleteIntegration(organization.id, id);
}
@Post('/:id/submit')
async generate(
@GetOrgFromRequest() organization: Organization,
@Param('id') id: string,
@Body() data: any
) {
const thirdParty = await this._thirdPartyManager.getIntegrationById(
organization.id,
id
);
if (!thirdParty) {
throw new HttpException('Integration not found', 404);
}
const thirdPartyInstance = this._thirdPartyManager.getThirdPartyByName(
thirdParty.identifier
);
if (!thirdPartyInstance) {
throw new HttpException('Invalid identifier', 400);
}
const loadedData = await thirdPartyInstance?.instance?.sendData(
AuthService.fixedDecryption(thirdParty.apiKey),
data
);
const file = await this.storage.uploadSimple(loadedData);
return this._mediaService.saveFile(organization.id, file.split('/').pop(), file);
}
@Post('/function/:id/:functionName')
async callFunction(
@GetOrgFromRequest() organization: Organization,
@Param('id') id: string,
@Param('functionName') functionName: string,
@Body() data: any
) {
const thirdParty = await this._thirdPartyManager.getIntegrationById(
organization.id,
id
);
if (!thirdParty) {
throw new HttpException('Integration not found', 404);
}
const thirdPartyInstance = this._thirdPartyManager.getThirdPartyByName(
thirdParty.identifier
);
if (!thirdPartyInstance) {
throw new HttpException('Invalid identifier', 400);
}
return thirdPartyInstance?.instance?.[functionName](
AuthService.fixedDecryption(thirdParty.apiKey),
data
);
}
@Post('/:id/import')
async importMedia(
@GetOrgFromRequest() organization: Organization,
@Param('id') id: string,
@Body() body: ImportMediaDto
) {
const thirdParty = await this._thirdPartyManager.getIntegrationById(
organization.id,
id
);
if (!thirdParty) {
throw new HttpException('Integration not found', 404);
}
const thirdPartyInstance = this._thirdPartyManager.getThirdPartyByName(
thirdParty.identifier
);
if (!thirdPartyInstance) {
throw new HttpException('Invalid identifier', 400);
}
const downloadUrls = await thirdPartyInstance?.instance?.['importMedia']?.(
AuthService.fixedDecryption(thirdParty.apiKey),
body.items
);
if (!downloadUrls || !Array.isArray(downloadUrls)) {
throw new HttpException('Import not supported', 400);
}
const results = [];
for (const item of downloadUrls) {
const file = await this.storage.uploadSimple(item.url);
const saved = await this._mediaService.saveFile(
organization.id,
item.name || file.split('/').pop(),
file
);
results.push(saved);
}
return results;
}
@Post('/:identifier')
async addApiKey(
@GetOrgFromRequest() organization: Organization,
@Param('identifier') identifier: string,
@Body('api') api: string
) {
const thirdParty = this._thirdPartyManager.getThirdPartyByName(identifier);
if (!thirdParty) {
throw new HttpException('Invalid identifier', 400);
}
const connect = await thirdParty.instance.checkConnection(api);
if (!connect) {
throw new HttpException('Invalid API key', 400);
}
try {
const save = await this._thirdPartyManager.saveIntegration(
organization.id,
identifier,
api,
{
name: connect.name,
username: connect.username,
id: connect.id,
}
);
return {
id: save.id,
};
} catch (e) {
console.log(e);
throw new HttpException('Integration Already Exists', 400);
}
}
}

View file

@ -9,6 +9,7 @@ import {
Res,
} from '@nestjs/common';
import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request';
import { sign } from 'jsonwebtoken';
import { Organization, User } from '@prisma/client';
import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
@ -17,16 +18,19 @@ import { Response, Request } from 'express';
import { AuthService } from '@gitroom/backend/services/auth/auth.service';
import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service';
import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability';
import {
AuthorizationActions,
Sections,
} from '@gitroom/backend/services/auth/permissions/permissions.service';
import { removeSubdomain } from '@gitroom/helpers/subdomain/subdomain.management';
import { getCookieUrlFromDomain } from '@gitroom/helpers/subdomain/subdomain.management';
import { pricing } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/pricing';
import { ApiTags } from '@nestjs/swagger';
import { UsersService } from '@gitroom/nestjs-libraries/database/prisma/users/users.service';
import { UserDetailDto } from '@gitroom/nestjs-libraries/dtos/users/user.details.dto';
import { EmailNotificationsDto } from '@gitroom/nestjs-libraries/dtos/users/email-notifications.dto';
import { HttpForbiddenException } from '@gitroom/nestjs-libraries/services/exception.filter';
import { RealIP } from 'nestjs-real-ip';
import { UserAgent } from '@gitroom/nestjs-libraries/user/user.agent';
import { TrackEnum } from '@gitroom/nestjs-libraries/user/track.enum';
import { TrackService } from '@gitroom/nestjs-libraries/track/track.service';
import { makeId } from '@gitroom/nestjs-libraries/services/make.is';
import { AuthorizationActions, Sections } from '@gitroom/backend/services/auth/permissions/permission.exception.class';
@ApiTags('User')
@Controller('/user')
@ -36,36 +40,61 @@ export class UsersController {
private _stripeService: StripeService,
private _authService: AuthService,
private _orgService: OrganizationService,
private _userService: UsersService
private _userService: UsersService,
private _trackService: TrackService
) {}
@Get('/agent-media-sso')
async getAgentMediaSsoUrl(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization
) {
if (!process.env.AGENT_MEDIA_SSO_KEY) {
throw new HttpException('Agent Media SSO is not configured', 400);
}
const token = sign(
{ id: organization.id, displayName: organization.name },
process.env.AGENT_MEDIA_SSO_KEY
);
return { url: `https://agent-media.ai/sso/${token}` };
}
@Get('/self')
async getSelf(
@GetUserFromRequest() user: User,
@GetOrgFromRequest() organization: Organization,
@Req() req: Request,
@Req() req: Request
) {
if (!organization) {
throw new HttpForbiddenException();
}
const impersonate = req.cookies.impersonate || req.headers.impersonate;
// @ts-ignore
return {
...user,
orgId: organization.id,
// @ts-ignore
totalChannels: organization?.subscription?.totalChannels || pricing.FREE.channel,
totalChannels: !process.env.STRIPE_PUBLISHABLE_KEY ? 10000 : organization?.subscription?.totalChannels || pricing.FREE.channel,
// @ts-ignore
tier: organization?.subscription?.subscriptionTier || 'FREE',
tier: organization?.subscription?.subscriptionTier || (!process.env.STRIPE_PUBLISHABLE_KEY ? 'ULTIMATE' : 'FREE'),
// @ts-ignore
role: organization?.users[0]?.role,
// @ts-ignore
isLifetime: !!organization?.subscription?.isLifetime,
admin: !!user.isSuperAdmin,
impersonate: !!req.cookies.impersonate,
impersonate: !!impersonate,
isTrailing: !process.env.STRIPE_PUBLISHABLE_KEY ? false : organization?.isTrailing,
allowTrial: organization?.allowTrial,
streakSince: organization?.streakSince || null,
// @ts-ignore
publicApi: organization?.users[0]?.role === 'SUPERADMIN' || organization?.users[0]?.role === 'ADMIN' ? organization?.apiKey : '',
};
}
@Get('/personal')
async getPersonal(@GetUserFromRequest() user: User) {
async getPersonalInformation(@GetUserFromRequest() user: User) {
return this._userService.getPersonal(user.id);
}
@ -92,13 +121,20 @@ export class UsersController {
}
response.cookie('impersonate', id, {
domain:
'.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
secure: true,
httpOnly: true,
sameSite: 'none',
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
if (process.env.NOT_SECURED) {
response.header('impersonate', id);
}
}
@Post('/personal')
@ -109,6 +145,25 @@ export class UsersController {
return this._userService.changePersonal(user.id, body);
}
@Get('/email-notifications')
async getEmailNotifications(@GetUserFromRequest() user: User) {
return this._userService.getEmailNotifications(user.id);
}
@Post('/email-notifications')
async updateEmailNotifications(
@GetUserFromRequest() user: User,
@Body() body: EmailNotificationsDto
) {
return this._userService.updateEmailNotifications(user.id, body);
}
@Post('/api-key/rotate')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async rotateApiKey(@GetOrgFromRequest() organization: Organization) {
return this._orgService.updateApiKey(organization.id);
}
@Get('/subscription')
@CheckPolicies([AuthorizationActions.Create, Sections.ADMIN])
async getSubscription(@GetOrgFromRequest() organization: Organization) {
@ -163,49 +218,106 @@ export class UsersController {
@Res({ passthrough: true }) response: Response
) {
response.cookie('showorg', id, {
domain:
'.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
secure: true,
httpOnly: true,
sameSite: 'none',
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
if (process.env.NOT_SECURED) {
response.header('showorg', id);
}
response.status(200).send();
}
@Post('/logout')
logout(@Res({ passthrough: true }) response: Response) {
response.header('logout', 'true');
response.cookie('auth', '', {
domain:
'.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
secure: true,
httpOnly: true,
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
maxAge: -1,
expires: new Date(0),
sameSite: 'none',
});
response.cookie('showorg', '', {
domain:
'.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
secure: true,
httpOnly: true,
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
maxAge: -1,
expires: new Date(0),
sameSite: 'none',
});
response.cookie('impersonate', '', {
domain:
'.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname,
secure: true,
httpOnly: true,
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
maxAge: -1,
expires: new Date(0),
sameSite: 'none',
});
response.status(200).send();
}
@Post('/t')
async trackEvent(
@Res({ passthrough: true }) res: Response,
@Req() req: Request,
@GetUserFromRequest() user: User,
@RealIP() ip: string,
@UserAgent() userAgent: string,
@Body()
body: { tt: TrackEnum; fbclid: string; additional: Record<string, any> }
) {
const uniqueId = req?.cookies?.track || makeId(10);
const fbclid = req?.cookies?.fbclid || body.fbclid;
await this._trackService.track(
uniqueId,
ip,
userAgent,
body.tt,
body.additional,
fbclid,
user
);
if (!req.cookies.track) {
res.cookie('track', uniqueId, {
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
}
res.status(200).json({
track: uniqueId,
});
}
}

View file

@ -0,0 +1,70 @@
import {
Body,
Controller,
Delete,
Get,
Param,
Post,
Put,
Query,
} from '@nestjs/common';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization } from '@prisma/client';
import { ApiTags } from '@nestjs/swagger';
import { WebhooksService } from '@gitroom/nestjs-libraries/database/prisma/webhooks/webhooks.service';
import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability';
import {
OnlyURL, UpdateDto, WebhooksDto
} from '@gitroom/nestjs-libraries/dtos/webhooks/webhooks.dto';
import { AuthorizationActions, Sections } from '@gitroom/backend/services/auth/permissions/permission.exception.class';
@ApiTags('Webhooks')
@Controller('/webhooks')
export class WebhookController {
constructor(private _webhooksService: WebhooksService) {}
@Get('/')
async getStatistics(@GetOrgFromRequest() org: Organization) {
return this._webhooksService.getWebhooks(org.id);
}
@Post('/')
@CheckPolicies([AuthorizationActions.Create, Sections.WEBHOOKS])
async createAWebhook(
@GetOrgFromRequest() org: Organization,
@Body() body: WebhooksDto
) {
return this._webhooksService.createWebhook(org.id, body);
}
@Put('/')
async updateWebhook(
@GetOrgFromRequest() org: Organization,
@Body() body: UpdateDto
) {
return this._webhooksService.createWebhook(org.id, body);
}
@Delete('/:id')
async deleteWebhook(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
return this._webhooksService.deleteWebhook(org.id, id);
}
@Post('/send')
async sendWebhook(@Body() body: any, @Query() query: OnlyURL) {
try {
await fetch(query.url, {
method: 'POST',
body: JSON.stringify(body),
headers: { 'Content-Type': 'application/json' },
});
} catch (err) {
/** sent **/
}
return { send: true };
}
}

View file

@ -1,21 +1,66 @@
import {Global, Module} from '@nestjs/common';
import {DatabaseModule} from "@gitroom/nestjs-libraries/database/prisma/database.module";
import {ApiModule} from "@gitroom/backend/api/api.module";
import {APP_GUARD} from "@nestjs/core";
import {PoliciesGuard} from "@gitroom/backend/services/auth/permissions/permissions.guard";
import { BullMqModule } from '@gitroom/nestjs-libraries/bull-mq-transport-new/bull.mq.module';
import { Global, Module } from '@nestjs/common';
import { DatabaseModule } from '@gitroom/nestjs-libraries/database/prisma/database.module';
import { ApiModule } from '@gitroom/backend/api/api.module';
import { APP_GUARD } from '@nestjs/core';
import { PoliciesGuard } from '@gitroom/backend/services/auth/permissions/permissions.guard';
import { PublicApiModule } from '@gitroom/backend/public-api/public.api.module';
import { ThrottlerBehindProxyGuard } from '@gitroom/nestjs-libraries/throttler/throttler.provider';
import { ThrottlerModule } from '@nestjs/throttler';
import { AgentModule } from '@gitroom/nestjs-libraries/agent/agent.module';
import { ThirdPartyModule } from '@gitroom/nestjs-libraries/3rdparties/thirdparty.module';
import { VideoModule } from '@gitroom/nestjs-libraries/videos/video.module';
import { SentryModule } from '@sentry/nestjs/setup';
import { FILTER } from '@gitroom/nestjs-libraries/sentry/sentry.exception';
import { ChatModule } from '@gitroom/nestjs-libraries/chat/chat.module';
import { getTemporalModule } from '@gitroom/nestjs-libraries/temporal/temporal.module';
import { TemporalRegisterMissingSearchAttributesModule } from '@gitroom/nestjs-libraries/temporal/temporal.register';
import { InfiniteWorkflowRegisterModule } from '@gitroom/nestjs-libraries/temporal/infinite.workflow.register';
import { ThrottlerStorageRedisService } from '@nest-lab/throttler-storage-redis';
import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service';
@Global()
@Module({
imports: [BullMqModule, DatabaseModule, ApiModule],
imports: [
SentryModule.forRoot(),
DatabaseModule,
ApiModule,
PublicApiModule,
AgentModule,
ThirdPartyModule,
VideoModule,
ChatModule,
getTemporalModule(false),
TemporalRegisterMissingSearchAttributesModule,
InfiniteWorkflowRegisterModule,
ThrottlerModule.forRoot({
throttlers: [
{
ttl: 3600000,
limit: process.env.API_LIMIT ? Number(process.env.API_LIMIT) : 90,
},
],
storage: new ThrottlerStorageRedisService(ioRedis),
}),
],
controllers: [],
providers: [{
provide: APP_GUARD,
useClass: PoliciesGuard
}],
get exports() {
return [...this.imports];
}
providers: [
FILTER,
{
provide: APP_GUARD,
useClass: ThrottlerBehindProxyGuard,
},
{
provide: APP_GUARD,
useClass: PoliciesGuard,
},
],
exports: [
DatabaseModule,
ApiModule,
PublicApiModule,
AgentModule,
ThrottlerModule,
ChatModule,
],
})
export class AppModule {}

View file

@ -1,4 +1,11 @@
import { initializeSentry } from '@gitroom/nestjs-libraries/sentry/initialize.sentry';
initializeSentry('backend', true);
import compression from 'compression';
import { loadSwagger } from '@gitroom/helpers/swagger/load.swagger';
import { json } from 'express';
import { Runtime } from '@temporalio/worker';
Runtime.install({ shutdownSignals: [] });
process.env.TZ = 'UTC';
@ -6,29 +13,54 @@ import cookieParser from 'cookie-parser';
import { Logger, ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { SubscriptionExceptionFilter } from '@gitroom/backend/services/auth/permissions/subscription.exception';
import { HttpExceptionFilter } from '@gitroom/nestjs-libraries/services/exception.filter';
import { ConfigurationChecker } from '@gitroom/helpers/configuration/configuration.checker';
import { startMcp } from '@gitroom/nestjs-libraries/chat/start.mcp';
async function bootstrap() {
async function start() {
const app = await NestFactory.create(AppModule, {
rawBody: true,
cors: {
credentials: true,
exposedHeaders: ['reload', 'onboarding', 'activate'],
...(!process.env.NOT_SECURED ? { credentials: true } : {}),
allowedHeaders: [
'Content-Type',
'Authorization',
'auth',
'showorg',
'impersonate',
'x-copilotkit-runtime-client-gql-version',
],
exposedHeaders: [
'reload',
'onboarding',
'activate',
'x-copilotkit-runtime-client-gql-version',
...(process.env.NOT_SECURED ? ['auth', 'showorg', 'impersonate'] : []),
],
origin: [
process.env.FRONTEND_URL,
'http://localhost:6274',
...(process.env.MAIN_URL ? [process.env.MAIN_URL] : []),
],
},
});
await startMcp(app);
app.useGlobalPipes(
new ValidationPipe({
transform: true,
})
);
app.use(['/copilot/{*splat}', '/posts'], (req: any, res: any, next: any) => {
json({ limit: '50mb' })(req, res, next);
});
app.use(cookieParser());
app.use(compression());
app.useGlobalFilters(new SubscriptionExceptionFilter());
app.useGlobalFilters(new HttpExceptionFilter());
@ -38,6 +70,9 @@ async function bootstrap() {
try {
await app.listen(port);
console.log('Backend started successfully on port ' + port);
checkConfiguration(); // Do this last, so that users will see obvious issues at the end of the startup log without having to scroll up.
Logger.log(`🚀 Backend is running on: http://localhost:${port}`);
} catch (e) {
@ -45,4 +80,20 @@ async function bootstrap() {
}
}
bootstrap();
function checkConfiguration() {
const checker = new ConfigurationChecker();
checker.readEnvFromProcess();
checker.check();
if (checker.hasIssues()) {
for (const issue of checker.getIssues()) {
Logger.warn(issue, 'Configuration issue');
}
Logger.warn('Configuration issues found: ' + checker.getIssuesCount());
} else {
Logger.log('Configuration check completed without any issues');
}
}
start();

View file

@ -0,0 +1,37 @@
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AuthService } from '@gitroom/backend/services/auth/auth.service';
import { StripeService } from '@gitroom/nestjs-libraries/services/stripe.service';
import { PoliciesGuard } from '@gitroom/backend/services/auth/permissions/permissions.guard';
import { PermissionsService } from '@gitroom/backend/services/auth/permissions/permissions.service';
import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager';
import { UploadModule } from '@gitroom/nestjs-libraries/upload/upload.module';
import { OpenaiService } from '@gitroom/nestjs-libraries/openai/openai.service';
import { ExtractContentService } from '@gitroom/nestjs-libraries/openai/extract.content.service';
import { CodesService } from '@gitroom/nestjs-libraries/services/codes.service';
import { PublicIntegrationsController } from '@gitroom/backend/public-api/routes/v1/public.integrations.controller';
import { PublicAuthMiddleware } from '@gitroom/backend/services/auth/public.auth.middleware';
const authenticatedController = [PublicIntegrationsController];
@Module({
imports: [UploadModule],
controllers: [...authenticatedController],
providers: [
AuthService,
StripeService,
OpenaiService,
ExtractContentService,
PoliciesGuard,
PermissionsService,
CodesService,
IntegrationManager,
],
get exports() {
return [...this.imports, ...this.providers];
},
})
export class PublicApiModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(PublicAuthMiddleware).forRoutes(...authenticatedController);
}
}

View file

@ -0,0 +1,515 @@
import {
Body,
Controller,
Delete,
Get,
HttpException,
Param,
Post,
Put,
Query,
UploadedFile,
UseInterceptors,
UsePipes,
} from '@nestjs/common';
import { CustomFileValidationPipe } from '@gitroom/nestjs-libraries/upload/custom.upload.validation';
import { ApiTags } from '@nestjs/swagger';
import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request';
import { Organization } from '@prisma/client';
import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service';
import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability';
import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service';
import { FileInterceptor } from '@nestjs/platform-express';
import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory';
import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service';
import { GetPostsDto } from '@gitroom/nestjs-libraries/dtos/posts/get.posts.dto';
import { ChangePostStatusDto } from '@gitroom/nestjs-libraries/dtos/posts/change.post.status.dto';
import {
AuthorizationActions,
Sections,
} from '@gitroom/backend/services/auth/permissions/permission.exception.class';
import { VideoDto } from '@gitroom/nestjs-libraries/dtos/videos/video.dto';
import { VideoFunctionDto } from '@gitroom/nestjs-libraries/dtos/videos/video.function.dto';
import { UploadDto } from '@gitroom/nestjs-libraries/dtos/media/upload.dto';
import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service';
import { GetNotificationsDto } from '@gitroom/nestjs-libraries/dtos/notifications/get.notifications.dto';
import { Readable } from 'stream';
import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { fromBuffer } = require('file-type');
const PUBLIC_API_ALLOWED_MIME = new Set<string>([
'image/jpeg',
'image/png',
'image/gif',
'image/webp',
'image/avif',
'image/bmp',
'image/tiff',
'video/mp4',
]);
import * as Sentry from '@sentry/nestjs';
import {
socialIntegrationList,
IntegrationManager,
} from '@gitroom/nestjs-libraries/integrations/integration.manager';
import { getValidationSchemas } from '@gitroom/nestjs-libraries/chat/validation.schemas.helper';
import { RefreshIntegrationService } from '@gitroom/nestjs-libraries/integrations/refresh.integration.service';
import { RefreshToken } from '@gitroom/nestjs-libraries/integrations/social.abstract';
import { timer } from '@gitroom/helpers/utils/timer';
import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service';
@ApiTags('Public API')
@Controller('/public/v1')
export class PublicIntegrationsController {
private storage = UploadFactory.createStorage();
constructor(
private _integrationService: IntegrationService,
private _postsService: PostsService,
private _mediaService: MediaService,
private _notificationService: NotificationService,
private _integrationManager: IntegrationManager,
private _refreshIntegrationService: RefreshIntegrationService
) {}
@Post('/upload')
@UseInterceptors(FileInterceptor('file'))
@UsePipes(new CustomFileValidationPipe())
async uploadSimple(
@GetOrgFromRequest() org: Organization,
@UploadedFile('file') file: Express.Multer.File
) {
Sentry.metrics.count('public_api-request', 1);
if (!file) {
throw new HttpException({ msg: 'No file provided' }, 400);
}
const getFile = await this.storage.uploadFile(file);
return this._mediaService.saveFile(
org.id,
getFile.originalname,
getFile.path
);
}
@Post('/upload-from-url')
async uploadsFromUrl(
@GetOrgFromRequest() org: Organization,
@Body() body: UploadDto
) {
Sentry.metrics.count('public_api-request', 1);
const response = await fetch(body.url, {
// @ts-ignore — undici option, not in lib.dom fetch types
dispatcher: ssrfSafeDispatcher,
});
if (!response.ok) {
throw new HttpException({ msg: 'Failed to fetch URL' }, 400);
}
const buffer = Buffer.from(await response.arrayBuffer());
const detected = await fromBuffer(buffer);
if (!detected || !PUBLIC_API_ALLOWED_MIME.has(detected.mime)) {
throw new HttpException({ msg: 'Unsupported file type.' }, 400);
}
const mimetype = detected.mime;
const ext = detected.ext;
const getFile = await this.storage.uploadFile({
buffer,
mimetype,
size: buffer.length,
path: '',
fieldname: '',
destination: '',
stream: new Readable(),
filename: '',
originalname: `upload.${ext}`,
encoding: '',
});
return this._mediaService.saveFile(
org.id,
getFile.originalname,
getFile.path
);
}
@Get('/find-slot/:id')
async findSlotIntegration(
@GetOrgFromRequest() org: Organization,
@Param('id') id?: string
) {
Sentry.metrics.count('public_api-request', 1);
return { date: await this._postsService.findFreeDateTime(org.id, id) };
}
@Get('/posts')
async getPosts(
@GetOrgFromRequest() org: Organization,
@Query() query: GetPostsDto
) {
Sentry.metrics.count('public_api-request', 1);
const posts = await this._postsService.getPosts(org.id, query);
return {
posts,
// comments,
};
}
@Post('/posts')
@CheckPolicies([AuthorizationActions.Create, Sections.POSTS_PER_MONTH])
async createPost(
@GetOrgFromRequest() org: Organization,
@Body() rawBody: any
) {
Sentry.metrics.count('public_api-request', 1);
const body = await this._postsService.mapTypeToPost(
rawBody,
org.id,
rawBody.type === 'draft'
);
body.type = rawBody.type;
if (
process.env.RESTRICT_UPLOAD_DOMAINS &&
body.posts.some((p) =>
p.value.some((a) =>
a.image.some(
(i) => i.path.indexOf(process.env.RESTRICT_UPLOAD_DOMAINS) === -1
)
)
)
) {
throw new HttpException(
{
msg: `All media must be uploaded through our upload API route and contain the domain: ${process.env.RESTRICT_UPLOAD_DOMAINS}`,
},
400
);
}
const allowedCreationMethods = ['CLI', 'API'] as const;
const creationMethod = allowedCreationMethods.includes(
rawBody.creationMethod
)
? (rawBody.creationMethod as 'CLI' | 'API')
: 'API';
console.log(JSON.stringify(body, null, 2));
return this._postsService.createPost(org.id, body, creationMethod);
}
@Delete('/posts/:id')
async deletePost(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
Sentry.metrics.count('public_api-request', 1);
const getPostById = await this._postsService.getPost(org.id, id);
return this._postsService.deletePost(org.id, getPostById.group);
}
@Delete('/posts/group/:group')
deletePostByGroup(
@GetOrgFromRequest() org: Organization,
@Param('group') group: string
) {
Sentry.metrics.count('public_api-request', 1);
return this._postsService.deletePost(org.id, group);
}
@Get('/is-connected')
async getActiveIntegrations(@GetOrgFromRequest() org: Organization) {
Sentry.metrics.count('public_api-request', 1);
return { connected: true };
}
@Get('/integrations')
async listIntegration(@GetOrgFromRequest() org: Organization) {
Sentry.metrics.count('public_api-request', 1);
return (await this._integrationService.getIntegrationsList(org.id)).map(
(org) => ({
id: org.id,
name: org.name,
identifier: org.providerIdentifier,
picture: org.picture,
disabled: org.disabled,
profile: org.profile,
customer: org.customer
? {
id: org.customer.id,
name: org.customer.name,
}
: undefined,
})
);
}
@Get('/social/:integration')
@CheckPolicies([AuthorizationActions.Create, Sections.CHANNEL])
async getIntegrationUrl(
@Param('integration') integration: string,
@Query('refresh') refresh: string,
@GetOrgFromRequest() org: Organization
) {
Sentry.metrics.count('public_api-request', 1);
if (
!this._integrationManager
.getAllowedSocialsIntegrations()
.includes(integration)
) {
throw new HttpException({ msg: 'Integration not allowed' }, 400);
}
const integrationProvider =
this._integrationManager.getSocialIntegration(integration);
if (integrationProvider.externalUrl) {
throw new HttpException(
{
msg: 'This integration requires an external URL and is not supported via the public API',
},
400
);
}
try {
const { codeVerifier, state, url } =
await integrationProvider.generateAuthUrl();
if (refresh) {
await ioRedis.set(`refresh:${state}`, refresh, 'EX', 3600);
}
await ioRedis.set(`organization:${state}`, org.id, 'EX', 3600);
await ioRedis.set(`login:${state}`, codeVerifier, 'EX', 3600);
return { url };
} catch (err) {
throw new HttpException({ msg: 'Failed to generate auth URL' }, 500);
}
}
@Get('/notifications')
async getNotifications(
@GetOrgFromRequest() org: Organization,
@Query() query: GetNotificationsDto
) {
Sentry.metrics.count('public_api-request', 1);
return this._notificationService.getNotificationsPaginated(
org.id,
query.page ?? 0
);
}
@Post('/generate-video')
generateVideo(
@GetOrgFromRequest() org: Organization,
@Body() body: VideoDto
) {
Sentry.metrics.count('public_api-request', 1);
return this._mediaService.generateVideo(org, body);
}
@Post('/video/function')
videoFunction(@Body() body: VideoFunctionDto) {
Sentry.metrics.count('public_api-request', 1);
return this._mediaService.videoFunction(
body.identifier,
body.functionName,
body.params
);
}
@Delete('/integrations/:id')
async deleteChannel(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
Sentry.metrics.count('public_api-request', 1);
const isTherePosts = await this._integrationService.getPostsForChannel(
org.id,
id
);
if (isTherePosts.length) {
for (const post of isTherePosts) {
this._postsService.deletePost(org.id, post.group).catch(() => {});
}
}
return this._integrationService.deleteChannel(org.id, id);
}
@Get('/integration-settings/:id')
async getIntegrationSettings(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
Sentry.metrics.count('public_api-request', 1);
const loadIntegration = await this._integrationService.getIntegrationById(
org.id,
id
);
const verified =
JSON.parse(loadIntegration.additionalSettings || '[]')?.find(
(p: any) => p?.title === 'Verified'
)?.value || false;
const integration = socialIntegrationList.find(
(p) => p.identifier === loadIntegration.providerIdentifier
)!;
if (!integration) {
return {
output: { rules: '', maxLength: 0, settings: {}, tools: [] as any[] },
};
}
const maxLength = integration.maxLength(verified);
const schemas = !integration.dto
? false
: getValidationSchemas()[integration.dto.name];
const tools = this._integrationManager.getAllTools();
const rules = this._integrationManager.getAllRulesDescription();
return {
output: {
rules: rules[integration.identifier],
maxLength,
settings: !schemas ? 'No additional settings required' : schemas,
tools: tools[integration.identifier],
},
};
}
@Get('/posts/:id/missing')
async getMissingContent(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string
) {
Sentry.metrics.count('public_api-request', 1);
return this._postsService.getMissingContent(org.id, id);
}
@Put('/posts/:id/status')
async changePostStatus(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body() body: ChangePostStatusDto
) {
Sentry.metrics.count('public_api-request', 1);
return this._postsService.changePostStatus(org.id, id, body.status);
}
@Put('/posts/:id/release-id')
async updateReleaseId(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body('releaseId') releaseId: string
) {
Sentry.metrics.count('public_api-request', 1);
return this._postsService.updateReleaseId(org.id, id, releaseId);
}
@Get('/analytics/:integration')
async getAnalytics(
@GetOrgFromRequest() org: Organization,
@Param('integration') integration: string,
@Query('date') date: string
) {
Sentry.metrics.count('public_api-request', 1);
return this._integrationService.checkAnalytics(org, integration, date);
}
@Get('/analytics/post/:postId')
async getPostAnalytics(
@GetOrgFromRequest() org: Organization,
@Param('postId') postId: string,
@Query('date') date: string
) {
Sentry.metrics.count('public_api-request', 1);
return this._postsService.checkPostAnalytics(org.id, postId, +date);
}
@Post('/integration-trigger/:id')
async triggerIntegrationTool(
@GetOrgFromRequest() org: Organization,
@Param('id') id: string,
@Body() body: { methodName: string; data: Record<string, string> }
) {
Sentry.metrics.count('public_api-request', 1);
const getIntegration = await this._integrationService.getIntegrationById(
org.id,
id
);
if (!getIntegration) {
throw new HttpException({ msg: 'Integration not found' }, 404);
}
const integrationProvider = socialIntegrationList.find(
(p) => p.identifier === getIntegration.providerIdentifier
)!;
if (!integrationProvider) {
throw new HttpException({ msg: 'Integration provider not found' }, 404);
}
const tools = this._integrationManager.getAllTools();
if (
// @ts-ignore
!tools[integrationProvider.identifier]?.some(
(p: any) => p.methodName === body.methodName
) ||
// @ts-ignore
!integrationProvider[body.methodName]
) {
throw new HttpException({ msg: 'Tool not found' }, 404);
}
while (true) {
try {
// @ts-ignore
const result = await integrationProvider[body.methodName](
getIntegration.token,
body.data || {},
getIntegration.internalId,
getIntegration
);
return { output: result };
} catch (err) {
if (err instanceof RefreshToken) {
const data = await this._refreshIntegrationService.refresh(
getIntegration
);
if (!data) {
await this._integrationService.disconnectChannel(
org.id,
getIntegration
);
throw new HttpException(
{ msg: 'Channel disconnected due to expired token' },
401
);
}
const { accessToken } = data;
if (accessToken) {
getIntegration.token = accessToken;
if (integrationProvider.refreshWait) {
await timer(10000);
}
continue;
}
}
throw new HttpException({ msg: 'Unexpected error' }, 500);
}
}
}
}

View file

@ -6,17 +6,21 @@ import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/o
import { UsersService } from '@gitroom/nestjs-libraries/database/prisma/users/users.service';
import { getCookieUrlFromDomain } from '@gitroom/helpers/subdomain/subdomain.management';
import { HttpForbiddenException } from '@gitroom/nestjs-libraries/services/exception.filter';
import { MastraService } from '@gitroom/nestjs-libraries/chat/mastra.service';
export const removeAuth = (res: Response) => {
res.cookie('auth', '', {
domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!),
secure: true,
httpOnly: true,
sameSite: 'none',
...(!process.env.NOT_SECURED
? {
secure: true,
httpOnly: true,
sameSite: 'none',
}
: {}),
expires: new Date(0),
maxAge: -1,
});
res.header('logout', 'true');
};
@ -43,9 +47,10 @@ export class AuthMiddleware implements NestMiddleware {
throw new HttpForbiddenException();
}
if (user?.isSuperAdmin && req.cookies.impersonate) {
const impersonate = req.cookies.impersonate || req.headers.impersonate;
if (user?.isSuperAdmin && impersonate) {
const loadImpersonate = await this._organizationService.getUserOrg(
req.cookies.impersonate
impersonate
);
if (loadImpersonate) {
@ -81,6 +86,10 @@ export class AuthMiddleware implements NestMiddleware {
throw new HttpForbiddenException();
}
if (!setOrg.apiKey) {
await this._organizationService.updateApiKey(setOrg.id);
}
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
req.user = user;

View file

@ -5,12 +5,12 @@ import { LoginUserDto } from '@gitroom/nestjs-libraries/dtos/auth/login.user.dto
import { UsersService } from '@gitroom/nestjs-libraries/database/prisma/users/users.service';
import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service';
import { AuthService as AuthChecker } from '@gitroom/helpers/auth/auth.service';
import { ProvidersFactory } from '@gitroom/backend/services/auth/providers/providers.factory';
import { AuthProviderManager } from '@gitroom/backend/services/auth/providers/providers.manager';
import dayjs from 'dayjs';
import { NewsletterService } from '@gitroom/nestjs-libraries/services/newsletter.service';
import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service';
import { ForgotReturnPasswordDto } from '@gitroom/nestjs-libraries/dtos/auth/forgot-return.password.dto';
import { EmailService } from '@gitroom/nestjs-libraries/services/email.service';
import { NewsletterService } from '@gitroom/nestjs-libraries/newsletter/newsletter.service';
@Injectable()
export class AuthService {
@ -19,20 +19,48 @@ export class AuthService {
private _organizationService: OrganizationService,
private _notificationService: NotificationService,
private _emailService: EmailService,
private _providerManager: AuthProviderManager
) {}
async canRegister(provider: string) {
if (
process.env.DISABLE_REGISTRATION !== 'true' ||
provider === Provider.GENERIC
) {
return true;
}
return (await this._organizationService.getCount()) === 0;
}
async routeAuth(
provider: Provider,
body: CreateOrgUserDto | LoginUserDto,
ip: string,
userAgent: string,
addToOrg?: boolean | { orgId: string; role: 'USER' | 'ADMIN'; id: string }
) {
if (provider === Provider.LOCAL) {
if (process.env.DISALLOW_PLUS && body.email.includes('+')) {
throw new Error('Email with plus sign is not allowed');
}
if (body instanceof CreateOrgUserDto) {
body.email = body.email.toLowerCase();
}
const user = await this._userService.getUserByEmail(body.email);
if (body instanceof CreateOrgUserDto) {
if (user) {
throw new Error('User already exists');
throw new Error('Email already exists');
}
const create = await this._organizationService.createOrgAndUser(body);
if (!(await this.canRegister(provider))) {
throw new Error('Registration is disabled');
}
const create = await this._organizationService.createOrgAndUser(
body,
ip,
userAgent
);
const addedOrg =
addToOrg && typeof addToOrg !== 'boolean'
@ -45,7 +73,12 @@ export class AuthService {
: false;
const obj = { addedOrg, jwt: await this.jwt(create.users[0].user) };
await this._emailService.sendEmail(body.email, 'Activate your account', `Click <a href="${process.env.FRONTEND_URL}/auth/activate/${obj.jwt}">here</a> to activate your account`);
await this._emailService.sendEmail(
body.email,
'Activate your account',
`Click <a href="${process.env.FRONTEND_URL}/auth/activate/${obj.jwt}">here</a> to activate your account`,
'top'
);
return obj;
}
@ -62,7 +95,9 @@ export class AuthService {
const user = await this.loginOrRegisterProvider(
provider,
body as CreateOrgUserDto
body as CreateOrgUserDto,
ip,
userAgent
);
const addedOrg =
@ -101,9 +136,11 @@ export class AuthService {
private async loginOrRegisterProvider(
provider: Provider,
body: CreateOrgUserDto
body: CreateOrgUserDto,
ip: string,
userAgent: string
) {
const providerInstance = ProvidersFactory.loadProvider(provider);
const providerInstance = this._providerManager.getProvider(provider);
const providerUser = await providerInstance.getUser(body.providerToken);
if (!providerUser) {
@ -118,19 +155,65 @@ export class AuthService {
return user;
}
const create = await this._organizationService.createOrgAndUser({
company: body.company,
email: providerUser.email,
password: '',
provider,
providerId: providerUser.id,
});
if (!(await this.canRegister(provider))) {
throw new Error('Registration is disabled');
}
NewsletterService.register(providerUser.email);
const create = await this._organizationService.createOrgAndUser(
{
company: body.company,
email: providerUser.email,
password: '',
provider,
providerId: providerUser.id,
datafast_visitor_id: body.datafast_visitor_id,
},
ip,
userAgent
);
this._track('register', providerUser.email, body.datafast_visitor_id).catch(
(err) => {}
);
await NewsletterService.register(providerUser.email);
try {
if (providerInstance?.postRegistration) {
await providerInstance.postRegistration(body.providerToken, create.id);
}
} catch (err) {
// Don't fail registration if postRegistration fails
}
return create.users[0].user;
}
private async _track(
name: string,
email: string,
datafast_visitor_id: string
) {
if (email && datafast_visitor_id && process.env.DATAFAST_API_KEY) {
try {
await fetch('https://datafa.st/api/v1/goals', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.DATAFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
datafast_visitor_id: datafast_visitor_id,
name: name,
metadata: {
email,
},
}),
});
} catch (err) {}
}
}
async forgot(email: string) {
const user = await this._userService.getUserByEmail(email);
if (!user || user.providerName !== Provider.LOCAL) {
@ -161,8 +244,12 @@ export class AuthService {
return this._userService.updatePassword(user.id, body.password);
}
async activate(code: string) {
const user = AuthChecker.verifyJWT(code) as { id: string, activated: boolean, email: string };
async activate(code: string, tracking: string) {
const user = AuthChecker.verifyJWT(code) as {
id: string;
activated: boolean;
email: string;
};
if (user.id && !user.activated) {
const getUserAgain = await this._userService.getUserByEmail(user.email);
if (getUserAgain.activated) {
@ -170,6 +257,7 @@ export class AuthService {
}
await this._userService.activateUser(user.id);
user.activated = true;
this._track('register', user.email, tracking).catch((err) => {});
await NewsletterService.register(user.email);
return this.jwt(user as any);
}
@ -177,18 +265,37 @@ export class AuthService {
return false;
}
oauthLink(provider: string) {
const providerInstance = ProvidersFactory.loadProvider(
provider as Provider
async resendActivationEmail(email: string) {
const user = await this._userService.getUserByEmail(email);
if (!user) {
throw new Error('User not found');
}
if (user.activated) {
throw new Error('Account is already activated');
}
const jwt = await this.jwt(user);
await this._emailService.sendEmail(
user.email,
'Activate your account',
`Click <a href="${process.env.FRONTEND_URL}/auth/activate/${jwt}">here</a> to activate your account`,
'top'
);
return providerInstance.generateLink();
return true;
}
async checkExists(provider: string, code: string) {
const providerInstance = ProvidersFactory.loadProvider(
provider as Provider
);
const token = await providerInstance.getToken(code);
oauthLink(provider: string, query?: any) {
const providerInstance = this._providerManager.getProvider(provider);
return providerInstance.generateLink(query);
}
async checkExists(provider: string, code: string, redirectUri?: string) {
const providerInstance = this._providerManager.getProvider(provider);
const token = await providerInstance.getToken(code, redirectUri);
const user = await providerInstance.getUser(token);
if (!user) {
throw new Error('Invalid user');
@ -205,6 +312,9 @@ export class AuthService {
}
private async jwt(user: User) {
if (user.password) {
delete user.password;
}
return AuthChecker.signJWT(user);
}
}

View file

@ -0,0 +1,27 @@
import { HttpException, HttpStatus } from '@nestjs/common';
export enum Sections {
CHANNEL = 'channel',
POSTS_PER_MONTH = 'posts_per_month',
VIDEOS_PER_MONTH = 'videos_per_month',
TEAM_MEMBERS = 'team_members',
COMMUNITY_FEATURES = 'community_features',
FEATURED_BY_GITROOM = 'featured_by_gitroom',
AI = 'ai',
IMPORT_FROM_CHANNELS = 'import_from_channels',
ADMIN = 'admin',
WEBHOOKS = 'webhooks',
}
export enum AuthorizationActions {
Create = 'create',
Read = 'read',
Update = 'update',
Delete = 'delete',
}
export class SubscriptionException extends HttpException {
constructor(message: { section: Sections; action: AuthorizationActions }) {
super(message, HttpStatus.PAYMENT_REQUIRED);
}
}

View file

@ -1,6 +1,7 @@
import {SetMetadata} from "@nestjs/common";
import {AuthorizationActions, Sections} from "@gitroom/backend/services/auth/permissions/permissions.service";
import { SetMetadata } from '@nestjs/common';
import { AuthorizationActions, Sections } from './permission.exception.class';
export const CHECK_POLICIES_KEY = 'check_policy';
export type AbilityPolicy = [AuthorizationActions, Sections];
export const CheckPolicies = (...handlers: AbilityPolicy[]) => SetMetadata(CHECK_POLICIES_KEY, handlers);
export const CheckPolicies = (...handlers: AbilityPolicy[]) =>
SetMetadata(CHECK_POLICIES_KEY, handlers);

View file

@ -1,29 +1,39 @@
import {CanActivate, ExecutionContext, Injectable} from "@nestjs/common";
import {Reflector} from "@nestjs/core";
import {AppAbility, PermissionsService} from "@gitroom/backend/services/auth/permissions/permissions.service";
import {AbilityPolicy, CHECK_POLICIES_KEY} from "@gitroom/backend/services/auth/permissions/permissions.ability";
import {Organization} from "@prisma/client";
import {SubscriptionException} from "@gitroom/backend/services/auth/permissions/subscription.exception";
import {Request} from "express";
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import {
AppAbility,
PermissionsService,
} from '@gitroom/backend/services/auth/permissions/permissions.service';
import {
AbilityPolicy,
CHECK_POLICIES_KEY,
} from '@gitroom/backend/services/auth/permissions/permissions.ability';
import { Organization } from '@prisma/client';
import { Request } from 'express';
import { SubscriptionException } from './permission.exception.class';
@Injectable()
export class PoliciesGuard implements CanActivate {
constructor(
private _reflector: Reflector,
private _authorizationService: PermissionsService,
private _authorizationService: PermissionsService
) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const request: Request = context.switchToHttp().getRequest();
if (request.path.indexOf('/auth') > -1 || request.path.indexOf('/stripe') > -1) {
if (
request.path.indexOf('/auth') > -1 ||
request.path.indexOf('/auth') > -1 ||
request.path.indexOf('/integrations/social-connect') > -1 ||
request.path.indexOf('/integrations/provider') > -1
) {
return true;
}
const policyHandlers =
this._reflector.get<AbilityPolicy[]>(
CHECK_POLICIES_KEY,
context.getHandler(),
context.getHandler()
) || [];
if (!policyHandlers || !policyHandlers.length) {
@ -32,19 +42,21 @@ export class PoliciesGuard implements CanActivate {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
const { org } : {org: Organization} = request;
const { org }: { org: Organization } = request;
const refreshChannelId = typeof request.query?.refresh === 'string' ? request.query.refresh : undefined;
// @ts-ignore
const ability = await this._authorizationService.check(org.id, org.createdAt, org.users[0].role, policyHandlers);
const ability = await this._authorizationService.check(org.id, org.createdAt, org.users[0].role, policyHandlers, refreshChannelId);
const item = policyHandlers.find((handler) =>
!this.execPolicyHandler(handler, ability),
const item = policyHandlers.find(
(handler) => !this.execPolicyHandler(handler, ability)
);
if (item) {
throw new SubscriptionException({
section: item[1],
action: item[0]
action: item[0],
});
}

View file

@ -5,24 +5,8 @@ import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/s
import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service';
import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service';
import dayjs from 'dayjs';
export enum Sections {
CHANNEL = 'channel',
POSTS_PER_MONTH = 'posts_per_month',
TEAM_MEMBERS = 'team_members',
COMMUNITY_FEATURES = 'community_features',
FEATURED_BY_GITROOM = 'featured_by_gitroom',
AI = 'ai',
IMPORT_FROM_CHANNELS = 'import_from_channels',
ADMIN = 'admin',
}
export enum AuthorizationActions {
Create = 'create',
Read = 'read',
Update = 'update',
Delete = 'delete',
}
import { WebhooksService } from '@gitroom/nestjs-libraries/database/prisma/webhooks/webhooks.service';
import { AuthorizationActions, Sections } from './permission.exception.class';
export type AppAbility = Ability<[AuthorizationActions, Sections]>;
@ -31,7 +15,8 @@ export class PermissionsService {
constructor(
private _subscriptionService: SubscriptionService,
private _postsService: PostsService,
private _integrationService: IntegrationService
private _integrationService: IntegrationService,
private _webhooksService: WebhooksService
) {}
async getPackageOptions(orgId: string) {
const subscription =
@ -55,7 +40,8 @@ export class PermissionsService {
orgId: string,
created_at: Date,
permission: 'USER' | 'ADMIN' | 'SUPERADMIN',
requestedPermission: Array<[AuthorizationActions, Sections]>
requestedPermission: Array<[AuthorizationActions, Sections]>,
refreshChannelId?: string
) {
const { can, build } = new AbilityBuilder<
Ability<[AuthorizationActions, Sections]>
@ -80,9 +66,23 @@ export class PermissionsService {
for (const [action, section] of requestedPermission) {
// check for the amount of channels
if (section === Sections.CHANNEL) {
// Refreshing an existing channel doesn't add a new one, so skip the limit check
// but only if the channel actually belongs to this org
if (refreshChannelId) {
const existingIntegration =
await this._integrationService.getIntegrationById(
orgId,
refreshChannelId
);
if (existingIntegration) {
can(action, section);
continue;
}
}
const totalChannels = (
await this._integrationService.getIntegrationsList(orgId)
).filter(f => !f.refreshNeeded).length;
).filter((f) => !f.refreshNeeded).length;
if (
(options.channel && options.channel > totalChannels) ||
@ -93,6 +93,14 @@ export class PermissionsService {
}
}
if (section === Sections.WEBHOOKS) {
const totalWebhooks = await this._webhooksService.getTotal(orgId);
if (totalWebhooks < options.webhooks) {
can(AuthorizationActions.Create, section);
continue;
}
}
// check for posts per month
if (section === Sections.POSTS_PER_MONTH) {
const createdAt =

View file

@ -1,14 +1,10 @@
import {ArgumentsHost, Catch, ExceptionFilter, HttpException, HttpStatus} from "@nestjs/common";
import {AuthorizationActions, Sections} from "@gitroom/backend/services/auth/permissions/permissions.service";
export class SubscriptionException extends HttpException {
constructor(message: {
section: Sections,
action: AuthorizationActions
}) {
super(message, HttpStatus.PAYMENT_REQUIRED);
}
}
import {
ArgumentsHost,
Catch,
ExceptionFilter,
HttpException,
} from '@nestjs/common';
import { AuthorizationActions, Sections, SubscriptionException } from '@gitroom/backend/services/auth/permissions/permission.exception.class';
@Catch(SubscriptionException)
export class SubscriptionExceptionFilter implements ExceptionFilter {
@ -16,19 +12,23 @@ export class SubscriptionExceptionFilter implements ExceptionFilter {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const status = exception.getStatus();
const error: {section: Sections, action: AuthorizationActions} = exception.getResponse() as any;
const error: { section: Sections; action: AuthorizationActions } =
exception.getResponse() as any;
const message = getErrorMessage(error);
response.status(status).json({
statusCode: status,
message,
url: process.env.FRONTEND_URL + '/billing',
statusCode: status,
message,
url: process.env.FRONTEND_URL + '/billing',
});
}
}
const getErrorMessage = (error: {section: Sections, action: AuthorizationActions}) => {
const getErrorMessage = (error: {
section: Sections;
action: AuthorizationActions;
}) => {
switch (error.section) {
case Sections.POSTS_PER_MONTH:
switch (error.action) {
@ -40,5 +40,15 @@ const getErrorMessage = (error: {section: Sections, action: AuthorizationActions
default:
return 'You have reached the maximum number of channels for your subscription. Please upgrade your subscription to add more channels.';
}
case Sections.WEBHOOKS:
switch (error.action) {
default:
return 'You have reached the maximum number of webhooks for your subscription. Please upgrade your subscription to add more webhooks.';
}
case Sections.VIDEOS_PER_MONTH:
switch (error.action) {
default:
return 'You have reached the maximum number of generated videos for your subscription. Please upgrade your subscription to generate more videos.';
}
}
}
};

View file

@ -1,5 +1,34 @@
export interface ProvidersInterface {
generateLink(): string;
getToken(code: string): Promise<string>;
getUser(providerToken: string): Promise<{email: string, id: string}> | false;
}
import { Injectable } from '@nestjs/common';
export abstract class AuthProviderAbstract {
abstract generateLink(query?: any): Promise<string> | string;
abstract getToken(code: string, redirectUri?: string): Promise<string>;
abstract getUser(
providerToken: string
): Promise<{ email: string; id: string }> | false;
async postRegistration(
providerToken: string,
orgId: string
): Promise<void> {}
}
export interface AuthProviderParams {
provider: string;
}
export function AuthProvider(params: AuthProviderParams) {
return function (target: any) {
Injectable()(target);
const existingMetadata =
Reflect.getMetadata('auth-provider', AuthProviderAbstract) || [];
existingMetadata.push({ target, provider: params.provider });
Reflect.defineMetadata(
'auth-provider',
existingMetadata,
AuthProviderAbstract
);
};
}

View file

@ -0,0 +1,41 @@
import {
AuthProvider,
AuthProviderAbstract,
} from '@gitroom/backend/services/auth/providers.interface';
import { NeynarAPIClient } from '@neynar/nodejs-sdk';
const client = new NeynarAPIClient({
apiKey: process.env.NEYNAR_SECRET_KEY || '00000000-000-0000-000-000000000000',
});
@AuthProvider({ provider: 'FARCASTER' })
export class FarcasterProvider extends AuthProviderAbstract {
generateLink() {
return '';
}
async getToken(code: string, _redirectUri?: string) {
const data = JSON.parse(Buffer.from(code, 'base64').toString());
const status = await client.lookupSigner({ signerUuid: data.signer_uuid });
if (status.status === 'approved') {
return data.signer_uuid;
}
return '';
}
async getUser(providerToken: string) {
const status = await client.lookupSigner({ signerUuid: providerToken });
if (status.status !== 'approved') {
return {
id: '',
email: '',
};
}
return {
id: String('farcaster_' + status.fid),
email: String('farcaster_' + status.fid),
};
}
}

View file

@ -1,6 +1,10 @@
import { ProvidersInterface } from '@gitroom/backend/services/auth/providers.interface';
import {
AuthProvider,
AuthProviderAbstract,
} from '@gitroom/backend/services/auth/providers.interface';
export class GithubProvider implements ProvidersInterface {
@AuthProvider({ provider: 'GITHUB' })
export class GithubProvider extends AuthProviderAbstract {
generateLink(): string {
return `https://github.com/login/oauth/authorize?client_id=${
process.env.GITHUB_CLIENT_ID
@ -9,7 +13,7 @@ export class GithubProvider implements ProvidersInterface {
)}`;
}
async getToken(code: string): Promise<string> {
async getToken(code: string, _redirectUri?: string): Promise<string> {
const { access_token } = await (
await fetch('https://github.com/login/oauth/access_token', {
method: 'POST',

View file

@ -1,45 +1,28 @@
import { makeId } from '@gitroom/nestjs-libraries/services/make.is';
import { google } from 'googleapis';
import { OAuth2Client } from 'google-auth-library/build/src/auth/oauth2client';
import { ProvidersInterface } from '@gitroom/backend/services/auth/providers.interface';
import {
AuthProvider,
AuthProviderAbstract,
} from '@gitroom/backend/services/auth/providers.interface';
const clientAndYoutube = () => {
const client = new google.auth.OAuth2({
const defaultRedirect = () =>
`${process.env.FRONTEND_URL}/integrations/social/youtube`;
const makeClient = (redirectUri: string) =>
new google.auth.OAuth2({
clientId: process.env.YOUTUBE_CLIENT_ID,
clientSecret: process.env.YOUTUBE_CLIENT_SECRET,
redirectUri: `${process.env.FRONTEND_URL}/integrations/social/youtube`,
redirectUri,
});
const youtube = (newClient: OAuth2Client) =>
google.youtube({
version: 'v3',
auth: newClient,
});
const youtubeAnalytics = (newClient: OAuth2Client) =>
google.youtubeAnalytics({
version: 'v2',
auth: newClient,
});
const oauth2 = (newClient: OAuth2Client) =>
google.oauth2({
version: 'v2',
auth: newClient,
});
return { client, youtube, oauth2, youtubeAnalytics };
};
export class GoogleProvider implements ProvidersInterface {
generateLink() {
const state = makeId(7);
const { client } = clientAndYoutube();
return client.generateAuthUrl({
@AuthProvider({ provider: 'GOOGLE' })
export class GoogleProvider extends AuthProviderAbstract {
generateLink(query?: { redirect_uri?: string }) {
const redirectUri = query?.redirect_uri || defaultRedirect();
return makeClient(redirectUri).generateAuthUrl({
access_type: 'online',
prompt: 'consent',
state,
redirect_uri: `${process.env.FRONTEND_URL}/integrations/social/youtube`,
state: 'login',
redirect_uri: redirectUri,
scope: [
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/userinfo.email',
@ -47,21 +30,22 @@ export class GoogleProvider implements ProvidersInterface {
});
}
async getToken(code: string) {
const { client, oauth2 } = clientAndYoutube();
async getToken(code: string, redirectUri?: string) {
const client = makeClient(redirectUri || defaultRedirect());
const { tokens } = await client.getToken(code);
return tokens.access_token;
return tokens.access_token!;
}
async getUser(providerToken: string) {
const { client, oauth2 } = clientAndYoutube();
const client = makeClient(defaultRedirect());
client.setCredentials({ access_token: providerToken });
const user = oauth2(client);
const { data } = await user.userinfo.get();
const { data } = await google
.oauth2({ version: 'v2', auth: client })
.userinfo.get();
return {
id: data.id!,
email: data.email,
email: data.email!,
};
}
}

View file

@ -0,0 +1,94 @@
import {
AuthProvider,
AuthProviderAbstract,
} from '@gitroom/backend/services/auth/providers.interface';
@AuthProvider({ provider: 'GENERIC' })
export class OauthProvider extends AuthProviderAbstract {
private getConfig() {
const {
POSTIZ_OAUTH_AUTH_URL,
POSTIZ_OAUTH_CLIENT_ID,
POSTIZ_OAUTH_CLIENT_SECRET,
POSTIZ_OAUTH_TOKEN_URL,
POSTIZ_OAUTH_USERINFO_URL,
FRONTEND_URL,
} = process.env;
if (
!POSTIZ_OAUTH_USERINFO_URL ||
!POSTIZ_OAUTH_TOKEN_URL ||
!POSTIZ_OAUTH_CLIENT_ID ||
!POSTIZ_OAUTH_CLIENT_SECRET ||
!POSTIZ_OAUTH_AUTH_URL ||
!FRONTEND_URL
) {
throw new Error('POSTIZ_OAUTH environment variables are not set');
}
return {
authUrl: POSTIZ_OAUTH_AUTH_URL,
clientId: POSTIZ_OAUTH_CLIENT_ID,
clientSecret: POSTIZ_OAUTH_CLIENT_SECRET,
tokenUrl: POSTIZ_OAUTH_TOKEN_URL,
userInfoUrl: POSTIZ_OAUTH_USERINFO_URL,
frontendUrl: FRONTEND_URL,
};
}
generateLink(): string {
const { authUrl, clientId, frontendUrl } = this.getConfig();
const params = new URLSearchParams({
client_id: clientId,
scope: 'openid profile email',
response_type: 'code',
redirect_uri: `${frontendUrl}/settings`,
});
return `${authUrl}?${params.toString()}`;
}
async getToken(code: string, _redirectUri?: string): Promise<string> {
const { tokenUrl, clientId, clientSecret, frontendUrl } = this.getConfig();
const response = await fetch(`${tokenUrl}`, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Accept: 'application/json',
},
body: new URLSearchParams({
grant_type: 'authorization_code',
client_id: clientId,
client_secret: clientSecret,
code,
redirect_uri: `${frontendUrl}/settings`,
}),
});
if (!response.ok) {
const error = await response.text();
throw new Error(`Token request failed: ${error}`);
}
const { access_token } = await response.json();
return access_token;
}
async getUser(access_token: string): Promise<{ email: string; id: string }> {
const { userInfoUrl } = this.getConfig();
const response = await fetch(`${userInfoUrl}`, {
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
},
});
if (!response.ok) {
const error = await response.text();
throw new Error(`User info request failed: ${error}`);
}
const { email, sub: id } = await response.json();
return { email, id };
}
}

View file

@ -1,15 +0,0 @@
import { Provider } from '@prisma/client';
import { GithubProvider } from '@gitroom/backend/services/auth/providers/github.provider';
import { ProvidersInterface } from '@gitroom/backend/services/auth/providers.interface';
import { GoogleProvider } from '@gitroom/backend/services/auth/providers/google.provider';
export class ProvidersFactory {
static loadProvider(provider: Provider): ProvidersInterface {
switch (provider) {
case Provider.GITHUB:
return new GithubProvider();
case Provider.GOOGLE:
return new GoogleProvider();
}
}
}

View file

@ -0,0 +1,23 @@
import { Injectable } from '@nestjs/common';
import { ModuleRef } from '@nestjs/core';
import { AuthProviderAbstract } from '@gitroom/backend/services/auth/providers.interface';
@Injectable()
export class AuthProviderManager {
constructor(private _moduleRef: ModuleRef) {}
getProvider(provider: string): AuthProviderAbstract {
const metadata =
Reflect.getMetadata('auth-provider', AuthProviderAbstract) || [];
const found = metadata.find(
(m: any) => m.provider === provider
);
if (!found) {
throw new Error(`Auth provider ${provider} not found`);
}
return this._moduleRef.get(found.target, { strict: false });
}
}

View file

@ -0,0 +1,90 @@
import {
AuthProvider,
AuthProviderAbstract,
} from '@gitroom/backend/services/auth/providers.interface';
import { randomBytes } from 'crypto';
import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service';
import bs58 from 'bs58';
import nacl from 'tweetnacl';
function hexToUint8Array(hex) {
if (hex.startsWith('0x')) {
hex = hex.slice(2);
}
if (hex.length % 2 !== 0) {
throw new Error('Invalid hex string. It must have an even length.');
}
const byteLength = hex.length / 2;
const uint8Array = new Uint8Array(byteLength);
for (let i = 0; i < byteLength; i++) {
const byteHex = hex.substr(i * 2, 2);
uint8Array[i] = parseInt(byteHex, 16);
}
return uint8Array;
}
@AuthProvider({ provider: 'WALLET' })
export class WalletProvider extends AuthProviderAbstract {
async generateLink(params: { publicKey: string }) {
if (!params.publicKey) {
return;
}
const challenge = randomBytes(32).toString('hex');
await ioRedis.set(`wallet:${params.publicKey}`, challenge, 'EX', 60);
return challenge;
}
async getToken(code: string, _redirectUri?: string) {
const { publicKey, challenge, signature } = JSON.parse(
Buffer.from(code, 'base64').toString()
);
if (!publicKey || !challenge || !signature) {
return '';
}
const redisGet = await ioRedis.get(`wallet:${publicKey}`);
if (redisGet !== challenge) {
return '';
}
const publicKeyUint8 = bs58.decode(publicKey);
const messageUint8 = new TextEncoder().encode(challenge);
const signatureUint8 = hexToUint8Array(signature);
const isValid = nacl.sign.detached.verify(
messageUint8,
signatureUint8,
publicKeyUint8
);
if (!isValid) {
return '';
}
return code;
}
async getUser(providerToken: string) {
if ((await this.getToken(providerToken)) === '') {
return {
id: '',
email: '',
};
}
const { publicKey } = JSON.parse(
Buffer.from(providerToken, 'base64').toString()
);
return {
id: String(`wallet_${publicKey}`),
email: String(`wallet_${publicKey}`),
};
}
}

View file

@ -0,0 +1,64 @@
import { HttpStatus, Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service';
import { OAuthService } from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service';
import { HttpForbiddenException } from '@gitroom/nestjs-libraries/services/exception.filter';
@Injectable()
export class PublicAuthMiddleware implements NestMiddleware {
constructor(
private _organizationService: OrganizationService,
private _oauthService: OAuthService
) {}
async use(req: Request, res: Response, next: NextFunction) {
const auth = (req.headers.authorization ||
req.headers.Authorization) as string;
if (!auth) {
res.status(HttpStatus.UNAUTHORIZED).json({ msg: 'No API Key found' });
return;
}
try {
if (auth.startsWith('pos_')) {
const authorization = await this._oauthService.getOrgByOAuthToken(auth);
if (!authorization) {
res
.status(HttpStatus.UNAUTHORIZED)
.json({ msg: 'Invalid OAuth token' });
return;
}
const org = authorization.organization;
if (!!process.env.STRIPE_SECRET_KEY && !org.subscription) {
res
.status(HttpStatus.UNAUTHORIZED)
.json({ msg: 'No subscription found' });
return;
}
// @ts-ignore
req.org = { ...org, users: [{ users: { role: 'SUPERADMIN' } }] };
} else {
const org = await this._organizationService.getOrgByApiKey(auth);
if (!org) {
res
.status(HttpStatus.UNAUTHORIZED)
.json({ msg: 'Invalid API key' });
return;
}
if (!!process.env.STRIPE_SECRET_KEY && !org.subscription) {
res
.status(HttpStatus.UNAUTHORIZED)
.json({ msg: 'No subscription found' });
return;
}
// @ts-ignore
req.org = { ...org, users: [{ users: { role: 'SUPERADMIN' } }] };
}
} catch (err) {
throw new HttpForbiddenException();
}
next();
}
}

View file

@ -1,12 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"module": "commonjs",
"types": ["node", "multer"],
"emitDecoratorMetadata": true,
"target": "es2021"
},
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts"]
}

View file

@ -0,0 +1,23 @@
{
"extends": "./tsconfig.json",
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"],
"compilerOptions": {
"module": "CommonJS",
"resolveJsonModule": true,
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "ES2021",
"sourceMap": true,
"incremental": true,
"skipLibCheck": true,
"strictNullChecks": false,
"noImplicitAny": false,
"strictBindCallApply": false,
"forceConsistentCasingInFileNames": false,
"noFallthroughCasesInSwitch": false,
"outDir": "./dist"
}
}

View file

@ -1,17 +1,12 @@
{
"extends": "../../tsconfig.base.json",
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.app.json"
},
{
"path": "./tsconfig.spec.json"
}
],
"compilerOptions": {
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true
"module": "commonjs",
"declaration": true,
"removeComments": true,
"allowSyntheticDefaultImports": true,
"target": "es2017",
"sourceMap": true,
"esModuleInterop": true
}
}

View file

@ -1,14 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"module": "commonjs",
"types": ["jest", "node"]
},
"include": [
"jest.config.ts",
"src/**/*.test.ts",
"src/**/*.spec.ts",
"src/**/*.d.ts"
]
}

View file

@ -1,13 +0,0 @@
const { composePlugins, withNx } = require('@nx/webpack');
// Nx plugins for webpack.
module.exports = composePlugins(
withNx({
target: 'node',
}),
(config) => {
// Update the webpack config as needed here.
// e.g. `config.plugins.push(new MyPlugin())`
return config;
}
);

View file

@ -1,18 +0,0 @@
{
"extends": ["../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}

8
apps/commands/.gitignore vendored Normal file
View file

@ -0,0 +1,8 @@
dist/
node_modules/
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]

View file

@ -1,11 +0,0 @@
/* eslint-disable */
export default {
displayName: 'consumers',
preset: '../../jest.preset.js',
testEnvironment: 'node',
transform: {
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
},
moduleFileExtensions: ['ts', 'js', 'html'],
coverageDirectory: '../../coverage/apps/consumers',
};

View file

@ -0,0 +1,20 @@
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"monorepo": false,
"sourceRoot": "src",
"entryFile": "../../dist/commands/apps/commands/src/main",
"language": "ts",
"generateOptions": {
"spec": false
},
"compilerOptions": {
"manualRestart": true,
"tsConfigPath": "./tsconfig.build.json",
"webpack": false,
"deleteOutDir": true,
"assets": [],
"watchAssets": false,
"plugins": []
}
}

Some files were not shown because too many files have changed in this diff Show more