SHA256
Добавить дневник действий и статусы материалов
This commit is contained in:
@@ -47,6 +47,7 @@ const MSG_TYPE_TECH = 0;
|
||||
const MSG_TYPE_TEXT = 1;
|
||||
const MSG_TYPE_REACTION = 2;
|
||||
const MSG_TYPE_CONNECTION = 3;
|
||||
const MSG_TYPE_STATUS_ACTION = 5;
|
||||
|
||||
const MSG_SUBTYPE_TECH_CREATE_CHANNEL = 1;
|
||||
const MSG_SUBTYPE_TEXT_POST = 10;
|
||||
@@ -60,6 +61,15 @@ const MSG_SUBTYPE_TEXT_ENTRYPOINT = 100;
|
||||
const MSG_SUBTYPE_TEXT_EXERCISE = 110;
|
||||
const MSG_SUBTYPE_TEXT_SERVICE = 120;
|
||||
const MSG_SUBTYPE_TEXT_COURSE = 130;
|
||||
const MSG_SUBTYPE_STATUS_DONE_ONCE = 10;
|
||||
const MSG_SUBTYPE_STATUS_LEARNED = 20;
|
||||
const MSG_SUBTYPE_STATUS_SERVICE_PASSED = 30;
|
||||
const MSG_SUBTYPE_STATUS_CONFIRMED = 100;
|
||||
const MSG_SUBTYPE_STATUS_INTERESTED = 110;
|
||||
const MSG_SUBTYPE_STATUS_STARTED = 120;
|
||||
const MSG_SUBTYPE_STATUS_IN_STUDY = 130;
|
||||
const MSG_SUBTYPE_STATUS_ABANDONED = 140;
|
||||
const MSG_SUBTYPE_STATUS_COMPLETED = 150;
|
||||
const MSG_SUBTYPE_REACTION_LIKE = 1;
|
||||
const MSG_SUBTYPE_REACTION_UNLIKE = 2;
|
||||
const MSG_SUBTYPE_CONNECTION_FOLLOW = 30;
|
||||
@@ -600,6 +610,35 @@ function makeTextRatingBodyBytes({ toBlockchainName, toBlockNumber, toBlockHashH
|
||||
);
|
||||
}
|
||||
|
||||
function makeStatusActionBodyBytes({ toBlockchainName, toBlockNumber, toBlockHashHex, text = '' }) {
|
||||
const cleanBch = String(toBlockchainName || '').trim();
|
||||
if (!cleanBch) throw new Error('toBlockchainName is required for status action');
|
||||
|
||||
const blockNumber = Number(toBlockNumber);
|
||||
if (!Number.isFinite(blockNumber) || blockNumber < 0) {
|
||||
throw new Error('Invalid toBlockNumber for status action');
|
||||
}
|
||||
|
||||
const bchBytes = utf8Bytes(cleanBch);
|
||||
if (bchBytes.length < 1 || bchBytes.length > 255) {
|
||||
throw new Error('toBlockchainName must be 1..255 bytes');
|
||||
}
|
||||
|
||||
const textBytes = utf8Bytes(String(text || '').trim());
|
||||
if (textBytes.length > 65535) {
|
||||
throw new Error('Status action text must be 0..65535 UTF-8 bytes');
|
||||
}
|
||||
|
||||
return concatBytes(
|
||||
int8Byte(bchBytes.length),
|
||||
bchBytes,
|
||||
int32Bytes(blockNumber),
|
||||
hexToBytes(normalizeHex32(toBlockHashHex)),
|
||||
int16Bytes(textBytes.length),
|
||||
textBytes
|
||||
);
|
||||
}
|
||||
|
||||
function makeTextRepostBodyBytes({
|
||||
lineCode,
|
||||
prevLineNumber,
|
||||
@@ -1464,6 +1503,13 @@ export class AuthService {
|
||||
return response.payload || {};
|
||||
}
|
||||
|
||||
async getPersonalDiary(login, limit = 200, sort = 'asc') {
|
||||
const payload = { login: String(login || '').trim(), limit, sort };
|
||||
const response = await this.ws.request('GetPersonalDiary', payload);
|
||||
if (response.status !== 200) throw opError('GetPersonalDiary', response);
|
||||
return response.payload || {};
|
||||
}
|
||||
|
||||
async getMessageThread(message, depthUp = 20, depthDown = 2, limitChildrenPerNode = 50, login = '') {
|
||||
const normalizedMessage = {
|
||||
blockchainName: String(message?.blockchainName || '').trim(),
|
||||
@@ -1830,6 +1876,46 @@ export class AuthService {
|
||||
});
|
||||
}
|
||||
|
||||
async addBlockStatusAction({ login, message, text = '', statusSubType, storagePwd }) {
|
||||
const cleanLogin = String(login || '').trim();
|
||||
const cleanText = String(text || '').trim();
|
||||
const cleanSubType = Number(statusSubType);
|
||||
const target = normalizeMessageRefTarget(message, 'status action');
|
||||
const allowedStatusSubTypes = new Set([
|
||||
MSG_SUBTYPE_STATUS_DONE_ONCE,
|
||||
MSG_SUBTYPE_STATUS_LEARNED,
|
||||
MSG_SUBTYPE_STATUS_SERVICE_PASSED,
|
||||
MSG_SUBTYPE_STATUS_CONFIRMED,
|
||||
MSG_SUBTYPE_STATUS_INTERESTED,
|
||||
MSG_SUBTYPE_STATUS_STARTED,
|
||||
MSG_SUBTYPE_STATUS_IN_STUDY,
|
||||
MSG_SUBTYPE_STATUS_ABANDONED,
|
||||
MSG_SUBTYPE_STATUS_COMPLETED,
|
||||
]);
|
||||
if (!allowedStatusSubTypes.has(cleanSubType)) {
|
||||
throw new Error('Unsupported status action subtype');
|
||||
}
|
||||
const key = `status-action:${cleanLogin}:${cleanSubType}:${target.blockchainName}:${target.blockNumber}:${target.blockHash}:${cleanText}`;
|
||||
|
||||
return this.runWriteLocked(key, async () => {
|
||||
const bodyBytes = makeStatusActionBodyBytes({
|
||||
toBlockchainName: target.blockchainName,
|
||||
toBlockNumber: target.blockNumber,
|
||||
toBlockHashHex: target.blockHash,
|
||||
text: cleanText,
|
||||
});
|
||||
|
||||
return this.addBlockSigned({
|
||||
login: cleanLogin,
|
||||
storagePwd,
|
||||
msgType: MSG_TYPE_STATUS_ACTION,
|
||||
msgSubType: cleanSubType,
|
||||
msgVersion: 1,
|
||||
bodyBytes,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async addBlockRepost({ login, channel, message, text, storagePwd }) {
|
||||
const cleanLogin = String(login || '').trim();
|
||||
if (!cleanLogin) throw new Error('Missing login');
|
||||
|
||||
Reference in New Issue
Block a user