Merge branch 'main' into mk.absturztau.be

This commit is contained in:
Puniko 2023-03-05 08:47:50 +01:00
commit 6a8128f255
370 changed files with 1965 additions and 1805 deletions

File diff suppressed because one or more lines are too long

873
.yarn/releases/yarn-3.4.1.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View file

@ -8,4 +8,4 @@ plugins:
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs - path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
spec: "@yarnpkg/plugin-workspace-tools" spec: "@yarnpkg/plugin-workspace-tools"
yarnPath: .yarn/releases/yarn-3.3.0.cjs yarnPath: .yarn/releases/yarn-3.4.1.cjs

View file

@ -86,8 +86,6 @@ This release contains 6 breaking changes, including changes to the configuration
### Removed: ### Removed:
- **BREAKING** server: remove Twitter, Github and Discord integrations - **BREAKING** server: remove Twitter, Github and Discord integrations
ff31b8b06 server: remove bios and cli
a673647fb server: remove avatarColor and bannerColor properties
- **BREAKING** server: remove `api/admin/delete-account`, - **BREAKING** server: remove `api/admin/delete-account`,
You should use the API endpoint `admin/accounts/delete` instead. You should use the API endpoint `admin/accounts/delete` instead.
It has the same parameter and the same behaviour. It has the same parameter and the same behaviour.
@ -108,6 +106,8 @@ a673647fb server: remove avatarColor and bannerColor properties
- `/api/i/gallery/likes` - `/api/i/gallery/likes`
- `/api/i/gallery/posts` - `/api/i/gallery/posts`
- `/api/users/gallery/posts` - `/api/users/gallery/posts`
- server: remove bios and cli
- server: remove avatarColor and bannerColor properties
- server: remove application level websocket ping - server: remove application level websocket ping
This pinging mechanism was unused in `foundkey-js`, and we expect other usage to be low. This pinging mechanism was unused in `foundkey-js`, and we expect other usage to be low.
You can use the pinging mechanism built into the websocket protocol if you wish. You can use the pinging mechanism built into the websocket protocol if you wish.

View file

@ -34,6 +34,7 @@ For a production environment you might not want to follow the `main` branch dire
This project follows [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html). This project follows [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html).
Significant changes should be listed in the changelog (i.e. the file called `CHANGELOG.md`, see also section "Changelog Trailer" below). Significant changes should be listed in the changelog (i.e. the file called `CHANGELOG.md`, see also section "Changelog Trailer" below).
Although Semantic Versioning talks about "the API", changes to the user interface should also be tracked. Although Semantic Versioning talks about "the API", changes to the user interface should also be tracked.
However, changes to translation files are not considered notable enough to be listed in the changelog.
Consider if any of the existing documentation has to be updated because of your contribution. Consider if any of the existing documentation has to be updated because of your contribution.

View file

