@defikitdotnet/x-ai-combat
Version:
XCombatAI - Social Media Engagement Template for the Agent Framework
136 lines • 5.45 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { Controller, Get, ResourceController } from "@defikitdotnet/agent-framework-backend";
import { v4 as uuidv4 } from "uuid";
import { PostResource } from "../models/Post";
import { XAIAdapter } from "../db/XAIAdapter";
// Create a resource implementation for PostResource
const createPostResource = (adapter) => ({
name: "posts",
findAll: async (agentId) => {
// Get all posts from database via adapter, filtered by agentId if provided
const posts = await adapter.getAllPosts(agentId);
// Convert to PostResource objects
return posts.map(post => {
const postResource = new PostResource();
Object.assign(postResource, post);
return postResource;
});
},
findById: async (id, agentId) => {
const post = await adapter.findPostById(id);
if (!post)
return null;
// Filter by agentId if provided
if (agentId && post.agentId !== agentId) {
return null;
}
// Convert from Post to PostResource
const postResource = new PostResource();
Object.assign(postResource, post);
return postResource;
},
findByTweetId: async (tweetId, agentId) => {
const post = await adapter.findPostByTweetId(tweetId);
if (!post)
return null;
// Filter by agentId if provided
if (agentId && post.agentId !== agentId) {
return null;
}
// Convert from Post to PostResource
const postResource = new PostResource();
Object.assign(postResource, post);
return postResource;
},
create: async (data) => {
const id = data.id || uuidv4();
const newPost = new PostResource();
Object.assign(newPost, data, {
id,
createdAt: data.createdAt || new Date(),
});
await adapter.createPost(newPost);
return newPost;
},
update: async (id, data) => {
const existingPost = await adapter.findPostById(id);
if (!existingPost)
return null;
const updated = new PostResource();
Object.assign(updated, existingPost, data, { updatedAt: new Date() });
await adapter.createPost(updated);
return updated;
},
delete: async (id) => {
// Implementation will be added later if needed
return false;
},
});
/**
* Post API controller
*/
let XAICombatPostController = class XAICombatPostController extends ResourceController {
constructor(adapter) {
super(createPostResource(adapter));
this.adapter = adapter;
}
async getMyPosts(req, res) {
try {
// Get userId from token
const userId = req.XaicombatUser?.userId;
if (!userId) {
res.status(401).json({ error: "Unauthorized: User not authenticated" });
return;
}
// Parse pagination parameters
const page = req.query.page ? parseInt(req.query.page) : 1;
const limit = req.query.limit ? parseInt(req.query.limit) : 10;
// Get agentId from JWT token
const agentId = req.XaicombatUser?.agentId;
// Validate pagination parameters
if (isNaN(page) || page < 1 || isNaN(limit) || limit < 1) {
res.status(400).json({ error: "Invalid pagination parameters" });
return;
}
const { posts, total } = await this.adapter.getPostsByUserId(userId, page, limit, agentId);
const resources = posts.map(post => {
const resource = new PostResource();
Object.assign(resource, post);
return resource;
});
res.status(200).json({
data: resources,
pagination: {
page,
limit,
total,
totalPages: Math.ceil(total / limit)
}
});
}
catch (error) {
console.error("Error retrieving posts for current user:", error);
res.status(500).json({ error: "Failed to retrieve posts" });
}
}
};
__decorate([
Get("/my-posts"),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", Promise)
], XAICombatPostController.prototype, "getMyPosts", null);
XAICombatPostController = __decorate([
Controller("/xaicombat/api/posts"),
__metadata("design:paramtypes", [XAIAdapter])
], XAICombatPostController);
export { XAICombatPostController };
//# sourceMappingURL=PostController.js.map