Skip to content

Commit 50de604

Browse files
authored
Merge pull request #19 from pranav514/notification-service
improvement : Refactored notification service
2 parents abe9c89 + dace50a commit 50de604

File tree

18 files changed

+168
-29
lines changed

18 files changed

+168
-29
lines changed

dist/controllers/listing.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,14 @@ const updatelisting = (req, res) => __awaiter(void 0, void 0, void 0, function*
6060
userId });
6161
if (updateListing.status === 411) {
6262
return res.status(updateListing.status).json({
63-
message: updateListing.message
63+
message: updateListing.message,
6464
});
6565
}
66+
notification_1.notificationEmitter.emit("ListingUpdated", updateListing.data);
67+
notificationListner_1.specificlistingNotification;
6668
return res.status(updateListing.status).json({
67-
message: updateListing.message
69+
message: updateListing.message,
70+
data: updateListing.data
6871
});
6972
});
7073
exports.updatelisting = updatelisting;

dist/controllers/subscription.js

+12-3
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
99
});
1010
};
1111
Object.defineProperty(exports, "__esModule", { value: true });
12-
exports.CreateSubscription = void 0;
12+
exports.CreateListingSubscription = exports.CreateSubscription = void 0;
1313
const subscription_1 = require("../services/subscription");
1414
const CreateSubscription = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
15-
const listingId = req.params.id;
1615
const userId = req.userId;
17-
const subscription = yield (0, subscription_1.CreateSubscriptions)({ userId, listingId });
16+
const subscription = yield (0, subscription_1.CreateSubscriptions)(userId);
1817
if (subscription.status == 402) {
1918
return res.status(subscription.status).json({
2019
message: subscription.message
@@ -26,3 +25,13 @@ const CreateSubscription = (req, res) => __awaiter(void 0, void 0, void 0, funct
2625
});
2726
});
2827
exports.CreateSubscription = CreateSubscription;
28+
const CreateListingSubscription = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
29+
const listingId = req.params.id;
30+
const userId = req.userId;
31+
const subscription = yield (0, subscription_1.CreateSubscriptionLisiting)(userId, listingId);
32+
return res.status(subscription.status).json({
33+
message: subscription.message,
34+
data: subscription.data
35+
});
36+
});
37+
exports.CreateListingSubscription = CreateListingSubscription;

dist/repositories/subscription.js