@ -6,7 +6,9 @@ FoundKey is a free and open source microblogging server compatible with Activity
See the [changelog](./CHANGELOG.md) and [roadmap](./ROADMAP.md) for more on what's changed and future plans. See the [changelog](./CHANGELOG.md) and [roadmap](./ROADMAP.md) for more on what's changed and future plans.
## Documentation ## Documentation
FoundKey's documentation is a work in progress. In the meantime, much of the documentation on the [Misskey Hub](https://misskey-hub.net/) will also apply to FoundKey. FoundKey's documentation is a work in progress, which can be found in the `docs/` folder.
In the meantime, much of the documentation on the [Misskey Hub](https://misskey-hub.net/) will also apply to FoundKey.
## Contributing ## Contributing
If you're interested in helping out with the project, please read the [contributing guide](./CONTRIBUTING.md). If you're interested in helping out with the project, please read the [contributing guide](./CONTRIBUTING.md).

View file

@ -1,2 +0,0 @@
# Changing the default Reaction
You can change the default reaction that is used when an ActivityPub "Like" is received from '👍' to '⭐' by changing the boolean value `meta.useStarForReactionFallback` in the databse respectively.

View file

@ -64,6 +64,13 @@ adduser --disabled-password --disabled-login foundkey
- Make sure you set the PostgreSQL and Redis settings correctly. - Make sure you set the PostgreSQL and Redis settings correctly.
- Use a strong password for the PostgreSQL user and take note of it since it'll be needed later. - Use a strong password for the PostgreSQL user and take note of it since it'll be needed later.
### Reverse proxy
For production use and for HTTPS termination you will have to use a reverse proxy.
There are instructions for setting up [nginx](./nginx.md) for this purpose.
### Changing the default Reaction
You can change the default reaction that is used when an ActivityPub "Like" is received from '👍' to '⭐' by changing the boolean value `meta.useStarForReactionFallback` in the databse respectively.
## Build FoundKey ## Build FoundKey
Build foundkey with the following: Build foundkey with the following:

View file

@ -10,7 +10,7 @@
4. Run `sudo nginx -t` to verify that the configuration file will be loaded successfully. 4. Run `sudo nginx -t` to verify that the configuration file will be loaded successfully.
5. Run `sudo systemctl restart nginx` to restart nginx. 5. Run `sudo systemctl restart nginx` to restart nginx.
# Nginx cofig example # Nginx config example
```nginx ```nginx
# For WebSocket # For WebSocket

View file

@ -3,7 +3,7 @@ headlineMisskey: "নোট ব্যাবহার করে সংযুক
introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা।\ introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা।\
\ \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন \U0001F4E1\n\"রিঅ্যাকশন\"\ \ \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন \U0001F4E1\n\"রিঅ্যাকশন\"\
\ গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন \U0001F44D\n\ \ গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন \U0001F44D\n\
একটি নতুন দুনিয়া ঘুরে দেখুন \U0001F680\n" একটি নতুন দুনিয়া ঘুরে দেখুন \U0001F680"
monthAndDay: "{day}/{month}" monthAndDay: "{day}/{month}"
search: "খুঁজুন" search: "খুঁজুন"
notifications: "বিজ্ঞপ্তি" notifications: "বিজ্ঞপ্তি"
@ -65,7 +65,7 @@ driveFileDeleteConfirm: "আপনি কি নিশ্চিত যে আপ
unfollowConfirm: "{name} কে আনফলোও করার ব্যাপারে নিশ্চিত?" unfollowConfirm: "{name} কে আনফলোও করার ব্যাপারে নিশ্চিত?"
exportRequested: "আপনার তথ্যসমূহ রপ্তানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে।\ exportRequested: "আপনার তথ্যসমূহ রপ্তানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে।\
\ রপ্তানি সম্পন্ন হলে তা আপনার ড্রাইভে সংরক্ষিত হবে।" \ রপ্তানি সম্পন্ন হলে তা আপনার ড্রাইভে সংরক্ষিত হবে।"
importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে। " importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে।."
lists: "লিস্ট" lists: "লিস্ট"
note: "নোট" note: "নোট"
notes: "নোটগুলি" notes: "নোটগুলি"
@ -79,10 +79,10 @@ somethingHappened: "একটি ত্রুটি হয়েছে"
retry: "আবার চেষ্টা করুন" retry: "আবার চেষ্টা করুন"
pageLoadError: "পেজ লোড করা যায়নি" pageLoadError: "পেজ লোড করা যায়নি"
pageLoadErrorDescription: "এটি সাধারনত নেটওয়ার্কের সমস্যার বা ব্রাউজার ক্যাশের কারণে\ pageLoadErrorDescription: "এটি সাধারনত নেটওয়ার্কের সমস্যার বা ব্রাউজার ক্যাশের কারণে\
\ ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন। " \ ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন।."
serverIsDead: "এই সার্ভার বর্তমানে সাড়া দিচ্ছে না। একটু পরে আবার চেষ্টা করুন।" serverIsDead: "এই সার্ভার বর্তমানে সাড়া দিচ্ছে না। একটু পরে আবার চেষ্টা করুন।"
youShouldUpgradeClient: "এই পেজ দেখার জন্য আপনার ব্রাউজার রিফ্রেশ করে ক্লায়েন্ট আপডেট\ youShouldUpgradeClient: "এই পেজ দেখার জন্য আপনার ব্রাউজার রিফ্রেশ করে ক্লায়েন্ট আপডেট\
\ করুন। " \ করুন।."
enterListName: "লিস্টের নাম লিখুন" enterListName: "লিস্টের নাম লিখুন"
privacy: "গোপনীয়তা" privacy: "গোপনীয়তা"
makeFollowManuallyApprove: "অনুসরণ করার অনুরোধগুলি গৃহীত হওয়ার জন্য আপনার অনুমতি লাগবে" makeFollowManuallyApprove: "অনুসরণ করার অনুরোধগুলি গৃহীত হওয়ার জন্য আপনার অনুমতি লাগবে"
@ -447,7 +447,7 @@ objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "রেফারেন্স হিসাবে ব্যবহৃত URL। আপনি একটি CDN বা প্রক্সি\ objectStorageBaseUrlDesc: "রেফারেন্স হিসাবে ব্যবহৃত URL। আপনি একটি CDN বা প্রক্সি\
\ ব্যবহার করলে URL, S3: 'https://<bucket>.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/<bucket>'।" \ ব্যবহার করলে URL, S3: 'https://<bucket>.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/<bucket>'।"
objectStorageBucket: "Bucket" objectStorageBucket: "Bucket"
objectStorageBucketDesc: "ব্যবহার করা পরিষেবার bucket এর নাম লিখুন। " objectStorageBucketDesc: "ব্যবহার করা পরিষেবার bucket এর নাম লিখুন।."
objectStoragePrefix: "Prefix" objectStoragePrefix: "Prefix"
objectStoragePrefixDesc: "ফাইলসমূহ এই prefix যুক্ত ফোল্ডারের অধীনে সংরক্ষণ করা হবে।" objectStoragePrefixDesc: "ফাইলসমূহ এই prefix যুক্ত ফোল্ডারের অধীনে সংরক্ষণ করা হবে।"
objectStorageEndpoint: "এন্ডপয়েন্ট" objectStorageEndpoint: "এন্ডপয়েন্ট"
@ -495,7 +495,7 @@ deleteAllFilesConfirm: "সকল ফাইল ডিলিট করতে চ
removeAllFollowing: "সকল অনুসরণ বাতিল করুন" removeAllFollowing: "সকল অনুসরণ বাতিল করুন"
removeAllFollowingDescription: "{host} এর সকল ব্যাবহারকারীকে আর ফলোও করবেন না । যদি\ removeAllFollowingDescription: "{host} এর সকল ব্যাবহারকারীকে আর ফলোও করবেন না । যদি\
\ ইন্সত্যান্সটির কোন সমস্যা (যেমনঃ ইন্সত্যান্সটি আর নেই) হয়ে থাকে তবে এটি ব্যাবহার\ \ ইন্সত্যান্সটির কোন সমস্যা (যেমনঃ ইন্সত্যান্সটি আর নেই) হয়ে থাকে তবে এটি ব্যাবহার\
\ করুন । " \ করুন ।."
userSuspended: "এই ব্যাবহারকারির অ্যাকাউন্ট স্থগিত করা হয়েছে" userSuspended: "এই ব্যাবহারকারির অ্যাকাউন্ট স্থগিত করা হয়েছে"
userSilenced: "এই ব্যাবহারকারিকে মিউট করা হয়েছে" userSilenced: "এই ব্যাবহারকারিকে মিউট করা হয়েছে"
yourAccountSuspendedTitle: "এই অ্যাকাউন্টটি স্থগিত করা হয়েছে" yourAccountSuspendedTitle: "এই অ্যাকাউন্টটি স্থগিত করা হয়েছে"
@ -625,7 +625,7 @@ driveFilesCount: "ড্রাইভে ফাইল এর সংখ্যা"
driveUsage: "ড্রাইভ এর ব্যাবহার" driveUsage: "ড্রাইভ এর ব্যাবহার"
noCrawle: "ক্রলার ইন্ডেক্সিং বন্ধ করুন" noCrawle: "ক্রলার ইন্ডেক্সিং বন্ধ করুন"
noCrawleDescription: "সার্চ ইঞ্জিনগুলিকে আপনার প্রোফাইল, নোট, পেজ ইত্যাদি ইনডেক্স\ noCrawleDescription: "সার্চ ইঞ্জিনগুলিকে আপনার প্রোফাইল, নোট, পেজ ইত্যাদি ইনডেক্স\
\ করতে নিষেধ করুন। " \ করতে নিষেধ করুন।."
lockedAccountInfo: "এমনকি আপনি আপনার অনুসরণকারীদের বেছে বেছে অনুমোদন করলেও, যে কেউ\ lockedAccountInfo: "এমনকি আপনি আপনার অনুসরণকারীদের বেছে বেছে অনুমোদন করলেও, যে কেউ\
\ আপনার নোটগুলি দেখতে পাবে, যতক্ষণ না আপনি আপনার নোটগুলিকে \"অনুসারীদের জন্য\" হিসাবে\ \ আপনার নোটগুলি দেখতে পাবে, যতক্ষণ না আপনি আপনার নোটগুলিকে \"অনুসারীদের জন্য\" হিসাবে\
\ সেট না করেন৷" \ সেট না করেন৷"
@ -786,7 +786,7 @@ _emailUnavailable:
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে" used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি" format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
disposable: "অস্থায়ী ইমেইল ঠিকানা ব্যাবহার করা যাবে না" disposable: "অস্থায়ী ইমেইল ঠিকানা ব্যাবহার করা যাবে না"
mx: "ইমেইল সার্ভারটি ঠিক না" mx: "ইমেইল সার্ভারটি ঠিক না"
smtp: "ইমেইল সার্ভারটি সাড়া দিচ্ছে না" smtp: "ইমেইল সার্ভারটি সাড়া দিচ্ছে না"
_ffVisibility: _ffVisibility:
public: "প্রকাশ" public: "প্রকাশ"
@ -858,8 +858,7 @@ _mfm:
center: "সেন্টার" center: "সেন্টার"
centerDescription: "লেখা মাঝ বরাবর দেখানো হবে" centerDescription: "লেখা মাঝ বরাবর দেখানো হবে"
inlineCode: "কোড (ইনলাইন)" inlineCode: "কোড (ইনলাইন)"
inlineCodeDescription: " প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা\ inlineCodeDescription: "প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা হবে."
\ হবে"
blockCode: "কোড (ব্লক)" blockCode: "কোড (ব্লক)"
blockCodeDescription: "মাল্টি-লাইন প্রোগ্রামের কোডের জন্য সিনট্যাক্স হাইলাইট করে।" blockCodeDescription: "মাল্টি-লাইন প্রোগ্রামের কোডের জন্য সিনট্যাক্স হাইলাইট করে।"
inlineMath: "গাণিতিক সূত্র (ইনলাইন)" inlineMath: "গাণিতিক সূত্র (ইনলাইন)"

View file

@ -14,7 +14,7 @@ fetchingAsApObject: "Cercant en el Fediverse..."
ok: "OK" ok: "OK"
gotIt: "Ho he entès!" gotIt: "Ho he entès!"
cancel: "Cancel·lar" cancel: "Cancel·lar"
renotedBy: "Resignat per {usuari}" renotedBy: "Resignat per {user}"
noNotes: "Cap nota" noNotes: "Cap nota"
noNotifications: "Cap notificació" noNotifications: "Cap notificació"
instance: "Instàncies" instance: "Instàncies"

View file

@ -337,9 +337,9 @@ pinnedUsers: "Angeheftete Benutzer"
pinnedUsersDescription: "Gib durch Leerzeichen getrennte Benutzer an, die an die \"\ pinnedUsersDescription: "Gib durch Leerzeichen getrennte Benutzer an, die an die \"\
Erkunden\"-Seite angeheftet werden sollen." Erkunden\"-Seite angeheftet werden sollen."
hcaptchaSiteKey: "Site key" hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key" hcaptchaSecretKey: "Geheimer Schlüssel"
recaptchaSiteKey: "Site key" recaptchaSiteKey: "Site-Schlüssel"
recaptchaSecretKey: "Secret key" recaptchaSecretKey: "Geheimer Schlüssel"
antennas: "Antennen" antennas: "Antennen"
manageAntennas: "Antennen verwalten" manageAntennas: "Antennen verwalten"
name: "Name" name: "Name"
@ -969,9 +969,9 @@ _wordMute:
\ trennen." \ trennen."
muteWordsDescription2: "Umgib Schlüsselworter mit Schrägstrichen, um Reguläre Ausdrücke\ muteWordsDescription2: "Umgib Schlüsselworter mit Schrägstrichen, um Reguläre Ausdrücke\
\ zu verwenden." \ zu verwenden."
softDescription: "Notizen, die die angegebenen Konditionen erfüllen, in der Chronik\ softDescription: "Notizen, welche die angegebenen Konditionen erfüllen, in der Chronik\
\ ausblenden." \ ausblenden."
hardDescription: "Verhindern, dass Notizen, die die angegebenen Konditionen erfüllen,\ hardDescription: "Verhindern, dass Notizen, welche die angegebenen Konditionen erfüllen,\
\ der Chronik hinzugefügt werden. Zudem werden diese Notizen auch nicht der Chronik\ \ der Chronik hinzugefügt werden. Zudem werden diese Notizen auch nicht der Chronik\
\ hinzugefügt, falls die Konditionen geändert werden." \ hinzugefügt, falls die Konditionen geändert werden."
soft: "Leicht" soft: "Leicht"
@ -1278,7 +1278,7 @@ _pages:
hideTitleWhenPinned: "Seitentitel wenn angeheftet ausblenden" hideTitleWhenPinned: "Seitentitel wenn angeheftet ausblenden"
font: "Schriftart" font: "Schriftart"
fontSerif: "Serif" fontSerif: "Serif"
fontSansSerif: "Sans Serif" fontSansSerif: "serifenlos"
eyeCatchingImageSet: "Vorschaubild festlegen" eyeCatchingImageSet: "Vorschaubild festlegen"
eyeCatchingImageRemove: "Vorschaubild entfernen" eyeCatchingImageRemove: "Vorschaubild entfernen"
_relayStatus: _relayStatus:
@ -1355,7 +1355,7 @@ confirmToUnclipAlreadyClippedNote: "Diese Notiz ist bereits im \"{name}\" Clip e
noEmailServerWarning: "Es ist kein Email-Server konfiguriert." noEmailServerWarning: "Es ist kein Email-Server konfiguriert."
thereIsUnresolvedAbuseReportWarning: "Es liegen ungelöste Meldungen vor." thereIsUnresolvedAbuseReportWarning: "Es liegen ungelöste Meldungen vor."
recommended: "Empfehlung" recommended: "Empfehlung"
check: "Check" check: "Überprüfen"
maxCustomEmojiPicker: Maximale Anzahl vorgeschlagener benutzerdefinierter Emoji maxCustomEmojiPicker: Maximale Anzahl vorgeschlagener benutzerdefinierter Emoji
maxUnicodeEmojiPicker: Maximale Anzahl vorgeschlagener Unicode-Emoji maxUnicodeEmojiPicker: Maximale Anzahl vorgeschlagener Unicode-Emoji
documentation: Dokumentation documentation: Dokumentation

View file

@ -71,8 +71,8 @@ importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de t
lists: "Listes" lists: "Listes"
note: "Notes" note: "Notes"
notes: "Notes" notes: "Notes"
following: "Abonnements" following: "Suivis"
followers: "Abonné·e·s" followers: "Vous suivent"
followsYou: "Vous suit" followsYou: "Vous suit"
createList: "Créer une liste" createList: "Créer une liste"
manageLists: "Gérer les listes" manageLists: "Gérer les listes"
@ -88,15 +88,15 @@ youShouldUpgradeClient: "Si la page ne s'affiche pas correctement, rechargez-la
\ mettre votre client à jour." \ mettre votre client à jour."
enterListName: "Nom de la liste" enterListName: "Nom de la liste"
privacy: "Confidentialité" privacy: "Confidentialité"
makeFollowManuallyApprove: "Accepter manuellement les demandes dabonnement" makeFollowManuallyApprove: "Accepter manuellement les demandes de suivi"
defaultNoteVisibility: "Visibilité des notes par défaut" defaultNoteVisibility: "Visibilité des notes par défaut"
follow: "Sabonner" follow: "Suivre"
followRequest: "Demande dabonnement" followRequest: "Demande de suivi"
followRequests: "Demandes dabonnement" followRequests: "Demandes de suivi"
unfollow: "Se désabonner" unfollow: "Ne plus suivre"
followRequestPending: "Demande d'abonnement en attente de confirmation" followRequestPending: "Demande de suivi en attente de confirmation"
renote: "Renoter" renote: "Renoter"
unrenote: "Annuler la Renote" unrenote: "Retirer la renote"
quote: "Citer" quote: "Citer"
pinnedNote: "Note épinglée" pinnedNote: "Note épinglée"
you: "Vous" you: "Vous"
@ -1056,33 +1056,34 @@ _2fa:
step2Url: 'Vous pouvez aussi entrer cette URL si vous utilisez un client lourd sur step2Url: 'Vous pouvez aussi entrer cette URL si vous utilisez un client lourd sur
ordinateur :' ordinateur :'
_permissions: _permissions:
"read:account": "Afficher les informations du compte" "read:account": "Lire les informations du compte"
"write:account": "Mettre à jour les informations du compte" "write:account": "Mettre à jour les informations du compte"
"read:blocks": "Voir les comptes bloqués" "read:blocks": "Lire les utilisateurs bloqués"
"write:blocks": "Bloquer et Débloquer des comptes" "write:blocks": "Bloquer et Débloquer des comptes"
"read:drive": "Parcourir le Drive" "read:drive": "Lister les fichiers et dossiers du drive"
"write:drive": "Écrire sur le Drive" "write:drive": "Créer, changer et supprimer des fichiers du drive"
"read:favorites": "Afficher les favoris" "read:favorites": "Lister les notes favorites"
"write:favorites": "Gérer les favoris" "write:favorites": "Gérer les notes favorites"
"read:following": "Voir les informations de vos abonnements" "read:following": "Lister les comptes suivis et les comptes qui vous suivent"
"write:following": "Abonner et désabonner autres comptes" "write:following": "Abonner et désabonner autres comptes"
"read:messaging": "Voir vos discussions" "read:messaging": "Voir vos discussions et leur historique"
"write:messaging": "Gérer les discussions" "write:messaging": "Créer et supprimer les messages des discussions"
"read:mutes": "Voir les comptes masqués" "read:mutes": "Lister les comptes desquels vous masquez les notes ou les renotes"
"write:mutes": "Gérer les comptes masqués" "write:mutes": "Masquer et démasquer les notes ou les renotes des comptes"
"write:notes": "Créer / supprimer des notes" "write:notes": "Gérer les notes"
"read:notifications": "Afficher les notifications" "read:notifications": "Lire vos notifications"
"write:notifications": "Gérer vos notifications" "write:notifications": "Gérer vos notifications et en créer"
"write:reactions": "Gérer vos réactions" "write:reactions": "Gérer les réactions"
"write:votes": "Voter" "write:votes": "Voter dans les sondages"
"read:pages": "Voir vos pages" "read:pages": "Lister et lire les pages"
"write:pages": "Gérer les pages" "write:pages": "Gérer les pages"
"read:page-likes": "Voir les mentions « J'aime » des pages" "read:page-likes": "Voir les mentions « J'aime » des pages"
"write:page-likes": "Gérer les mentions « J'aime » sur les pages" "write:page-likes": "Gérer les mentions « J'aime » sur les pages"
"read:user-groups": "Voir les groupes d'utilisateur·rice·s" "read:user-groups": "Voir les groupes d'utilisateur·rice·s"
"write:user-groups": "Éditer les groupes des utilisateur·rice·s" "write:user-groups": "Éditer les groupes des utilisateur·rice·s"
"read:channels": "Lire les canaux" "read:channels": "Lister et lire les canaux suivis et rejoints"
"write:channels": "Gérer les canaux" "write:channels": "Gérer les canaux"
"read:reactions": Lister les réactions
_auth: _auth:
shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?" shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?"
shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre\ shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre\
@ -1385,3 +1386,15 @@ useDrawerReactionPickerForMobile: Sur mobile afficher un tiroir pour le panneau
réaction réaction
appAuthorization: Authorisation de l'application appAuthorization: Authorisation de l'application
noPermissionsRequested: (Aucune permission demandée.) noPermissionsRequested: (Aucune permission demandée.)
oauthErrorGoBack: Une erreur est survenue pendant l'authentification d'une application
tierce. Veuillez réessayer.
botFollowRequiresApproval: Accepter manuellement les demandes de suivi des comptes
marqués « robots »
unrenoteAllConfirm: Étes-vous certain·e de vouloir retirer toutes les renotes de cette
note ?
unrenoteAll: Retirer toutes les renotes
deleteAllFiles: Supprimer tous les fichiers
cannotAttachFileWhenAccountSwitched: Vous ne pouvez pas joindre un fichier à partir
d'un autre compte.
cannotSwitchAccountWhenFileAttached: Vous ne pouvez pas changer de compte tant qu'il
y a des pièces jointes.

View file

@ -1225,7 +1225,7 @@ _pages:
editPage: "Sunting halaman" editPage: "Sunting halaman"
readPage: "Lihat sumber kode aktif" readPage: "Lihat sumber kode aktif"
created: "Halaman berhasil dibuat" created: "Halaman berhasil dibuat"
updated: "Halaman berhasil diperbaharui!" updated: "Halaman berhasil diperbaharui"
deleted: "Halaman telah dihapus" deleted: "Halaman telah dihapus"
pageSetting: "Pengaturan Halaman" pageSetting: "Pengaturan Halaman"
nameAlreadyExists: "URL Halaman yang ditentukan sudah ada" nameAlreadyExists: "URL Halaman yang ditentukan sudah ada"

View file

@ -190,7 +190,7 @@ blockedUsers: "Account bloccati"
noUsers: "Nessun utente trovato" noUsers: "Nessun utente trovato"
editProfile: "Modifica profilo" editProfile: "Modifica profilo"
noteDeleteConfirm: "Eliminare questo Nota?" noteDeleteConfirm: "Eliminare questo Nota?"
pinLimitExceeded: "Non puoi fissare altre note " pinLimitExceeded: "Non puoi fissare altre note."
intro: "L'installazione di FoundKey è finita! Si prega di creare un account amministratore." intro: "L'installazione di FoundKey è finita! Si prega di creare un account amministratore."
done: "Fine" done: "Fine"
processing: "In elaborazione" processing: "In elaborazione"
@ -898,7 +898,7 @@ _ago:
secondsAgo: "{n}s fa" secondsAgo: "{n}s fa"
minutesAgo: "{n}min fa" minutesAgo: "{n}min fa"
hoursAgo: "{n}h fa" hoursAgo: "{n}h fa"
daysAgo: "{1} giorni fa" daysAgo: "{n} giorni fa"
weeksAgo: "{n} settimane fa" weeksAgo: "{n} settimane fa"
monthsAgo: "{n} mesi fa" monthsAgo: "{n} mesi fa"
yearsAgo: "{n} anni fa" yearsAgo: "{n} anni fa"
@ -1119,8 +1119,8 @@ _pages:
newPage: "Crea pagina" newPage: "Crea pagina"
editPage: "Modifica pagina" editPage: "Modifica pagina"
readPage: "Visualizzando fonte" readPage: "Visualizzando fonte"
created: "Pagina creata!" created: "Pagina creata"
updated: "Pagina aggiornata con successo!" updated: "Pagina aggiornata con successo"
deleted: "Pagina eliminata" deleted: "Pagina eliminata"
pageSetting: "Impostazioni pagina" pageSetting: "Impostazioni pagina"
nameAlreadyExists: "Esiste già una pagina con lo stesso URL." nameAlreadyExists: "Esiste già una pagina con lo stesso URL."

View file

@ -74,10 +74,6 @@ somethingHappened: "なんかアカンことが起こったで"
retry: "もっぺんやる?" retry: "もっぺんやる?"
pageLoadError: "ページの読み込みに失敗してしもうたで…" pageLoadError: "ページの読み込みに失敗してしもうたで…"
pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?" pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?"
serverIsDead: "The server is not responding. Please wait for a while before trying\
\ again."
youShouldUpgradeClient: "To display this page, please reload and use a new version\
\ client. "
enterListName: "リスト名を入れてや" enterListName: "リスト名を入れてや"
privacy: "プライバシー" privacy: "プライバシー"
makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする" makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする"
@ -126,9 +122,6 @@ flagAsBot: "Botやで"
flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、FoundKeyのシステム上での扱いがBotに合ったもんになるんやで。" flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、FoundKeyのシステム上での扱いがBotに合ったもんになるんやで。"
flagAsCat: "Catやで" flagAsCat: "Catやで"
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?" flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
flagShowTimelineReplies: "It will display the reply to the note in the timeline. "
flagShowTimelineRepliesDescription: "It will display the reply to notes other than\
\ the user notes in the timeline when you turn it on. "
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく" autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく"
addAccount: "アカウントを追加" addAccount: "アカウントを追加"
loginFailed: "ログインに失敗してしもうた…" loginFailed: "ログインに失敗してしもうた…"
@ -209,9 +202,6 @@ resetAreYouSure: "リセットしてええん?"
saved: "保存したで!" saved: "保存したで!"
messaging: "チャット" messaging: "チャット"
upload: "アップロード" upload: "アップロード"
keepOriginalUploading: "Retain the original image. "
keepOriginalUploadingDescription: "When uploading the clip, the original version will\
\ be retained. Turning it of then uploading will produce images for public use. "
fromDrive: "ドライブから" fromDrive: "ドライブから"
fromUrl: "URLから" fromUrl: "URLから"
uploadFromUrl: "URLアップロード" uploadFromUrl: "URLアップロード"
@ -380,7 +370,7 @@ onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファ
signinRequired: "ログインしてくれへん?" signinRequired: "ログインしてくれへん?"
invitationCode: "招待コード" invitationCode: "招待コード"
checking: "確認しとるで" checking: "確認しとるで"
available: "利用できる\n" available: "利用できる"
unavailable: "利用できん" unavailable: "利用できん"
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで" usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで"
tooShort: "短すぎやろ!" tooShort: "短すぎやろ!"
@ -694,7 +684,7 @@ _widgets:
aiscript: "AiScriptコンソール" aiscript: "AiScriptコンソール"
_cw: _cw:
hide: "隠す" hide: "隠す"
show: "続き見して" show: "続き見して"
chars: "{count}文字" chars: "{count}文字"
files: "{count}ファイル" files: "{count}ファイル"
_poll: _poll:

View file

@ -10,7 +10,7 @@ notifications: "Meldingen"
username: "Gebruikersnaam" username: "Gebruikersnaam"
password: "Wachtwoord" password: "Wachtwoord"
forgotPassword: "Wachtwoord vergeten" forgotPassword: "Wachtwoord vergeten"
fetchingAsApObject: "Ophalen vanuit de Fediverse" fetchingAsApObject: "Ophalen vanuit de Fediverse..."
ok: "Ok" ok: "Ok"
gotIt: "Begrepen" gotIt: "Begrepen"
cancel: "Annuleren" cancel: "Annuleren"

View file

@ -1,10 +1,9 @@
_lang_: "język polski" _lang_: "Polski"
headlineMisskey: "Sieć połączona wpisami" headlineMisskey: "Sieć połączona wpisami"
introMisskey: "FoundKey jest serwisem mikroblogowym typu open source.\nFoundKey to\ introMisskey: "Witaj! FoundKey jest otwartoźródłowym serwisem mikroblogowym.\nTwórz\
\ opensource'owy serwis mikroblogowy, w którym możesz tworzyć \"notatki\", aby dzielić\ \ \"wpisy\", aby dzielić się tym, co się dzieje i opowiadać wszystkim o sobie. \U0001F4E1\
\ się tym, co się dzieje i opowiadać wszystkim o sobie.\nMożesz również użyć funkcji\ \nMożesz również użyć \"reakcji\", aby szybko wyrazić swoje uczucia dotyczące wpisów\
\ \"Reakcje\", aby szybko dodać własne reakcje do notatek innych użytkowników\U0001F44D\ \ innych użytkowników. \U0001F44D\nOdkrywaj nowy świat! \U0001F680"
.\nOdkrywaj nowy świat\U0001F680!"
monthAndDay: "{month}-{day}" monthAndDay: "{month}-{day}"
search: "Szukaj" search: "Szukaj"
notifications: "Powiadomienia" notifications: "Powiadomienia"
@ -15,7 +14,7 @@ fetchingAsApObject: "Pobieranie z Fediwersum…"
ok: "OK" ok: "OK"
gotIt: "Rozumiem!" gotIt: "Rozumiem!"
cancel: "Anuluj" cancel: "Anuluj"
renotedBy: "Udostępniono przez {user}" renotedBy: "Podbito przez {user}"
noNotes: "Brak wpisów" noNotes: "Brak wpisów"
noNotifications: "Brak powiadomień" noNotifications: "Brak powiadomień"
instance: "Instancja" instance: "Instancja"
@ -43,7 +42,7 @@ copyLink: "Skopiuj odnośnik"
delete: "Usuń" delete: "Usuń"
deleteAndEdit: "Usuń i edytuj" deleteAndEdit: "Usuń i edytuj"
deleteAndEditConfirm: "Czy na pewno chcesz usunąć ten wpis i zedytować go? Utracisz\ deleteAndEditConfirm: "Czy na pewno chcesz usunąć ten wpis i zedytować go? Utracisz\
\ wszystkie reakcje, udostępnienia i odpowiedzi do tego wpisu." \ wszystkie reakcje, podbicia i odpowiedzi do tego wpisu."
addToList: "Dodaj do listy" addToList: "Dodaj do listy"
sendMessage: "Wyślij wiadomość" sendMessage: "Wyślij wiadomość"
copyUsername: "Kopiuj nazwę użytkownika" copyUsername: "Kopiuj nazwę użytkownika"
@ -92,8 +91,8 @@ followRequest: "Poproś o możliwość obserwacji"
followRequests: "Prośby o możliwość obserwacji" followRequests: "Prośby o możliwość obserwacji"
unfollow: "Przestań obserwować" unfollow: "Przestań obserwować"
followRequestPending: "Oczekująca prośba o możliwość obserwacji" followRequestPending: "Oczekująca prośba o możliwość obserwacji"
renote: "Udostępnij" renote: "Podbij"
unrenote: "Cofnij udostępnienie" unrenote: "Cofnij podbicie"
quote: "Cytuj" quote: "Cytuj"
pinnedNote: "Przypięty wpis" pinnedNote: "Przypięty wpis"
you: "Ty" you: "Ty"
@ -128,7 +127,7 @@ emojis: "Emoji"
addEmoji: "Dodaj emoji" addEmoji: "Dodaj emoji"
cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej" cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej"
cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane\ cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane\
\ bezpośrednio ze zdalnych instancji. Wyłączenie the opcji zmniejszy użycie powierzchni\ \ bezpośrednio ze zdalnych instancji. Wyłączenie tej opcji zmniejszy użycie powierzchni\
\ dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane." \ dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
flagAsBot: "To konto jest botem" flagAsBot: "To konto jest botem"
flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw\ flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw\
@ -579,9 +578,9 @@ manageAccessTokens: "Zarządzaj tokenami dostępu"
accountInfo: "Informacje o koncie" accountInfo: "Informacje o koncie"
notesCount: "Liczba wpisów" notesCount: "Liczba wpisów"
repliesCount: "Liczba wysłanych odpowiedzi" repliesCount: "Liczba wysłanych odpowiedzi"
renotesCount: "Liczba wysłanych udostępnień" renotesCount: "Liczba wysłanych podbić"
repliedCount: "Liczba otrzymanych odpowiedzi" repliedCount: "Liczba otrzymanych odpowiedzi"
renotedCount: "Liczba otrzymanych udostępnień" renotedCount: "Liczba otrzymanych podbić"
followingCount: "Liczba obserwowanych kont" followingCount: "Liczba obserwowanych kont"
followersCount: "Liczba obserwujących" followersCount: "Liczba obserwujących"
sentReactionsCount: "Liczba wysłanych reakcji" sentReactionsCount: "Liczba wysłanych reakcji"
@ -966,8 +965,8 @@ _pages:
newPage: "Utwórz stronę" newPage: "Utwórz stronę"
editPage: "Edytuj tę stronę" editPage: "Edytuj tę stronę"
readPage: "Aktywowano widok źródła" readPage: "Aktywowano widok źródła"
created: "Pomyślnie utworzono stronę!" created: "Pomyślnie utworzono stronę"
updated: "Pomyślnie zaktualizowano stronę!" updated: "Pomyślnie zaktualizowano stronę"
deleted: "Strona została usunięta" deleted: "Strona została usunięta"
pageSetting: "Ustawienia strony" pageSetting: "Ustawienia strony"
nameAlreadyExists: "Określony adres URL strony już istnieje" nameAlreadyExists: "Określony adres URL strony już istnieje"
@ -1046,3 +1045,12 @@ _deck:
mentions: "Wspomnienia" mentions: "Wspomnienia"
direct: "Bezpośredni" direct: "Bezpośredni"
_services: {} _services: {}
exportAll: Eksportuj wszystko
exportSelected: Eksportuj wybrane
showLess: Pokaż mniej
botFollowRequiresApproval: Prośby o możliwość obserwacji z kont oznaczonych jako boty
wymagają zatwierdzenia
unrenoteAllConfirm: Czy na pewno chcesz cofnąć wszystkie podbicia tego wpisu?
renoteMute: Ukryj podbicia
renoteUnmute: Pokaż podbicia
unrenoteAll: Cofnij wszystkie podbicia

View file

@ -995,7 +995,7 @@ _tutorial:
step5_3: "Чтобы подписаться на кого-нибудь, щёлкните по его аватару и в открывшемся\ step5_3: "Чтобы подписаться на кого-нибудь, щёлкните по его аватару и в открывшемся\
\ профиле нажмите кнопку «Подписаться»." \ профиле нажмите кнопку «Подписаться»."
step5_4: "Некоторые пользователи (около их имени «висит замок») вручную подтверждают\ step5_4: "Некоторые пользователи (около их имени «висит замок») вручную подтверждают\
\ чужие подписки. Так что иногда подписка начинает работать не сразу.\n" \ чужие подписки. Так что иногда подписка начинает работать не сразу."
step6_1: "Если теперь в ленте видны и чужие заметки, значит у вас получилось." step6_1: "Если теперь в ленте видны и чужие заметки, значит у вас получилось."
step6_2: "Здесь можно непринуждённо выразить свои чувства к чьей-то заметке, отметив\ step6_2: "Здесь можно непринуждённо выразить свои чувства к чьей-то заметке, отметив\
\ «реакцию» под ней." \ «реакцию» под ней."
@ -1148,7 +1148,7 @@ _profile:
changeAvatar: "Поменять аватар" changeAvatar: "Поменять аватар"
changeBanner: "Поменять изображение в шапке" changeBanner: "Поменять изображение в шапке"
_exportOrImport: _exportOrImport:
allNotes: "Все записи\n" allNotes: "Все записи"
followingList: "Подписки" followingList: "Подписки"
muteList: "Скрытые" muteList: "Скрытые"
blockingList: "Заблокированные" blockingList: "Заблокированные"

View file

@ -1243,7 +1243,7 @@ _notification:
groupInvited: "Pozvánky do skupín" groupInvited: "Pozvánky do skupín"
app: "Oznámenia z prepojených aplikácií" app: "Oznámenia z prepojených aplikácií"
_actions: _actions:
followBack: "Sledovať späť\n" followBack: "Sledovať späť"
reply: "Odpovedať" reply: "Odpovedať"
renote: "Preposlať" renote: "Preposlať"
_deck: _deck:

View file

@ -57,7 +57,7 @@ import: "匯入"
export: "匯出" export: "匯出"
files: "檔案" files: "檔案"
download: "下載" download: "下載"
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的貼文也會跟著消失。\n" driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的貼文也會跟著消失。"
unfollowConfirm: "確定要取消追隨{name}嗎?" unfollowConfirm: "確定要取消追隨{name}嗎?"
exportRequested: "已請求匯出。這可能會花一點時間。結束後檔案將會被放到雲端裡。" exportRequested: "已請求匯出。這可能會花一點時間。結束後檔案將會被放到雲端裡。"
importRequested: "已請求匯入。這可能會花一點時間" importRequested: "已請求匯入。這可能會花一點時間"

View file

@ -54,5 +54,5 @@
"start-server-and-test": "1.14.0", "start-server-and-test": "1.14.0",
"typescript": "^4.9.4" "typescript": "^4.9.4"
}, },
"packageManager": "yarn@3.3.0" "packageManager": "yarn@3.4.1"
} }

