123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- using Azure;
- using Azure.Cosmos;
- using Azure.Messaging.ServiceBus;
- using Azure.Storage.Blobs;
- using DocumentFormat.OpenXml.Wordprocessing;
- using HTEXLib.COMM.Helpers;
- using Microsoft.Extensions.Configuration;
- using StackExchange.Redis;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- namespace TEAMModelOS.SDK.Services
- {
- public static class BlobService
- {
- public static async Task RefreshBlobRoot(BlobRefreshMessage message, AzureServiceBusFactory _serviceBus,IConfiguration _configuration,AzureRedisFactory _azureRedis) {
- if (!string.IsNullOrWhiteSpace(message.root) && !string.IsNullOrWhiteSpace(message.name)) {
- string lockKey = $"Blob:Lock:{message.name}:{message.root}";
- bool exist = await _azureRedis.GetRedisClient(8).KeyExistsAsync(lockKey);
- //不存在Blob:Lock:hbcn:video 文件夹在队列中 则加入队列
- if (!exist)
- {
- //保持一天的时间
- TimeSpan timeSpan = new TimeSpan(1,0,0);
- //加入队列的时间
- long action = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- await _azureRedis.GetRedisClient(8).StringSetAsync(lockKey, action, expiry: timeSpan);
- var messageBlob = new ServiceBusMessage(message.ToJsonString());
- messageBlob.ApplicationProperties.Add("name", "BlobRoot");
- var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
- await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
- }
- //如果已经存在,则忽略,不加入队列。
- }
- }
-
- public static async Task<UsedBlob> GetBlobUsed(CosmosClient clientc, BlobContainerClient clients, IDatabase clientr, string scope, string containerName)
- {
- UsedBlob result = new UsedBlob();
- try
- {
- //学校已经分配给所有教师的空间大小GB。
- long teach = 0;
- if (scope.Equals("school"))
- {
- await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"SELECT sum(c.size) as size FROM c ",
- requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{containerName}") }))
- {
- var json = await JsonDocument.ParseAsync(item.ContentStream);
- foreach (var elmt in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- if (elmt.TryGetProperty("size", out JsonElement _size) && _size.ValueKind.Equals(JsonValueKind.Number))
- {
- teach = _size.GetInt32();
- break;
- }
- }
- }
- }
- //使用blob狀況
- bool getBlobCatalogFromBlob = false; //是否直接去blob取得使用狀況 false:否(Redis) true:是(Blob)
- long blobsize = 0;
- RedisValue value = default;
- value = clientr.HashGet($"Blob:Record", containerName);
- if (value != default && !value.IsNullOrEmpty)
- {
- JsonElement record = value.ToString().ToObject<JsonElement>();
- if (record.TryGetInt64(out blobsize))
- {
- }
- else
- {
- getBlobCatalogFromBlob = true;
- }
- }
- else
- {
- getBlobCatalogFromBlob = true;
- }
- Dictionary<string, double?> catalog = new Dictionary<string, double?>();
- SortedSetEntry[] Scores = clientr.SortedSetRangeByScoreWithScores($"Blob:Catalog:{containerName}");
- if (Scores != null)
- {
- foreach (var score in Scores)
- {
- double val = score.Score;
- string key = score.Element.ToString();
- catalog.Add(key, val);
- }
- }
- if (!getBlobCatalogFromBlob)
- {
- result.size = blobsize;
- result.catalog = catalog;
- result.teach = teach;
- return result;
- }
- else
- {
- var size = await clients.GetBlobsCatalogSize();
- result.size = size.Item1;
- result.catalog = size.Item2;
- result.teach = teach;
- return result;
- }
- }
- catch (Exception ex)
- {
- //await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},Channel/Create()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
- return result;
- }
- }
- /// <param name="scope">school or private</param>
- /// <param name="containerName">school code or tmid</param>
- /// <param name="type">doc, res, item... Empty if no need.</param>
- /// <param name="periodId">Only for school</param>
- public static async Task<List<BlobCount>> BloblogCount(CosmosClient clientc, string scope, string containerName, string type, string periodId)
- {
- List<BlobCount> bloblogcnt = new List<BlobCount>();
- try
- {
- //必須項檢查
- if(scope.Equals("school") && string.IsNullOrWhiteSpace(periodId))
- {
- return bloblogcnt;
- }
- //資料取得
- var queryslt = new StringBuilder();
- queryslt.Append($"SELECT COUNT(1) AS count, c.type FROM c ");
- if (scope.Equals("school"))
- {
- queryslt.Append($"JOIN A1 IN c.periodId WHERE A1 IN ('{periodId}') ");
- if(!string.IsNullOrWhiteSpace(type)) queryslt.Append($"AND c.type='{type}'");
- queryslt.Append("GROUP BY c.type");
- await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<BlobCount>(queryText: queryslt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Bloblog-{containerName}") }))
- {
- bloblogcnt.Add(item);
- }
- }
- else if (scope.Equals("private"))
- {
- if (!string.IsNullOrWhiteSpace(type)) queryslt.Append($"AND c.type='{type}'");
- queryslt.Append("GROUP BY c.type");
- await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<BlobCount>(queryText: queryslt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Bloblog-{containerName}") }))
- {
- bloblogcnt.Add(item);
- }
- }
- return bloblogcnt;
- }
- catch (Exception ex)
- {
- return bloblogcnt;
- }
- }
- public class UsedBlob
- {
- public long teach { get; set; }
- public long? size { get; set; }
- public Dictionary<string, double?> catalog { get; set; }
- }
- public class BlobCount
- {
- public string type { get; set; }
- public int count { get; set; }
- }
- }
- public class BlobRefreshMessage{
- public string id { get; set; }= Guid.NewGuid().ToString();
- public string name { get; set; }
- public string progress { get; set; }
- public string root { get; set; }
- }
- }
|