1fda6b66创建于 2023年12月25日历史提交
/**
* Copyright (c) 2023 - present TinyEngine Authors.
* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd.
*
* Use of this source code is governed by an MIT-style license.
*
* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR
* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
*
*/
const { sanitizeEntity } = require('strapi-utils');
const { findAllMaterial, filterUserField, filterHistoriesField } = require('../../../config/material');

module.exports = {
  async findOne(ctx) {
    const { id } = ctx.params;
    const material = await strapi.services.materials.findOne({ id }, [
      'component_library',
      'user_components',
      'user_blocks',
      'latest',
      'createdBy',
      'material_histories',
      'public_scope_tenants',
    ]);
    const res = sanitizeEntity(
      {
        ...material,
        createdBy: filterUserField(material.createdBy),
        material_histories: filterHistoriesField(material.material_histories),
      },
      { model: strapi.models.materials }
    );
    let blocks = [];
    if (material?.latest?.id) {
      blocks = await _getUnpkgMaterialBlocks(material.latest.id);
    }
    return { ...res, blocks };
  },

  async find(ctx) {
    const { list } = await findAllMaterial(ctx.session.user, ctx.request.query, 'materials', 'materials', [
      'createdBy',
      'material_category_relations',
    ]);
    return list.map((item) =>
      sanitizeEntity(
        { ...item, createdBy: filterUserField(item.createdBy) },
        {
          model: strapi.models.materials,
          includeFields: [
            'id',
            'name',
            'framework',
            'version',
            'image_url',
            'description',
            'isDefault',
            'isOfficial',
            'createdBy',
            'tiny_reserved',
            'latest',
            'name_cn',
            'public',
            'public_scope_tenants',
            'material_category_relations',
          ],
        }
      )
    );
  },

  async count(ctx) {
    const { list } = await findAllMaterial(ctx.session.user, ctx.request.query, 'materials');
    return list.length;
  },
};

const _getUnpkgMaterialBlocks = async (materialHistoryId) => {
  const sql = `
    SELECT A.id, A.label, A.framework, A.created_at, A.name_cn, B.version, A.description, A.assets
    FROM blocks A
    INNER JOIN \`blocks_carriers_relations\` B ON A.id=B.block
    WHERE B.host_type='materialHistory' AND B.host=?
  `;

  const data = await strapi.connections.dbDefault.raw(sql, [materialHistoryId]);
  return data?.[0] || [];
};