+22-3
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
99
});
1010
};
1111
Object.defineProperty(exports, "__esModule", { value: true });
12-
exports.FindMany = exports.Create = exports.findUnique = void 0;
12+
exports.CreateListingSubsripton = exports.FindListingSuscribers = exports.FindMany = exports.Create = exports.findUnique = void 0;
1313
const db_1 = require("../db");
14-
const findUnique = ({ userId, listingId }) => __awaiter(void 0, void 0, void 0, function* () {
14+
const findUnique = (userId) => __awaiter(void 0, void 0, void 0, function* () {
1515
const notification = yield db_1.prisma.subscription.findFirst({
1616
where: {
1717
userId,
@@ -20,7 +20,7 @@ const findUnique = ({ userId, listingId }) => __awaiter(void 0, void 0, void 0,
2020
return notification;
2121
});
2222
exports.findUnique = findUnique;
23-
const Create = ({ userId, listingId }) => __awaiter(void 0, void 0, void 0, function* () {
23+
const Create = (userId) => __awaiter(void 0, void 0, void 0, function* () {
2424
const subscription = yield db_1.prisma.subscription.create({
2525
data: {
2626
userId,
@@ -34,3 +34,22 @@ const FindMany = () => __awaiter(void 0, void 0, void 0, function* () {
3434
return subscribers;
3535
});
3636
exports.FindMany = FindMany;
37+
const FindListingSuscribers = (listingId) => __awaiter(void 0, void 0, void 0, function* () {
38+
const subscribers = yield db_1.prisma.listingNotifySubscription.findMany({
39+
where: {
40+
listingId
41+
}
42+
});
43+
return subscribers;
44+
});
45+
exports.FindListingSuscribers = FindListingSuscribers;
46+
const CreateListingSubsripton = ({ userId, listingId }) => __awaiter(void 0, void 0, void 0, function* () {
47+
const listing_suscription = yield db_1.prisma.listingNotifySubscription.create({
48+
data: {
49+
userId,
50+
listingId
51+
}
52+
});
53+
return listing_suscription;
54+
});
55+
exports.CreateListingSubsripton = CreateListingSubsripton;

dist/routes/subscriptionRoute.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ const express_1 = __importDefault(require("express"));
77
const authMiddleware_1 = require("../middleware/authMiddleware");
88
const subscription_1 = require("../controllers/subscription");
99
const router = express_1.default.Router();
10-
router.post('/createsubscription/:id', authMiddleware_1.authMiddleware, subscription_1.CreateSubscription);
10+
router.post('/createsubscription', authMiddleware_1.authMiddleware, subscription_1.CreateSubscription);
11+
router.post('/createlistingsubscription/:id', authMiddleware_1.authMiddleware, subscription_1.CreateListingSubscription);
1112
exports.default = router;

dist/services/lisiting.js

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ const UpdateListings = ({ title, description, images, rent, prefered_gender, add
5858
return {
5959
message: "listing updated succesfully",
6060
status: 200,
61+
data: listing
6162
};
6263
}
6364
catch (error) {

dist/services/subscription.js

+13-4
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,30 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
99
});
1010
};
1111
Object.defineProperty(exports, "__esModule", { value: true });
12-
exports.CreateSubscriptions = void 0;
12+
exports.CreateSubscriptionLisiting = exports.CreateSubscriptions = void 0;
1313
const subscription_1 = require("../repositories/subscription");
14-
const CreateSubscriptions = ({ userId, listingId }) => __awaiter(void 0, void 0, void 0, function* () {
15-
const suscribed = yield (0, subscription_1.findUnique)({ userId, listingId });
14+
const CreateSubscriptions = (userId) => __awaiter(void 0, void 0, void 0, function* () {
15+
const suscribed = yield (0, subscription_1.findUnique)(userId);
1616
if (suscribed) {
1717
return {
1818
message: "You have already subscribed to this listing",
1919
status: 402,
2020
};
2121
}
22-
const subscription = yield (0, subscription_1.Create)({ userId, listingId });
22+
const subscription = yield (0, subscription_1.Create)(userId);
2323
return {
2424
message: "Subscribed successfully",
2525
status: 200,
2626
data: subscription
2727
};
2828
});
2929
exports.CreateSubscriptions = CreateSubscriptions;
30+
const CreateSubscriptionLisiting = (userId, listingId) => __awaiter(void 0, void 0, void 0, function* () {
31+
const subscription = yield (0, subscription_1.CreateListingSubsripton)({ userId, listingId });
32+
return {
33+
message: "Subscribed successfully",
34+
status: 200,
35+
data: subscription
36+
};
37+
});
38+
exports.CreateSubscriptionLisiting = CreateSubscriptionLisiting;

dist/tests/listing.test.js

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ vitest_1.vi.mock("../db", () => ({
3939
update: vitest_1.vi.fn(),
4040
delete: vitest_1.vi.fn(),
4141
},
42+
subscription: {
43+
findMany: vitest_1.vi.fn(() => Promise.resolve([]))
44+
}
4245
},
4346
}));
4447
vitest_1.vi.mock("jsonwebtoken", () => ({
@@ -47,6 +50,7 @@ vitest_1.vi.mock("jsonwebtoken", () => ({
4750
vitest_1.vi.mock("../events/notificationEmitter", () => ({
4851
notificationEmitter: {
4952
emit: vitest_1.vi.fn(),
53+
on: vitest_1.vi.fn(),
5054
},
5155
}));
5256
(0, vitest_1.describe)("POST /createlisting", () => {

dist/utils/notificationListner.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
99
});
1010
};
1111
Object.defineProperty(exports, "__esModule", { value: true });
12-
exports.pingNotification = exports.notificationGenerator = void 0;
12+
exports.pingNotification = exports.specificlistingNotification = exports.notificationGenerator = void 0;
1313
const db_1 = require("../db");
1414
const notification_1 = require("../eventemitter/notification");
1515
const listing_1 = require("../repositories/listing");
@@ -28,6 +28,17 @@ exports.notificationGenerator = notification_1.notificationEmitter.on("ListingCr
2828
});
2929
}
3030
}));
31+
exports.specificlistingNotification = notification_1.notificationEmitter.on("ListingUpdated", (listing) => __awaiter(void 0, void 0, void 0, function* () {
32+
const subscribers = yield (0, subscription_1.FindListingSuscribers)(listing.id);
33+
for (const subscriber of subscribers) {
34+
yield db_1.prisma.notification.create({
35+
data: {
36+
userId: subscriber.userId,
37+
message: `Listing updated : ${listing.title}`
38+
}
39+
});
40+
}
41+
}));
3142
exports.pingNotification = notification_1.notificationEmitter.on("PingCreated", (ping) => __awaiter(void 0, void 0, void 0, function* () {
3243
console.log("reached here");
3344
const postId = yield ping.postId;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-- CreateTable
2+
CREATE TABLE "ListingNotifySubscription" (
3+
"id" TEXT NOT NULL,
4+
"userId" TEXT NOT NULL,
5+
"listingId" TEXT NOT NULL,
6+
7+
CONSTRAINT "ListingNotifySubscription_pkey" PRIMARY KEY ("id")
8+
);
9+
10+
-- AddForeignKey
11+
ALTER TABLE "ListingNotifySubscription" ADD CONSTRAINT "ListingNotifySubscription_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
12+
13+
-- AddForeignKey
14+
ALTER TABLE "ListingNotifySubscription" ADD CONSTRAINT "ListingNotifySubscription_listingId_fkey" FOREIGN KEY ("listingId") REFERENCES "Listing"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

prisma/schema.prisma

+10
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ model User{
2424
pings Ping[]
2525
subscriptions Subscription[]
2626
notifications Notification[]
27+
listingNotifySubscriptions ListingNotifySubscription[]
2728
}
2829

2930
model Listing{
@@ -40,6 +41,7 @@ model Listing{
4041
userId String
4142
user User @relation(fields: [userId] , references: [id])
4243
pings Ping[]
44+
listingNotifySubscriptions ListingNotifySubscription[]
4345
}
4446

4547
model Ping{
@@ -67,3 +69,11 @@ model Notification {
6769
createdAt DateTime @default(now())
6870
user User @relation(fields: [userId], references: [id])
6971
}
72+
73+
model ListingNotifySubscription {
74+
id String @id @default(uuid())
75+
userId String
76+
listingId String
77+
user User @relation(fields: [userId], references: [id])
78+
listing Listing @relation(fields: [listingId], references: [id])
79+
}

src/controllers/listing.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import express, { Request, Response } from "express";
44
import { CreateListing, DeleteListing, GetAll, GetUserSpecific, SpecificListing, UpdateListings } from "../services/lisiting";
55
import { EventEmitter } from "events";
66
import { notificationEmitter } from "../eventemitter/notification";
7-
import { notificationGenerator } from "../utils/notificationListner";
7+
import { notificationGenerator, specificlistingNotification } from "../utils/notificationListner";
88
export const createlisting = async(req : Request , res : Response ) : Promise<any> => {
99
const {
1010
title,
@@ -72,11 +72,15 @@ export const updatelisting = async (req : Request , res : Response) : Promise<an
7272

7373
if(updateListing.status === 411){
7474
return res.status(updateListing.status).json({
75-
message : updateListing.message
75+
message : updateListing.message,
7676
})
7777
}
78+
notificationEmitter.emit("ListingUpdated" , updateListing.data)
79+
specificlistingNotification
7880
return res.status(updateListing.status).json({
79-
message : updateListing.message
81+
message : updateListing.message,
82+
data: updateListing.data
83+
8084
})
8185

8286
}

src/controllers/subscription.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import express, { Request, Response } from "express";
2-
import { CreateSubscriptions } from "../services/subscription";
2+
import { CreateSubscriptionLisiting, CreateSubscriptions } from "../services/subscription";
33

44
export const CreateSubscription = async(req: Request , res : Response) : Promise<any> => {
5-
const listingId = req.params.id
65
const userId = req.userId
7-
const subscription = await CreateSubscriptions({userId , listingId});
6+
const subscription = await CreateSubscriptions(userId);
87
if(subscription.status == 402){
98
return res.status(subscription.status).json({
109
message : subscription.message
@@ -14,4 +13,14 @@ export const CreateSubscription = async(req: Request , res : Response) : Promise
1413
message : subscription.message,
1514
data : subscription.data
1615
})
16+
}
17+
18+
export const CreateListingSubscription = async(req: Request , res : Response) : Promise<any> => {
19+
const listingId = req.params.id
20+
const userId = req.userId
21+
const subscription = await CreateSubscriptionLisiting(userId,listingId);
22+
return res.status(subscription.status).json({
23+
message : subscription.message,
24+
data : subscription.data
25+
})
1726
}

src/repositories/subscription.ts

+21-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { prisma } from "../db";
22
import { DeleteListingInterface } from "../interface/authInterface";
33

4-
export const findUnique = async({userId , listingId} : DeleteListingInterface) => {
4+
export const findUnique = async(userId : string) => {
55
const notification = await prisma.subscription.findFirst({
66
where : {
77
userId,
@@ -11,7 +11,7 @@ export const findUnique = async({userId , listingId} : DeleteListingInterface) =
1111
return notification
1212
}
1313

14-
export const Create = async ({userId , listingId} : DeleteListingInterface) => {
14+
export const Create = async (userId : string) => {
1515
const subscription = await prisma.subscription.create({
1616
data : {
1717
userId,
@@ -23,4 +23,23 @@ export const Create = async ({userId , listingId} : DeleteListingInterface) => {
2323
export const FindMany = async() => {
2424
const subscribers = await prisma.subscription.findMany({});
2525
return subscribers
26+
}
27+
export const FindListingSuscribers = async(listingId : string) => {
28+
const subscribers = await prisma.listingNotifySubscription.findMany({
29+
where : {
30+
listingId
31+
}
32+
})
33+
return subscribers
34+
}
35+
36+
export const CreateListingSubsripton = async({userId, listingId} : DeleteListingInterface) => {
37+
const listing_suscription = await prisma.listingNotifySubscription.create({
38+
data : {
39+
userId,
40+
listingId
41+
}
42+
})
43+
return listing_suscription
44+
2645
}

src/routes/subscriptionRoute.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import express from "express"
22

33
import { authMiddleware } from "../middleware/authMiddleware";
4-
import { CreateSubscription } from "../controllers/subscription";
4+
import { CreateListingSubscription, CreateSubscription } from "../controllers/subscription";
55
const router = express.Router();
6-
router.post('/createsubscription/:id' , authMiddleware , CreateSubscription);
6+
router.post('/createsubscription' , authMiddleware , CreateSubscription);
7+
router.post('/createlistingsubscription/:id' , authMiddleware , CreateListingSubscription);
78
export default router

src/services/lisiting.ts

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ export const UpdateListings = async ({title,
6060
return {
6161
message : "listing updated succesfully",
6262
status : 200,
63+
data : listing
6364
}
6465
}
6566

src/services/subscription.ts

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
1-
import { Create, findUnique } from "../repositories/subscription"
1+
import { Create, CreateListingSubsripton, findUnique } from "../repositories/subscription"
22

3-
export const CreateSubscriptions = async ({userId , listingId} : any) => {
4-
const suscribed = await findUnique({userId , listingId})
3+
export const CreateSubscriptions = async (userId : string) => {
4+
const suscribed = await findUnique(userId )
55
if(suscribed){
66
return {
77
message : "You have already subscribed to this listing",
88
status : 402,
99
}
1010
}
11-
const subscription = await Create({userId , listingId})
11+
const subscription = await Create(userId )
12+
return {
13+
message : "Subscribed successfully",
14+
status : 200,
15+
data : subscription
16+
}
17+
}
18+
19+
export const CreateSubscriptionLisiting = async (userId : string, listingId : string) => {
20+
const subscription = await CreateListingSubsripton({userId, listingId})
1221
return {
1322
message : "Subscribed successfully",
1423
status : 200,

src/tests/listing.test.ts

+3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ vi.mock("../db", () => ({
3535
},
3636
subscription : {
3737
findMany : vi.fn(() =>Promise.resolve([]))
38+
},
39+
listingNotifySubscription : {
40+
findMany : vi.fn(() =>Promise.resolve([]))
3841
}
3942
},
4043
}));

0 commit comments

Comments
 (0)