View file

@ -0,0 +1,53 @@
export class noteVisibilityFunction1662132062000 {
name = 'noteVisibilityFunction1662132062000';
async up(queryRunner) {
await queryRunner.query(`
CREATE OR REPLACE FUNCTION note_visible(note_id varchar, user_id varchar) RETURNS BOOLEAN
LANGUAGE SQL
STABLE
CALLED ON NULL INPUT
AS $$
SELECT CASE
WHEN note_id IS NULL THEN TRUE
WHEN NOT EXISTS (SELECT 1 FROM note WHERE id = note_id) THEN FALSE
WHEN user_id IS NULL THEN (
-- simplified check without logged in user
SELECT
visibility IN ('public', 'home')
-- check reply / renote recursively
AND note_visible("replyId", NULL)
AND note_visible("renoteId", NULL)
FROM note WHERE note.id = note_id
) ELSE (
SELECT
(
visibility IN ('public', 'home')
OR
user_id = "userId"
OR
user_id = ANY("visibleUserIds")
OR
user_id = ANY("mentions")
OR (
visibility = 'followers'
AND
EXISTS (
SELECT 1 FROM following WHERE "followeeId" = "userId" AND "followerId" = user_id
)
)
)
-- check reply / renote recursively
AND note_visible("replyId", user_id)
AND note_visible("renoteId", user_id)
FROM note WHERE note.id = note_id
)
END;
$$;
`);
}
async down(queryRunner) {
await queryRunner.query('DROP FUNCTION note_visible');
}
}

View file

@ -22,6 +22,7 @@ import { packedNoteReactionSchema } from '@/models/schema/note-reaction.js';
import { packedHashtagSchema } from '@/models/schema/hashtag.js'; import { packedHashtagSchema } from '@/models/schema/hashtag.js';
import { packedPageSchema } from '@/models/schema/page.js'; import { packedPageSchema } from '@/models/schema/page.js';
import { packedUserGroupSchema } from '@/models/schema/user-group.js'; import { packedUserGroupSchema } from '@/models/schema/user-group.js';
import { packedUserGroupInvitationSchema } from '@/models/schema/user-group-invitation.js';
import { packedNoteFavoriteSchema } from '@/models/schema/note-favorite.js'; import { packedNoteFavoriteSchema } from '@/models/schema/note-favorite.js';
import { packedChannelSchema } from '@/models/schema/channel.js'; import { packedChannelSchema } from '@/models/schema/channel.js';
import { packedAntennaSchema } from '@/models/schema/antenna.js'; import { packedAntennaSchema } from '@/models/schema/antenna.js';
@ -41,6 +42,7 @@ export const refs = {
UserList: packedUserListSchema, UserList: packedUserListSchema,
UserGroup: packedUserGroupSchema, UserGroup: packedUserGroupSchema,
UserGroupInvitation: packedUserGroupInvitationSchema,
App: packedAppSchema, App: packedAppSchema,
MessagingMessage: packedMessagingMessageSchema, MessagingMessage: packedMessagingMessageSchema,
Note: packedNoteSchema, Note: packedNoteSchema,

View file

@ -78,7 +78,7 @@ export class DriveFile {
default: {}, default: {},
comment: 'The any properties of the DriveFile. For example, it includes image width/height.', comment: 'The any properties of the DriveFile. For example, it includes image width/height.',
}) })
public properties: { width?: number; height?: number; orientation?: number; avgColor?: string }; public properties: { width?: number; height?: number; orientation?: number; };
@Column('boolean') @Column('boolean')
public storedInternal: boolean; public storedInternal: boolean;

