platform/dev/tool/src/telegram.ts
Denis Bykhov 98bdcfce68
Telegram attachments (#1127)
Signed-off-by: Denis Bykhov <80476319+BykhovDenis@users.noreply.github.com>
2022-03-11 16:05:44 +07:00

103 lines
3.0 KiB
TypeScript

//
// Copyright © 2020, 2021 Anticrm Platform Contributors.
// Copyright © 2021 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public 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 https://www.eclipse.org/legal/epl-2.0
//
// 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.
//
import { DOMAIN_TX, Ref } from '@anticrm/core'
import { DOMAIN_ATTACHMENT } from '@anticrm/model-attachment'
import contact, { DOMAIN_CHANNEL } from '@anticrm/model-contact'
import { DOMAIN_TELEGRAM } from '@anticrm/model-telegram'
import telegram, { SharedTelegramMessage, SharedTelegramMessages } from '@anticrm/telegram'
import { Client } from 'minio'
import { MongoClient } from 'mongodb'
const LastMessages = 'last-msgs'
/**
* @public
*/
export async function clearTelegramHistory (
mongoUrl: string,
workspace: string,
tgDb: string,
minio: Client
): Promise<void> {
const client = new MongoClient(mongoUrl)
try {
await client.connect()
const workspaceDB = client.db(workspace)
const telegramDB = client.db(tgDb)
const sharedMessages = await workspaceDB
.collection(DOMAIN_TELEGRAM)
.find<SharedTelegramMessages>({
_class: telegram.class.SharedMessages
})
.toArray()
const sharedIds: Ref<SharedTelegramMessage>[] = []
for (const sharedMessage of sharedMessages) {
for (const message of sharedMessage.messages) {
sharedIds.push(message._id)
}
}
const files = await workspaceDB
.collection(DOMAIN_ATTACHMENT)
.find(
{
attachedToClass: telegram.class.Message,
attachedTo: { $nin: sharedIds }
},
{
projection: {
file: 1
}
}
)
.toArray()
const attachments = files.map((file) => file.file)
console.log('clearing txes and messages...')
await Promise.all([
workspaceDB.collection(DOMAIN_TX).deleteMany({
objectClass: telegram.class.Message
}),
workspaceDB.collection(DOMAIN_TELEGRAM).deleteMany({
_class: telegram.class.Message
}),
workspaceDB.collection(DOMAIN_CHANNEL).updateMany(
{
provider: contact.channelProvider.Telegram
},
{
$set: {
items: 0
}
}
),
workspaceDB.collection(DOMAIN_ATTACHMENT).deleteMany({
attachedToClass: telegram.class.Message
}),
minio.removeObjects(workspace, Array.from(attachments))
])
console.log('clearing telegram service data...')
await telegramDB.collection(LastMessages).deleteMany({
workspace
})
} finally {
await client.close()
}
}