explain WITH RECURSIVE CategoryHierarchy AS ( SELECT id, title, parent_id FROM categories WHERE id = (SELECT category_id FROM products WHERE id = 1)
UNION ALL
SELECT c.id, c.title, c.parent_id
FROM categories c
INNER JOIN CategoryHierarchy ch ON c.id = ch.parent_id
) SELECT * FROM CategoryHierarchy WHERE parent_id IS NULL LIMIT 1;
- ability to upload videos of product (use product videos to upload videos [must use tusd pkg , fmtp to reduce video size]) - use record lock when editing or delete product records
- افزودن/ویرایش/حذف محصولات: امکان اضافه کردن محصولات جدید، ویرایش مشخصات محصولات (مانند قیمت، توضیحات، تصاویر)، و حذف محصولات قدیمی.
- مدیریت دستهبندیها: امکان ایجاد، ویرایش، و حذف دستهبندیهای محصولات.
- مدیریت موجودی: مشاهده و مدیریت موجودی محصولات و ارسال اعلانهای خودکار در صورت کمبود موجودی.
- تنظیم قیمت و تخفیف: امکان تنظیم قیمت، اعمال تخفیفهای موقت یا دائمی، و نمایش قیمت قبلی و جدید.
- مشاهده و پیگیری سفارشات: امکان مشاهده لیست کامل سفارشات با جزئیاتی مانند وضعیت پرداخت، وضعیت ارسال، و تاریخ ثبت سفارش.
- تایید/رد سفارشات: امکان تایید یا رد سفارشات و ارسال اعلان به کاربر.
- مدیریت مرجوعیها: سیستم مدیریت درخواستهای مرجوعی و رسیدگی به آنها.
- تولید فاکتور: امکان تولید و ارسال فاکتور به مشتریان.
- مدیریت مشتریان: مشاهده پروفایلها و تاریخچه خرید مشتریان، امکان قفل یا حذف حسابهای کاربری.
- مدیریت دسترسیها: امکان ایجاد، ویرایش، و حذف نقشها و سطوح دسترسی مختلف برای ادمینها.
- مدیریت نظرات و بازخوردها: مشاهده و مدیریت نظرات کاربران در مورد محصولات، امکان تایید یا حذف نظرات.
- گزارش فروش: نمایش گزارشات جامع از فروشها به صورت دورهای (روزانه، هفتگی، ماهانه).
- تحلیل رفتار مشتری: نمایش تحلیلهایی از رفتار مشتریان مانند پرفروشترین محصولات، محصولات پر بازدید، و نرخ تبدیل.
- گزارش مالی: نمایش گزارشات مالی شامل درآمد، هزینهها، سود و زیان.
- مدیریت بنرها و تبلیغات: امکان اضافه کردن و مدیریت بنرها و تبلیغات در سایت.
- مدیریت صفحات و بلاگ: ایجاد و ویرایش صفحات اطلاعاتی، مقالات و محتواهای وبلاگ.
- مدیریت SEO: تنظیمات سئو برای صفحات مختلف به منظور بهبود رتبه سایت در موتورهای جستجو.
-
مدیریت تیکتها و درخواستهای پشتیبانی: امکان مشاهده و پاسخگویی به درخواستهای پشتیبانی کاربران.
-
ارسال ایمیلهای انبوه: امکان ارسال ایمیلهای تبلیغاتی یا اطلاعرسانی به گروهی از کاربران.
-
تنظیم اعلانها: مدیریت اعلانها و پیامهای ارسالی به کاربران از طریق ایمیل، پیامک، یا سیستم اعلان داخلی.
-
ارسال نوتیفیکیشن کاهش موجودی یا اتمام موجودی
-
غیر فعال شدن و یا تگ اتمام موجودی برای محصول بدون موجودی
- api for delete product inventory attribute
- api for delete inventory and its attributes in the product_inventory_attributes table
- Add attributes to an existing inventory
- update inventory quantity
- add home page html
- add login / register html form
- implement login / register for customer
- send otp
- resend otp
- add customer profile html form
- add customer address html form
- add product recom by elastic
- add logOut
- edit customer profile (name,last name)
- customer profile manager
- show all customer in admin panel
- implement redis as a cache driver
- implement cache system for menu and rows(most orders,most viewed , newest , by categories , etc)
- add enable/disable , priority to category
- store final product in mongodb(flat)
- crud product feature
- show single product in home page with multi qty
- show product by category in home page
__
- separate SyncMongo() from product_repository
- add some real menu
- load all menu in redis
- add some real product
- store product with all attributes in mongodb
- load data rows(new , most ordered , ) in home page
- ability to bookmark product by user
- log all request in elastic
- order
- get tax-code
- buy product by bank gateway
- show customer paginated orders
- show detail of an order in customer side
- show paginated orders in admin panel
- show detail of an order in admin side
- implement event/listener system
- implement job/queue/schedule system using asynq pkg
- install Asynqmon Web UI for monitoring & administering Asynq task queue
add make file :
docker-compose -f docker-compose.dev.yml --env-file .env.development up
-----------_/_------------
sample rediLock code
package services
import (
"context"
"fmt"
"time"
"project/internal/models"
"project/internal/repositories"
"project/pkg/redis"
"github.com/redis/go-redis/v9"
)
type OrderService interface {
PlaceOrder(ctx context.Context, order *models.Order) error
}
type orderService struct {
orderRepo repositories.OrderRepository
redis *redis.Client
}
func NewOrderService(orderRepo repositories.OrderRepository, redisClient *redis.Client) OrderService {
return &orderService{orderRepo: orderRepo, redis: redisClient}
}
func (s *orderService) PlaceOrder(ctx context.Context, order *models.Order) error {
// قفلها برای محصولات
lockKeys := make([]string, 0)
for _, item := range order.Items {
lockKey := fmt.Sprintf("lock:product:%d", item.ProductID)
locked, err := s.redis.SetNX(ctx, lockKey, "locked", 10*time.Second).Result()
if err != nil {
// آزاد کردن قفلهای قبلی در صورت خطا
s.releaseLocks(ctx, lockKeys)
return fmt.Errorf("error acquiring lock for product %d: %w", item.ProductID, err)
}
if !locked {
s.releaseLocks(ctx, lockKeys)
return fmt.Errorf("product %d is locked by another process", item.ProductID)
}
lockKeys = append(lockKeys, lockKey)
}
// آزاد کردن قفلها در انتها
defer s.releaseLocks(ctx, lockKeys)
// ذخیره سفارش و آیتمها در دیتابیس
if err := s.orderRepo.CreateOrder(ctx, order); err != nil {
return fmt.Errorf("error creating order: %w", err)
}
return nil
}
func (s *orderService) releaseLocks(ctx context.Context, lockKeys []string) {
for _, lockKey := range lockKeys {
s.redis.Del(ctx, lockKey)
}
}