View file

@ -11,6 +11,7 @@ import { NoteReaction } from '@/models/entities/note-reaction.js';
import { User } from '@/models/entities/user.js'; import { User } from '@/models/entities/user.js';
import { awaitAll } from '@/prelude/await-all.js'; import { awaitAll } from '@/prelude/await-all.js';
import { Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '../index.js'; import { Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '../index.js';
import { apiLogger } from '@/server/api/logger.js';
async function populatePoll(note: Note, meId: User['id'] | null) { async function populatePoll(note: Note, meId: User['id'] | null) {
const poll = await Polls.findOneByOrFail({ noteId: note.id }); const poll = await Polls.findOneByOrFail({ noteId: note.id });
@ -77,7 +78,7 @@ async function populateMyReaction(note: Note, meId: User['id'], _hint_?: {
export const NoteRepository = db.getRepository(Note).extend({ export const NoteRepository = db.getRepository(Note).extend({
async isVisibleForMe(note: Note, meId: User['id'] | null): Promise<boolean> { async isVisibleForMe(note: Note, meId: User['id'] | null): Promise<boolean> {
// This code must always be synchronized with the checks in generateVisibilityQuery. // This code must always be synchronized with the `note_visible` SQL function.
// visibility が specified かつ自分が指定されていなかったら非表示 // visibility が specified かつ自分が指定されていなかったら非表示
if (note.visibility === 'specified') { if (note.visibility === 'specified') {
if (meId == null) { if (meId == null) {
@ -270,6 +271,13 @@ export const NoteRepository = db.getRepository(Note).extend({
}))); })));
// filter out rejected promises, only keep fulfilled values // filter out rejected promises, only keep fulfilled values
return promises.flatMap(result => result.status === 'fulfilled' ? [result.value] : []); return promises.flatMap((result, i) => {
if (result.status === 'fulfilled') {
return [result.value];
} else {
apiLogger.error(`dropping note due to violating visibility restrictions, note ${notes[i].id} user ${meId}`);
return [];
}
});
}, },
}); });

View file

@ -60,11 +60,6 @@ export const packedDriveFileSchema = {
optional: true, nullable: false, optional: true, nullable: false,
example: 8, example: 8,
}, },
avgColor: {
type: 'string',
optional: true, nullable: false,
example: 'rgb(40,65,87)',
},
}, },
}, },
url: { url: {

View file

@ -163,16 +163,20 @@ export const packedNoteSchema = {
optional: false, nullable: false, optional: false, nullable: false,
}, },
uri: { uri: {
description: 'ActivityPub `id` of this Note',
type: 'string', type: 'string',
optional: true, nullable: false, optional: true, nullable: false,
}, },
url: { url: {
description: 'URL to a presentation form intended for humans, if available',
type: 'string', type: 'string',
optional: true, nullable: false, optional: true, nullable: false,
}, },
myReaction: { myReaction: {
type: 'object', description: 'Textual representation of the authenticated users reaction, if they reacted.',
example: ':blobfox@.:',
type: 'string',
optional: true, nullable: true, optional: true, nullable: true,
}, },
}, },

View file

