Skip to content

Conversation

@NetJorika
Copy link
Contributor

@NetJorika NetJorika commented Jul 21, 2025

Добавил функциональность по этой задаче #677

Добавденная функциональность (все нижеописанное только для модераторов и админов и не влияет на обычных пользователей):

  1. Цветовая индексация лимита пользователя
    • красный <=10
    • желтый <=20
    • зеленый <=75
    • все прочее синий
  2. Добавлен фильтр "Лимит пользователя - Исчерпан", позволяющий показывать фотографии только пользователей с заполненным лимитом.
  3. Добавлен фильтр "Лимит пользователя - Любой/ Меньше Х" , позволяющий показывать фотографии только пользователей с любым лимитом или меньше определенного числа
    • может быть выбрана только одна из опций
    • дефолтное значение лимита 75
    • дефолтная галочка "Любой"

Скрины (В системе 2 пользователя: админ с принудительным лимитом 50 и пользователь с лимитом 2 фото)

  1. Общий вид модератора (без фильтра).
изображение 2. Общий вид модератора (с фильтром на лимит фото у пользователя) изображение 3. Фильтр по заполненому лимиту (видны только фото пользователя) изображение

ПС. Не очень понял где настраивается перевод. Буду рад если покажите или исправите.
ПС. Нет возможности проверить насколько сильно агрегативные функции нагружают базу. Так же буду рад если есть идеи с оптимизацией запросов

@NetJorika NetJorika changed the title Color indication for user upload limits Color indication for user upload limits (resolve #677) Jul 22, 2025
@paul-k-pastvu
Copy link

Мне нравится. Новые цвета я бы, может, ещё поподбирал - кажутся ярковаты. Но пусть потом лучше модераторы предлагают варианты.

@NetJorika NetJorika force-pushed the Color-indication-for-user-upload-limits branch from ba6d907 to d3698b9 Compare September 8, 2025 19:42
@NetJorika
Copy link
Contributor Author

Поменял цвета на то что предложил в issue и собрал в один коммит

Copy link
Member

@kabalin kabalin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет! Спасибо за PR!

Добавлен фильтр "Лимит пользователя - Любой/ Меньше Х" , позволяющий показывать фотографии только пользователей с любым лимитом или меньше определенного числа
может быть выбрана только одна из опций
дефолтное значение лимита 75
дефолтная галочка "Любой"

Мне кажется "Любой" - лишняя опция, если я ничего не упускаю. Мы по умолчанию принимаем что лимит "любой" (т.е. не применен, как это работает сейчас), а если выбран "Меньше", тогда применяется лимит. Это упростит код.


if (user.rules && _.isNumber(user.rules.photoNewLimit)) {
canCreate = Math.max(0, Math.min(user.rules.photoNewLimit, maxNewPhotosLimit) - pfcount);
limit = Math.min(user.rules.photoNewLimit, maxNewPhotosLimit);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не критично, но в принципе можно во всех условиях использовать return так как переназначения переменной больше не будет.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поменял. Правда из-за стандарта теперь оно в 2 раза длиннее

let aggQuery = [
{ $lookup: { from: 'users', localField: 'user', foreignField: '_id', as: 'user_info' } },
{ $match: query },
{ $set: { photoNewLimit: { $sum: '$user_info.rules.photoNewLimit' } } },
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему используется $sum, там же значение переменной - число?

Copy link
Contributor Author

@NetJorika NetJorika Nov 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не очень знаток mongodb, но sum из-за того, что это агрегированный запрос.
Без $sum не работает, а что там другое может быть ума не приложу.

{ $set: { photoNewLimit: { $sum: '$user_info.rules.photoNewLimit' } } },
{ $set: { pcount: { $sum: '$user_info.pcount' } } },
{ $set: { pfcount: { $sum: '$user_info.pfcount' } } },
{ $set: { ranks: { $first: '$user_info.ranks' } } },
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$first не совсем понятно почему нужно только первое значение в массиве ranks?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это не первое значение в массиве, а первый массив ranks.
Запись юзера все равно будет одна.
Нужно как я понял использовать хоть какую-то функцию из-за агрегата.

{ $set: { photosLimit: { $sum: { $switch: {
branches: [
{ case: { $gt: ['$photoNewLimit', 0] }, then: { $min: ['$photoNewLimit', maxNewPhotosLimit] } },
{ case: { $in: [{ $max: '$ranks' }, ['mec_silv', 'mec_gold']] }, then: maxNewPhotosLimit },
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$max к строке применяется если я правильно понял? (до этого присвоили первое значение из массива { $set: { ranks: { $first: '$user_info.ranks' } } })

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$first в том случае возвращает первый массив а не первое значение в массиве.
Да, тут небольшой чит из-за тех значений, что есть в справочнике, очень удобно получилось.
Они прям в нужном порядке сортируются с помощью $max "adviser","mec","mec_gold","mec_silv" (у последних двух одинаковый лимит)

}
}
}
} else if (filterParam === 'l') {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут комментарии в этой части diff не помешали бы, тяжело понять логику.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавил

// /ko
//ko foreach: photos
.photoPreview.withStatus.withInfo.fringe(data-bind="attr: {title: title}, css: ($parent.feed() ? 'trans ' : '') + 's' + $data.s")
.photoPreview.withStatus.withInfo.fringe(data-bind="attr: {title: title}, css: ($parent.feed() ? 'trans ' : '') + 's' + $data.s + (($parent.auth.iAm.role() >= 5 && $data.status.num <= 2 ) ? ( $data.userPhotoLimitMax <= 10 ? ' photoLimit1' : ( $data.userPhotoLimitMax <= 20 ? ' photoLimit2' : ( $data.userPhotoLimitMax <= 75 ? ' photoLimit3' : ''))) : '') ")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Слишком много логики в шаблоне, может быть перенести в функцию в модуль?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Перенес логику

@NetJorika
Copy link
Contributor Author

NetJorika commented Oct 13, 2025

Мне кажется "Любой" - лишняя опция, если я ничего не упускаю. Мы по умолчанию принимаем что лимит "любой" (т.е. не применен, как это работает сейчас), а если выбран "Меньше", тогда применяется лимит. Это упростит код.

Делал ее для большей наглядности. Давайте уберу.
По замечаниям на неделе пройдусь.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants