I am trying to connect medusa with admin bro

137 Views Asked by At

I am trying to connect my medusa application with adminbro to get a better understanding the relationships I will create between my entities. And I am getting this error

/Users/priyabihani/Documents/medusa/openboxkar_medusa/node_modules/admin-bro/lib/backend/utils/resources-factory/resources-factory.js:99
        throw new NoResourceAdapterError(resourceObject);
              ^

NoResourceAdapterError: There are no adapters supporting one of the resource you provided
    at /Users/priyabihani/Documents/medusa/openboxkar_medusa/node_modules/admin-bro/lib/backend/utils/resources-factory/resources-factory.js:99:15
    at Array.map (<anonymous>)
    at ResourcesFactory._convertResources (/Users/priyabihani/Documents/medusa/openboxkar_medusa/node_modules/admin-bro/lib/backend/utils/resources-factory/resources-factory.js:93:22)
    at ResourcesFactory.buildResources (/Users/priyabihani/Documents/medusa/openboxkar_medusa/node_modules/admin-bro/lib/backend/utils/resources-factory/resources-factory.js:48:35)
    at new AdminBro (/Users/priyabihani/Documents/medusa/openboxkar_medusa/node_modules/admin-bro/lib/admin-bro.js:101:39)
    at start (/Users/priyabihani/Documents/medusa/openboxkar_medusa/index.js:20:22)
    at /Users/priyabihani/Documents/medusa/openboxkar_medusa/index.js:71:9
    at Object.<anonymous> (/Users/priyabihani/Documents/medusa/openboxkar_medusa/index.js:72:3)
    at Module._compile (node:internal/modules/cjs/loader:1103:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1157:10) {
  resource: [class Product extends Product]
}

I am trying to connect medusa with admin bro to get a better understanding of the relationships I will create.

I find out that I can run my the index.js file in my root by using npm run start:custom, in index.js file I can add the adminbro adapter and user adminbro router. Also I am getting my products from the dist folder that was compiled from my source folder.

package.json file

{
  "name": "medusa-starter-default",
  "version": "0.0.1",
  "description": "A starter for Medusa projects.",
  "author": "Medusa (https://medusajs.com)",
  "license": "MIT",
  "keywords": [
    "sqlite",
    "postgres",
    "typescript",
    "ecommerce",
    "headless",
    "medusa"
  ],
  "scripts": {
    "clean": "cross-env ./node_modules/.bin/rimraf dist",
    "build": "cross-env npm run clean && npm run build:server && npm run build:admin",
    "build:server": "cross-env npm run clean && tsc -p tsconfig.server.json",
    "build:admin": "cross-env medusa-admin build",
    "watch": "cross-env tsc --watch",
    "test": "cross-env jest",
    "seed": "cross-env medusa seed -f ./data/seed.json",
    "start": "cross-env npm run build && medusa start",
    "start:custom": "cross-env npm run build && node --preserve-symlinks --trace-warnings index.js",
    "dev": "cross-env npm run build:server && medusa develop",
    "dev:custom": "cross-env npm run build:server && nodemon --watch src/* --preserve-symlinks --trace-warnings index.js"
  },
  "dependencies": {
    "@admin-bro/express": "^3.1.0",
    "@admin-bro/typeorm": "^1.4.0",
    "@medusajs/admin": "7.1.8",
    "@medusajs/cache-inmemory": "^1.8.9",
    "@medusajs/cache-redis": "^1.8.9",
    "@medusajs/event-bus-local": "^1.9.7",
    "@medusajs/event-bus-redis": "^1.8.10",
    "@medusajs/file-local": "^1.0.2",
    "@medusajs/medusa": "1.18.1",
    "@tanstack/react-query": "4.22.0",
    "admin-bro": "^3.3.1",
    "body-parser": "^1.19.0",
    "cors": "^2.8.5",
    "dotenv": "16.3.1",
    "express": "^4.17.2",
    "medusa-fulfillment-manual": "^1.1.38",
    "medusa-interfaces": "^1.3.7",
    "medusa-payment-manual": "^1.0.24",
    "medusa-payment-stripe": "^6.0.5",
    "prism-react-renderer": "^2.0.4",
    "reflect-metadata": "^0.2.1",
    "typeorm": "^0.3.16"
  },
  "devDependencies": {
    "@babel/cli": "^7.14.3",
    "@babel/core": "^7.14.3",
    "@babel/preset-typescript": "^7.21.4",
    "@medusajs/medusa-cli": "^1.3.21",
    "@types/express": "^4.17.13",
    "@types/jest": "^27.4.0",
    "@types/node": "^17.0.8",
    "babel-preset-medusa-package": "^1.1.19",
    "cross-env": "^7.0.3",
    "eslint": "^6.8.0",
    "jest": "^27.3.1",
    "nodemon": "^3.0.2",
    "rimraf": "^3.0.2",
    "ts-jest": "^27.0.7",
    "ts-loader": "^9.2.6",
    "typescript": "^4.5.2"
  },
  "jest": {
    "globals": {
      "ts-jest": {
        "tsconfig": "tsconfig.spec.json"
      }
    },
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "testPathIgnorePatterns": [
      "/node_modules/",
      "<rootDir>/node_modules/"
    ],
    "rootDir": "src",
    "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|js)$",
    "transform": {
      ".ts": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "./coverage",
    "testEnvironment": "node"
  }
}

index.js file

require("reflect-metadata");
const express = require("express");
const AdminBro = require("admin-bro");
const AdminBroExpress = require("@admin-bro/express");
const { Product } = require("./dist/models/product.js");
const { Database, Resource } = require("@admin-bro/typeorm");

const { GracefulShutdownServer } = require("medusa-core-utils");

const loaders = require("@medusajs/medusa/dist/loaders/index").default;

(async () => {
  async function start() {
    const app = express();
    const directory = process.cwd();
    console.log("============", directory);

    AdminBro.registerAdapter({ Database, Resource });

    const adminBro = new AdminBro({
      resources: [
        {
          resource: Product,
        },
      ],
      rootPath: "/adminbro",
    });

    const adminBroRouter = AdminBroExpress.buildRouter(adminBro);

    try {
      console.log(app);
      const { container } = await loaders({
        directory,
        expressApp: app,
      });
      const configModule = container.resolve("configModule");
      const port = process.env.PORT ?? configModule.projectConfig.port ?? 9000;

      const server = GracefulShutdownServer.create(
        app.listen(port, (err) => {
          if (err) {
            return;
          }
          console.log(`Server is ready on port: ${port}`);
          app.use(adminBro.options.rootPath, adminBroRouter);
        })
      );

      // Handle graceful shutdown
      const gracefulShutDown = () => {
        server
          .shutdown()
          .then(() => {
            console.info("Gracefully stopping the server.");
            process.exit(0);
          })
          .catch((e) => {
            console.error("Error received when shutting down the server.", e);
            process.exit(1);
          });
      };
      process.on("SIGTERM", gracefulShutDown);
      process.on("SIGINT", gracefulShutDown);
    } catch (err) {
      console.error("Error starting server", err);
      process.exit(1);
    }
  }

  await start();
})();

Also in my src/models/product file where I am actually defining/extending the schema:

import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import { Product as MedusaProduct } from "@medusajs/medusa";
import { Store } from "./store";

@Entity("product")
export class Product extends MedusaProduct {
  @Index("ProductStoreId")
  @Column({ nullable: true })
  store_id?: string;

  @ManyToOne(() => Store, (store) => store.products)
  @JoinColumn({ name: "store_id", referencedColumnName: "id" })
  store?: Store;
}

Can anyone help?

0

There are 0 best solutions below