@ -48,6 +48,7 @@ export const packedNotificationSchema = {
}, },
invitation: { invitation: {
type: 'object', type: 'object',
ref: 'UserGroupInvitation',
optional: true, nullable: true, optional: true, nullable: true,
}, },
body: { body: {

View file

@ -0,0 +1,16 @@
export const packedUserGroupInvitationSchema = {
type: 'object',
properties: {
id: {
type: 'string',
optional: false, nullable: false,
format: 'id',
example: 'xxxxxxxxxx',
},
group: {
type: 'object',
optional: false, nullable: false,
ref: 'UserGroup',
},
},
} as const;

View file

@ -87,11 +87,13 @@ export const packedUserDetailedNotMeOnlySchema = {
type: 'object', type: 'object',
properties: { properties: {
url: { url: {
description: 'URL to a presentation form intended for humans, if available',
type: 'string', type: 'string',
format: 'url', format: 'url',
nullable: true, optional: false, nullable: true, optional: false,
}, },
uri: { uri: {
description: 'ActivityPub `id` of this User',
type: 'string', type: 'string',
format: 'uri', format: 'uri',
nullable: true, optional: false, nullable: true, optional: false,
@ -403,6 +405,24 @@ export const packedMeDetailedOnlySchema = {
items: { items: {
type: 'object', type: 'object',
nullable: false, optional: false, nullable: false, optional: false,
properties: {
id: {
type: 'string',
optional: false,
nullable: false,
},
name: {
type: 'string',
optional: false,
nullable: false,
},
lastUsed: {
type: 'string',
optional: false,
nullable: false,
example: '1970-01-01T00:00:00Z',
},
},
}, },
}, },
//#endregion //#endregion

View file

@ -185,21 +185,23 @@ export async function createNote(value: string | IObject, resolver: Resolver, si
}; };
const uris = unique([quoteUrl, note._misskey_quote, note.quoteUri].filter((x): x is string => typeof x === 'string')); const uris = unique([quoteUrl, note._misskey_quote, note.quoteUri].filter((x): x is string => typeof x === 'string'));
let temperror = false;
// check the urls sequentially and abort early to not do unnecessary HTTP requests // check the urls sequentially and abort early to not do unnecessary HTTP requests
// picks the first one that works // picks the first one that works
for (const uri in uris) { for (const uri of uris) {
const res = await tryResolveNote(uri); const res = await tryResolveNote(uri);
if (res.status === 'ok') { if (res.status === 'ok') {
quote = res.res; quote = res.res;
break; break;
} else if (res.status === 'temperror') {
temperror = true;
} }
} }
if (!quote) { if (!quote && temperror) {
if (results.some(x => x.status === 'temperror')) { // could not resolve quote, try again later
throw new Error('quote resolve failed'); throw new Error('quote resolve failed');
} }
} }
}
const cw = note.summary === '' ? null : note.summary; const cw = note.summary === '' ? null : note.summary;

View file

@ -1,42 +1,17 @@
import { Brackets, SelectQueryBuilder } from 'typeorm'; import { SelectQueryBuilder } from 'typeorm';
import { User } from '@/models/entities/user.js'; import { User } from '@/models/entities/user.js';
import { Followings } from '@/models/index.js'; import { Note } from '@/models/entities/note.js';
import { Notes } from '@/models/index.js';
export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) { export function visibilityQuery(q: SelectQueryBuilder<Note>, meId?: User['id'] | null = null): SelectQueryBuilder<Note> {
// This code must always be synchronized with the checks in Notes.isVisibleForMe. const superQuery = Notes.createQueryBuilder()
if (me == null) { .from(() => q, 'note');
q.andWhere(new Brackets(qb => { qb
.where("note.visibility = 'public'") if (meId == null) {
.orWhere("note.visibility = 'home'"); superQuery.where('note_visible(note.id, null);');
}));
} else { } else {
const followingQuery = Followings.createQueryBuilder('following') superQuery.where('note_visible(note.id, :meId)', { meId });
.select('following.followeeId')
.where('following.followerId = :meId');
q.andWhere(new Brackets(qb => { qb
// 公開投稿である
.where(new Brackets(qb => { qb
.where("note.visibility = 'public'")
.orWhere("note.visibility = 'home'");
}))
// または 自分自身
.orWhere('note.userId = :meId')
// または 自分宛て
.orWhere(':meId = ANY(note.visibleUserIds)')
.orWhere(':meId = ANY(note.mentions)')
.orWhere(new Brackets(qb => { qb
// または フォロワー宛ての投稿であり、
.where("note.visibility = 'followers'")
.andWhere(new Brackets(qb => { qb
// 自分がフォロワーである
.where(`note.userId IN (${ followingQuery.getQuery() })`)
// または 自分の投稿へのリプライ
.orWhere('note.replyUserId = :meId');
}));
}));
}));
q.setParameters({ meId: me.id });
} }
return q;
} }

View file

@ -2,7 +2,8 @@ import { IdentifiableError } from '@/misc/identifiable-error.js';
import { User } from '@/models/entities/user.js'; import { User } from '@/models/entities/user.js';
import { Note } from '@/models/entities/note.js'; import { Note } from '@/models/entities/note.js';
import { Notes, Users } from '@/models/index.js'; import { Notes, Users } from '@/models/index.js';
import { generateVisibilityQuery } from './generate-visibility-query.js'; import { apiLogger } from '@/server/api/logger.js';
import { visibilityQuery } from './generate-visibility-query.js';
/** /**
* Get note for API processing, taking into account visibility. * Get note for API processing, taking into account visibility.
@ -13,11 +14,10 @@ export async function getNote(noteId: Note['id'], me: { id: User['id'] } | null)
id: noteId, id: noteId,
}); });
generateVisibilityQuery(query, me); const note = await visibilityQuery(query, me).getOne();
const note = await query.getOne();
if (note == null) { if (note == null) {
apiLogger.error(`user ${me.id} tried to view note ${noteId} violating visibility restrictions`);
throw new IdentifiableError('9725d0ce-ba28-4dde-95a7-2cbb2c15de24', 'No such note.'); throw new IdentifiableError('9725d0ce-ba28-4dde-95a7-2cbb2c15de24', 'No such note.');
} }

View file

@ -2,14 +2,10 @@ import { Schema } from '@/misc/schema.js';
import { errors } from './error.js'; import { errors } from './error.js';
import * as ep___admin_meta from './endpoints/admin/meta.js'; import * as ep___admin_meta from './endpoints/admin/meta.js';
import * as ep___admin_abuseUserReports from './endpoints/admin/abuse-user-reports.js';
import * as ep___admin_accounts_create from './endpoints/admin/accounts/create.js';
import * as ep___admin_accounts_delete from './endpoints/admin/accounts/delete.js';
import * as ep___admin_announcements_create from './endpoints/admin/announcements/create.js'; import * as ep___admin_announcements_create from './endpoints/admin/announcements/create.js';
import * as ep___admin_announcements_delete from './endpoints/admin/announcements/delete.js'; import * as ep___admin_announcements_delete from './endpoints/admin/announcements/delete.js';
import * as ep___admin_announcements_list from './endpoints/admin/announcements/list.js'; import * as ep___admin_announcements_list from './endpoints/admin/announcements/list.js';
import * as ep___admin_announcements_update from './endpoints/admin/announcements/update.js'; import * as ep___admin_announcements_update from './endpoints/admin/announcements/update.js';
import * as ep___admin_deleteAllFilesOfAUser from './endpoints/admin/delete-all-files-of-a-user.js';
import * as ep___admin_drive_cleanRemoteFiles from './endpoints/admin/drive/clean-remote-files.js'; import * as ep___admin_drive_cleanRemoteFiles from './endpoints/admin/drive/clean-remote-files.js';
import * as ep___admin_drive_files from './endpoints/admin/drive/files.js'; import * as ep___admin_drive_files from './endpoints/admin/drive/files.js';
import * as ep___admin_drive_showFile from './endpoints/admin/drive/show-file.js'; import * as ep___admin_drive_showFile from './endpoints/admin/drive/show-file.js';
@ -41,17 +37,21 @@ import * as ep___admin_queue_stats from './endpoints/admin/queue/stats.js';
import * as ep___admin_relays_add from './endpoints/admin/relays/add.js'; import * as ep___admin_relays_add from './endpoints/admin/relays/add.js';
import * as ep___admin_relays_list from './endpoints/admin/relays/list.js'; import * as ep___admin_relays_list from './endpoints/admin/relays/list.js';
import * as ep___admin_relays_remove from './endpoints/admin/relays/remove.js'; import * as ep___admin_relays_remove from './endpoints/admin/relays/remove.js';
import * as ep___admin_resetPassword from './endpoints/admin/reset-password.js'; import * as ep___admin_reports_list from './endpoints/admin/reports/list.js';
import * as ep___admin_resolveAbuseUserReport from './endpoints/admin/resolve-abuse-user-report.js'; import * as ep___admin_reports_resolve from './endpoints/admin/reports/resolve.js';
import * as ep___admin_sendEmail from './endpoints/admin/send-email.js'; import * as ep___admin_sendEmail from './endpoints/admin/send-email.js';
import * as ep___admin_serverInfo from './endpoints/admin/server-info.js'; import * as ep___admin_serverInfo from './endpoints/admin/server-info.js';
import * as ep___admin_showModerationLogs from './endpoints/admin/show-moderation-logs.js'; import * as ep___admin_showModerationLogs from './endpoints/admin/show-moderation-logs.js';
import * as ep___admin_showUser from './endpoints/admin/show-user.js'; import * as ep___admin_users from './endpoints/admin/users.js';
import * as ep___admin_showUsers from './endpoints/admin/show-users.js'; import * as ep___admin_users_create from './endpoints/admin/users/create.js';
import * as ep___admin_silenceUser from './endpoints/admin/silence-user.js'; import * as ep___admin_users_delete from './endpoints/admin/users/delete.js';
import * as ep___admin_suspendUser from './endpoints/admin/suspend-user.js'; import * as ep___admin_users_deleteAllFiles from './endpoints/admin/users/delete-all-files.js';
import * as ep___admin_unsilenceUser from './endpoints/admin/unsilence-user.js'; import * as ep___admin_users_resetPassword from './endpoints/admin/users/reset-password.js';
import * as ep___admin_unsuspendUser from './endpoints/admin/unsuspend-user.js'; import * as ep___admin_users_show from './endpoints/admin/users/show.js';
import * as ep___admin_users_silence from './endpoints/admin/users/silence.js';
import * as ep___admin_users_suspend from './endpoints/admin/users/suspend.js';
import * as ep___admin_users_unsilence from './endpoints/admin/users/unsilence.js';
import * as ep___admin_users_unsuspend from './endpoints/admin/users/unsuspend.js';
import * as ep___admin_updateMeta from './endpoints/admin/update-meta.js'; import * as ep___admin_updateMeta from './endpoints/admin/update-meta.js';
import * as ep___admin_vacuum from './endpoints/admin/vacuum.js'; import * as ep___admin_vacuum from './endpoints/admin/vacuum.js';
import * as ep___announcements from './endpoints/announcements.js'; import * as ep___announcements from './endpoints/announcements.js';
@ -298,14 +298,10 @@ import * as ep___fetchRss from './endpoints/fetch-rss.js';
const eps = [ const eps = [
['admin/meta', ep___admin_meta], ['admin/meta', ep___admin_meta],
['admin/abuse-user-reports', ep___admin_abuseUserReports],
['admin/accounts/create', ep___admin_accounts_create],
['admin/accounts/delete', ep___admin_accounts_delete],
['admin/announcements/create', ep___admin_announcements_create], ['admin/announcements/create', ep___admin_announcements_create],
['admin/announcements/delete', ep___admin_announcements_delete], ['admin/announcements/delete', ep___admin_announcements_delete],
['admin/announcements/list', ep___admin_announcements_list], ['admin/announcements/list', ep___admin_announcements_list],
['admin/announcements/update', ep___admin_announcements_update], ['admin/announcements/update', ep___admin_announcements_update],
['admin/delete-all-files-of-a-user', ep___admin_deleteAllFilesOfAUser],
['admin/drive/clean-remote-files', ep___admin_drive_cleanRemoteFiles], ['admin/drive/clean-remote-files', ep___admin_drive_cleanRemoteFiles],
['admin/drive/files', ep___admin_drive_files], ['admin/drive/files', ep___admin_drive_files],
['admin/drive/show-file', ep___admin_drive_showFile], ['admin/drive/show-file', ep___admin_drive_showFile],
@ -337,17 +333,21 @@ const eps = [
['admin/relays/add', ep___admin_relays_add], ['admin/relays/add', ep___admin_relays_add],
['admin/relays/list', ep___admin_relays_list], ['admin/relays/list', ep___admin_relays_list],
['admin/relays/remove', ep___admin_relays_remove], ['admin/relays/remove', ep___admin_relays_remove],
['admin/reset-password', ep___admin_resetPassword], ['admin/reports/list', ep___admin_reports_list],
['admin/resolve-abuse-user-report', ep___admin_resolveAbuseUserReport], ['admin/reports/resolve', ep___admin_reports_resolve],
['admin/send-email', ep___admin_sendEmail], ['admin/send-email', ep___admin_sendEmail],
['admin/server-info', ep___admin_serverInfo], ['admin/server-info', ep___admin_serverInfo],
['admin/show-moderation-logs', ep___admin_showModerationLogs], ['admin/show-moderation-logs', ep___admin_showModerationLogs],
['admin/show-user', ep___admin_showUser], ['admin/users', ep___admin_users],
['admin/show-users', ep___admin_showUsers], ['admin/users/create', ep___admin_users_create],
['admin/silence-user', ep___admin_silenceUser], ['admin/users/delete', ep___admin_users_delete],
['admin/suspend-user', ep___admin_suspendUser], ['admin/users/delete-all-files', ep___admin_users_deleteAllFiles],
['admin/unsilence-user', ep___admin_unsilenceUser], ['admin/users/reset-password', ep___admin_users_resetPassword],
['admin/unsuspend-user', ep___admin_unsuspendUser], ['admin/users/show', ep___admin_users_show],
['admin/users/silence', ep___admin_users_silence],
['admin/users/suspend', ep___admin_users_suspend],
['admin/users/unsilence', ep___admin_users_unsilence],
['admin/users/unsuspend', ep___admin_users_unsuspend],
['admin/update-meta', ep___admin_updateMeta], ['admin/update-meta', ep___admin_updateMeta],
['admin/vacuum', ep___admin_vacuum], ['admin/vacuum', ep___admin_vacuum],
['announcements', ep___announcements], ['announcements', ep___announcements],

View file

@ -1,6 +1,6 @@
import { Announcements } from '@/models/index.js'; import { Announcements } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js'; import { genId } from '@/misc/gen-id.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { Announcements } from '@/models/index.js'; import { Announcements } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Announcements, AnnouncementReads } from '@/models/index.js'; import { Announcements, AnnouncementReads } from '@/models/index.js';
import { Announcement } from '@/models/entities/announcement.js'; import { Announcement } from '@/models/entities/announcement.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js'; import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { Announcements } from '@/models/index.js'; import { Announcements } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { createCleanRemoteFilesJob } from '@/queue/index.js'; import { createCleanRemoteFilesJob } from '@/queue/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { DriveFiles } from '@/models/index.js'; import { DriveFiles } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js'; import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { DriveFiles } from '@/models/index.js'; import { DriveFiles } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],
@ -79,11 +79,6 @@ export const meta = {
optional: false, nullable: false, optional: false, nullable: false,
example: 720, example: 720,
}, },
avgColor: {
type: 'string',
optional: true, nullable: false,
example: 'rgb(40,65,87)',
},
}, },
}, },
storedInternal: { storedInternal: {

View file

@ -1,7 +1,7 @@
import { In } from 'typeorm'; import { In } from 'typeorm';
import { Emojis } from '@/models/index.js'; import { Emojis } from '@/models/index.js';
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -3,8 +3,8 @@ import { db } from '@/db/postgre.js';
import { Emojis, DriveFiles } from '@/models/index.js'; import { Emojis, DriveFiles } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js'; import { genId } from '@/misc/gen-id.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -4,8 +4,8 @@ import { DriveFile } from '@/models/entities/drive-file.js';
import { uploadFromUrl } from '@/services/drive/upload-from-url.js'; import { uploadFromUrl } from '@/services/drive/upload-from-url.js';
import { publishBroadcastStream } from '@/services/stream.js'; import { publishBroadcastStream } from '@/services/stream.js';
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { In } from 'typeorm';
import { Emojis } from '@/models/index.js'; import { Emojis } from '@/models/index.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,8 +1,8 @@
import { Emojis } from '@/models/index.js'; import { Emojis } from '@/models/index.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { createImportCustomEmojisJob } from '@/queue/index.js'; import { createImportCustomEmojisJob } from '@/queue/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
secure: true, secure: true,

View file

@ -1,7 +1,7 @@
import { Emojis } from '@/models/index.js'; import { Emojis } from '@/models/index.js';
import { toPuny } from '@/misc/convert-host.js'; import { toPuny } from '@/misc/convert-host.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js'; import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Emoji } from '@/models/entities/emoji.js'; import { Emoji } from '@/models/entities/emoji.js';
import { Emojis } from '@/models/index.js'; import { Emojis } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js'; import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { In } from 'typeorm'; import { In } from 'typeorm';
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import { Emojis } from '@/models/index.js'; import { Emojis } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { In } from 'typeorm'; import { In } from 'typeorm';
import { Emojis } from '@/models/index.js'; import { Emojis } from '@/models/index.js';
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { In } from 'typeorm'; import { In } from 'typeorm';
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import { Emojis } from '@/models/index.js'; import { Emojis } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import { Emojis } from '@/models/index.js'; import { Emojis } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { deleteFile } from '@/services/drive/delete-file.js'; import { deleteFile } from '@/services/drive/delete-file.js';
import { DriveFiles } from '@/models/index.js'; import { DriveFiles } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { Instances } from '@/models/index.js';
import { toPuny } from '@/misc/convert-host.js'; import { toPuny } from '@/misc/convert-host.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js'; import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import deleteFollowing from '@/services/following/delete.js'; import deleteFollowing from '@/services/following/delete.js';
import { Followings, Users } from '@/models/index.js'; import { Followings, Users } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Instances } from '@/models/index.js'; import { Instances } from '@/models/index.js';
import { toPuny } from '@/misc/convert-host.js'; import { toPuny } from '@/misc/convert-host.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
requireCredential: true, requireCredential: true,

View file

@ -1,5 +1,5 @@
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
requireCredential: true, requireCredential: true,

View file

@ -1,7 +1,7 @@
import { RegistrationTickets } from '@/models/index.js'; import { RegistrationTickets } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js'; import { genId } from '@/misc/gen-id.js';
import { secureRndstrCustom } from '@/misc/secure-rndstr.js'; import { secureRndstrCustom } from '@/misc/secure-rndstr.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,8 +1,8 @@
import config from '@/config/index.js'; import config from '@/config/index.js';
import { fetchMeta } from '@/misc/fetch-meta.js'; import { fetchMeta } from '@/misc/fetch-meta.js';
import { TranslationService } from '@/models/entities/meta.js'; import { TranslationService } from '@/models/entities/meta.js';
import { translatorAvailable } from '../../common/translator.js'; import { translatorAvailable } from '@/server/api/common/translator.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['meta'], tags: ['meta'],
@ -52,7 +52,7 @@ export const meta = {
}, },
bannerUrl: { bannerUrl: {
type: 'string', type: 'string',
optional: false, nullable: false, optional: false, nullable: true,
}, },
iconUrl: { iconUrl: {
type: 'string', type: 'string',

View file

@ -1,7 +1,7 @@
import { Users } from '@/models/index.js'; import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import { publishInternalEvent } from '@/services/stream.js'; import { publishInternalEvent } from '@/services/stream.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Users } from '@/models/index.js'; import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import { publishInternalEvent } from '@/services/stream.js'; import { publishInternalEvent } from '@/services/stream.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { destroy } from '@/queue/index.js'; import { destroy } from '@/queue/index.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { URL } from 'node:url'; import { URL } from 'node:url';
import { deliverQueue } from '@/queue/queues.js'; import { deliverQueue } from '@/queue/queues.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { URL } from 'node:url'; import { URL } from 'node:url';
import { inboxQueue } from '@/queue/queues.js'; import { inboxQueue } from '@/queue/queues.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues.js'; import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { URL } from 'node:url'; import { URL } from 'node:url';
import { addRelay } from '@/services/relay.js'; import { addRelay } from '@/services/relay.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { listRelay } from '@/services/relay.js'; import { listRelay } from '@/services/relay.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { removeRelay } from '@/services/relay.js'; import { removeRelay } from '@/services/relay.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { AbuseUserReports } from '@/models/index.js'; import { AbuseUserReports } from '@/models/index.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js'; import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -3,7 +3,7 @@ import { getInstanceActor } from '@/services/instance-actor.js';
import { deliver } from '@/queue/index.js'; import { deliver } from '@/queue/index.js';
import { renderActivity } from '@/remote/activitypub/renderer/index.js'; import { renderActivity } from '@/remote/activitypub/renderer/index.js';
import { renderFlag } from '@/remote/activitypub/renderer/flag.js'; import { renderFlag } from '@/remote/activitypub/renderer/flag.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { sendEmail } from '@/services/send-email.js'; import { sendEmail } from '@/services/send-email.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -2,7 +2,7 @@ import * as os from 'node:os';
import si from 'systeminformation'; import si from 'systeminformation';
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import { redisClient } from '@/db/redis.js'; import { redisClient } from '@/db/redis.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
requireCredential: true, requireCredential: true,

View file

@ -1,6 +1,6 @@
import { ModerationLogs } from '@/models/index.js'; import { ModerationLogs } from '@/models/index.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js'; import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { fetchMeta, setMeta } from '@/misc/fetch-meta.js'; import { fetchMeta, setMeta } from '@/misc/fetch-meta.js';
import { TranslationService } from '@/models/entities/meta.js'; import { TranslationService } from '@/models/entities/meta.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { DAY } from '@/const.js'; import { DAY } from '@/const.js';
import { Users } from '@/models/index.js'; import { Users } from '@/models/index.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,8 +1,8 @@
import { IsNull } from 'typeorm'; import { IsNull } from 'typeorm';
import { Users } from '@/models/index.js'; import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { signup } from '../../../common/signup.js'; import { signup } from '@/server/api/common/signup.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { deleteFile } from '@/services/drive/delete-file.js'; import { deleteFile } from '@/services/drive/delete-file.js';
import { DriveFiles } from '@/models/index.js'; import { DriveFiles } from '@/models/index.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Users } from '@/models/index.js'; import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import { deleteAccount } from '@/services/delete-account.js'; import { deleteAccount } from '@/services/delete-account.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { hashPassword } from '@/misc/password.js';
import { secureRndstr } from '@/misc/secure-rndstr.js'; import { secureRndstr } from '@/misc/secure-rndstr.js';
import { Users, UserProfiles } from '@/models/index.js'; import { Users, UserProfiles } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { Signins, UserProfiles, Users } from '@/models/index.js'; import { Signins, UserProfiles, Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { publishInternalEvent } from '@/services/stream.js'; import { publishInternalEvent } from '@/services/stream.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -5,7 +5,7 @@ import { ApiError } from '@/server/api/error.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { doPostSuspend } from '@/services/suspend-user.js'; import { doPostSuspend } from '@/services/suspend-user.js';
import { publishUserEvent } from '@/services/stream.js'; import { publishUserEvent } from '@/services/stream.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { publishInternalEvent } from '@/services/stream.js'; import { publishInternalEvent } from '@/services/stream.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { doPostUnsuspend } from '@/services/unsuspend-user.js'; import { doPostUnsuspend } from '@/services/unsuspend-user.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { Announcements, AnnouncementReads } from '@/models/index.js'; import { Announcements, AnnouncementReads } from '@/models/index.js';
import define from '../define.js'; import define from '@/server/api/define.js';
import { makePaginationQuery } from '../common/make-pagination-query.js'; import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = { export const meta = {
tags: ['meta'], tags: ['meta'],

View file

@ -1,8 +1,8 @@
import { genId } from '@/misc/gen-id.js'; import { genId } from '@/misc/gen-id.js';
import { Antennas, UserLists, UserGroupJoinings } from '@/models/index.js'; import { Antennas, UserLists, UserGroupJoinings } from '@/models/index.js';
import { publishInternalEvent } from '@/services/stream.js'; import { publishInternalEvent } from '@/services/stream.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['antennas'], tags: ['antennas'],

View file

@ -1,7 +1,7 @@
import { Antennas } from '@/models/index.js'; import { Antennas } from '@/models/index.js';
import { publishInternalEvent } from '@/services/stream.js'; import { publishInternalEvent } from '@/services/stream.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['antennas'], tags: ['antennas'],

View file

@ -1,5 +1,5 @@
import { Antennas } from '@/models/index.js'; import { Antennas } from '@/models/index.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['antennas', 'account'], tags: ['antennas', 'account'],

View file

@ -1,11 +1,11 @@
import { readNote } from '@/services/note/read.js'; import { readNote } from '@/services/note/read.js';
import { Antennas, Notes, AntennaNotes } from '@/models/index.js'; import { Antennas, Notes, AntennaNotes } from '@/models/index.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js'; import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js'; import { visibilityQuery } from '@/server/api/common/generate-visibility-query.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js'; import { generateMutedUserQuery } from '@/server/api/common/generate-muted-user-query.js';
import { generateBlockedUserQuery } from '../../common/generate-block-query.js'; import { generateBlockedUserQuery } from '@/server/api/common/generate-block-query.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['antennas', 'account', 'notes'], tags: ['antennas', 'account', 'notes'],
@ -65,11 +65,10 @@ export default define(meta, paramDef, async (ps, user) => {
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner') .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.andWhere('antennaNote.antennaId = :antennaId', { antennaId: antenna.id }); .andWhere('antennaNote.antennaId = :antennaId', { antennaId: antenna.id });
generateVisibilityQuery(query, user);
generateMutedUserQuery(query, user); generateMutedUserQuery(query, user);
generateBlockedUserQuery(query, user); generateBlockedUserQuery(query, user);
const notes = await query const notes = await visibilityQuery(query, user)
.take(ps.limit) .take(ps.limit)
.getMany(); .getMany();

View file

@ -1,6 +1,6 @@
import { Antennas } from '@/models/index.js'; import { Antennas } from '@/models/index.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['antennas', 'account'], tags: ['antennas', 'account'],

View file

@ -1,7 +1,7 @@
import { Antennas, UserLists, UserGroupJoinings } from '@/models/index.js'; import { Antennas, UserLists, UserGroupJoinings } from '@/models/index.js';
import { publishInternalEvent } from '@/services/stream.js'; import { publishInternalEvent } from '@/services/stream.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['antennas'], tags: ['antennas'],

View file

@ -1,6 +1,6 @@
import { Resolver } from '@/remote/activitypub/resolver.js'; import { Resolver } from '@/remote/activitypub/resolver.js';
import { HOUR } from '@/const.js'; import { HOUR } from '@/const.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['federation'], tags: ['federation'],

View file

@ -10,8 +10,8 @@ import { isActor, isPost } from '@/remote/activitypub/type.js';
import { SchemaType } from '@/misc/schema.js'; import { SchemaType } from '@/misc/schema.js';
import { HOUR } from '@/const.js'; import { HOUR } from '@/const.js';
import { shouldBlockInstance } from '@/misc/should-block-instance.js'; import { shouldBlockInstance } from '@/misc/should-block-instance.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['federation'], tags: ['federation'],

View file

@ -2,7 +2,7 @@ import { Apps } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js'; import { genId } from '@/misc/gen-id.js';
import { secureRndstr } from '@/misc/secure-rndstr.js'; import { secureRndstr } from '@/misc/secure-rndstr.js';
import { kinds } from '@/misc/api-permissions.js'; import { kinds } from '@/misc/api-permissions.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['app'], tags: ['app'],

View file

@ -1,6 +1,6 @@
import { Apps } from '@/models/index.js'; import { Apps } from '@/models/index.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['app'], tags: ['app'],

View file

@ -3,8 +3,8 @@ import { AuthSessions, AccessTokens, Apps } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js'; import { genId } from '@/misc/gen-id.js';
import { secureRndstr } from '@/misc/secure-rndstr.js'; import { secureRndstr } from '@/misc/secure-rndstr.js';
import { kinds } from '@/misc/api-permissions.js'; import { kinds } from '@/misc/api-permissions.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['auth'], tags: ['auth'],

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