@comasoft/nestjs 0.1.63 → 0.1.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/comment/comment.service.js +1 -1
- package/dist/database/entities/logs-audit.entity.js +1 -1
- package/dist/database/entities/notification-recipient.entity.d.ts +3 -0
- package/dist/database/entities/notification-recipient.entity.js +1 -1
- package/dist/dto/file.dto.js +1 -1
- package/dist/events/services/event-notification.service.js +1 -1
- package/dist/events/services/event-storage.service.js +1 -1
- package/dist/interceptors/success.interceptor.js +1 -1
- package/dist/notifications/index.d.ts +24 -4
- package/dist/notifications/notification.module.js +1 -1
- package/dist/notifications/services/index.d.ts +1 -0
- package/dist/notifications/services/index.js +1 -1
- package/dist/notifications/services/message-template.service.d.ts +6 -2
- package/dist/notifications/services/message-template.service.js +1 -1
- package/dist/notifications/services/notification-send.service.d.ts +9 -2
- package/dist/notifications/services/notification-send.service.js +1 -1
- package/dist/notifications/services/notification.service.js +1 -1
- package/dist/notifications/services/web.service.d.ts +15 -0
- package/dist/notifications/services/web.service.js +1 -0
- package/dist/role/role.service.d.ts +1 -1
- package/dist/role/role.service.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,t,i,n){var r
|
|
1
|
+
var e=this&&this.__decorate||function(e,t,i,n){var o,r=arguments.length,d=r<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)d=Reflect.decorate(e,t,i,n);else for(var a=e.length-1;a>=0;a--)(o=e[a])&&(d=(r<3?o(d):r>3?o(t,i,d):o(t,i))||d);return r>3&&d&&Object.defineProperty(t,i,d),d},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},i=this&&this.__param||function(e,t){return function(i,n){t(i,n,e)}},n=this&&this.__awaiter||function(e,t,i,n){return new(i||(i=Promise))(function(o,r){function fulfilled(e){try{step(n.next(e))}catch(e){r(e)}}function rejected(e){try{step(n.throw(e))}catch(e){r(e)}}function step(e){e.done?o(e.value):function adopt(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.CommentService=void 0;const o=require("@nestjs/common"),r=require("@nestjs/typeorm"),d=require("typeorm"),a=require("../database/entities"),s=require("../utils");let c=class CommentService{constructor(e,t){this.repository=e,this.dataSource=t}resolveTargetId(e,t,i){return n(this,void 0,void 0,function*(){if(t)return t;if(!i)throw new o.BadRequestException("Either target_id or target_uid is required");throw new o.BadRequestException("resolveTargetId must be implemented in app service")})}updateTargetCommentCount(e,t,i,r){return n(this,void 0,void 0,function*(){throw new o.BadRequestException("updateTargetCommentCount must be implemented in app service")})}calculateTreeStructure(e,t,i){return n(this,void 0,void 0,function*(){if(i){const n=yield this.repository.findOne({where:{id:i,target:e,target_id:t,deleted_at:null}});if(!n)throw new o.NotFoundException("Parent comment not found");const r=yield this.repository.createQueryBuilder("comments").select("MAX(comments.sort)","maxSort").where("comments.target = :target",{target:e}).andWhere("comments.target_id = :target_id",{target_id:t}).andWhere("comments.group_id = :group_id",{group_id:n.group_id}).andWhere("comments.deleted_at IS NULL").getRawOne();return{group_id:n.group_id,depth:n.depth+1,sort:((null==r?void 0:r.maxSort)||0)+1}}{const i=yield this.repository.createQueryBuilder("comments").select("MAX(comments.sort)","maxSort").where("comments.target = :target",{target:e}).andWhere("comments.target_id = :target_id",{target_id:t}).andWhere("comments.parent_id IS NULL").andWhere("comments.deleted_at IS NULL").getRawOne();return{group_id:0,depth:0,sort:((null==i?void 0:i.maxSort)||0)+1}}})}create(e,t){return n(this,void 0,void 0,function*(){const{target:i,target_id:o,target_uid:r,parent_id:d,content:s,meta:c}=t,m=yield this.resolveTargetId(i,o,r),u=yield this.calculateTreeStructure(i,m,d);return yield this.dataSource.transaction(t=>n(this,void 0,void 0,function*(){const n=yield t.save(a.Comment,Object.assign(Object.assign({target:i,target_id:m,parent_id:d},u),{user_id:e,content:s,meta:c}));return d||(yield t.update(a.Comment,n.id,{group_id:n.id})),d&&(yield t.increment(a.Comment,{id:d},"cnt_replies",1)),yield this.updateTargetCommentCount(t,i,m,1),yield t.findOne(a.Comment,{where:{id:n.id}})}))})}paginateRaw(e,t,i){return n(this,void 0,void 0,function*(){const{page:n,limit:o}=t,r=(n-1)*o,[d,a]=yield Promise.all([e.clone().limit(o).offset(r).getRawMany(),e.clone().getCount()]),s=Math.ceil(a/o);return{items:d.map(i),pagination:{page:n,limit:o,count:d.length,count_total:a,count_page:s}}})}findAll(e,t,i,o){return n(this,void 0,void 0,function*(){const{_page:n=1,_limit:r=10,_keyword:d,_group:a,_sort:c}=e;let m=this.repository.createQueryBuilder("comments").leftJoin("users","user","comments.user_id = user.id").addSelect(["user.id","user.uid","user.name","user.profile_image","user.info_department","user.info_position"]).where("comments.deleted_at IS NULL");if(t&&m.andWhere("comments.target = :target",{target:t}),i||o){const e=t?yield this.resolveTargetId(t,i,o):i;m.andWhere("comments.target_id = :target_id",{target_id:e})}m=(0,s.applyFiltersAndSorting)(m,{_keyword:d,_group:a,_sort:c,keywordFields:["content"],aliasName:"comments"}),c||m.orderBy("comments.group_id","ASC").addOrderBy("comments.sort","ASC");return yield this.paginateRaw(m,{page:n,limit:r},e=>({id:e.comments_id,target:e.comments_target,target_id:e.comments_target_id,parent_id:e.comments_parent_id,group_id:e.comments_group_id,depth:e.comments_depth,sort:e.comments_sort,content:e.comments_content,meta:e.comments_meta,cnt_likes:e.comments_cnt_likes,cnt_replies:e.comments_cnt_replies,modified_at:e.comments_modified_at,created_at:e.comments_created_at,updated_at:e.comments_updated_at,user:{id:e.user_id,uid:e.user_uid,name:e.user_name,profile_image:e.user_profile_image,info_department:e.user_info_department,info_position:e.user_info_position}}))})}update(e,t,i){return n(this,void 0,void 0,function*(){const n=yield this.repository.findOne({where:{id:t,deleted_at:null}});if(!n)throw new o.NotFoundException(`Comment with ID ${t} not found`);if(n.user_id!==e)throw new o.BadRequestException("You can only update your own comments");yield this.repository.update(t,Object.assign(Object.assign({},i),{modified_at:new Date}))})}remove(e,t){return n(this,void 0,void 0,function*(){const i=yield this.repository.findOne({where:{id:t,deleted_at:null}});if(!i)throw new o.NotFoundException(`Comment with ID ${t} not found`);if(i.user_id!==e)throw new o.BadRequestException("You can only delete your own comments");yield this.dataSource.transaction(e=>n(this,void 0,void 0,function*(){yield e.softDelete(a.Comment,t),yield e.update(a.Comment,t,{content:""}),i.parent_id&&(yield e.decrement(a.Comment,{id:i.parent_id},"cnt_replies",1)),yield this.updateTargetCommentCount(e,i.target,i.target_id,-1)}))})}};exports.CommentService=c,exports.CommentService=c=e([(0,o.Injectable)(),i(0,(0,r.InjectRepository)(a.Comment)),t("design:paramtypes",[d.Repository,d.DataSource])],c);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,t,o,n){var i,r=arguments.length,l=r<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,o):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,n);else for(var d=e.length-1;d>=0;d--)(i=e[d])&&(l=(r<3?i(l):r>3?i(t,o,l):i(t,o))||l);return r>3&&l&&Object.defineProperty(t,o,l),l},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(exports,"__esModule",{value:!0}),exports.LogsAudit=void 0;const o=require("typeorm"),n=require("../../enums.common");let i=class LogsAudit{};exports.LogsAudit=i,e([(0,o.PrimaryGeneratedColumn)(),t("design:type",Number)],i.prototype,"id",void 0),e([(0,o.Column)("char",{length:21}),t("design:type",String)],i.prototype,"uid",void 0),e([(0,o.Column)("varchar",{length:255}),t("design:type",String)],i.prototype,"name",void 0),e([(0,o.Column)("varchar",{length:50,nullable:!0}),t("design:type",String)],i.prototype,"entity",void 0),e([(0,o.Column)("int",{nullable:!0,comment:"-1: all, 0: none"}),t("design:type",Number)],i.prototype,"entity_id",void 0),e([(0,o.Column)("jsonb",{nullable:!0}),t("design:type",Array)],i.prototype,"entity_ids",void 0),e([(0,o.Column)("enum",{enum:n.AUDIT_ACTION,nullable:!0}),t("design:type",String)],i.prototype,"action",void 0),e([(0,o.Column)("int"),t("design:type",Number)],i.prototype,"user_id",void 0),e([(0,o.Column)("int",{nullable:!0}),t("design:type",Number)],i.prototype,"target_user_id",void 0),e([(0,o.Column)("jsonb",{nullable:!0}),t("design:type",Object)],i.prototype,"changes",void 0),e([(0,o.Column)("varchar",{length:45,nullable:!0}),t("design:type",String)],i.prototype,"ip_address",void 0),e([(0,o.Column)("varchar",{length:255,nullable:!0}),t("design:type",String)],i.prototype,"user_agent",void 0),e([(0,o.Column)("varchar",{length:255,nullable:!0}),t("design:type",String)],i.prototype,"description",void 0),e([(0,o.Column)("jsonb",{nullable:!0}),t("design:type",Object)],i.prototype,"meta",void 0),e([(0,o.Column)("timestamptz"),t("design:type",Date)],i.prototype,"occurred_at",void 0),e([(0,o.CreateDateColumn)({type:"timestamptz"}),t("design:type",Date)],i.prototype,"created_at",void 0),exports.LogsAudit=i=e([(0,o.Entity)("logs_audit"),(0,o.Index)(["uid"]),(0,o.Index)(["name","entity_id"]),(0,o.Index)(["user_id","name","entity_id"])],i);
|
|
1
|
+
var e=this&&this.__decorate||function(e,t,o,n){var i,r=arguments.length,l=r<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,o):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,n);else for(var d=e.length-1;d>=0;d--)(i=e[d])&&(l=(r<3?i(l):r>3?i(t,o,l):i(t,o))||l);return r>3&&l&&Object.defineProperty(t,o,l),l},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(exports,"__esModule",{value:!0}),exports.LogsAudit=void 0;const o=require("typeorm"),n=require("../../enums.common");let i=class LogsAudit{};exports.LogsAudit=i,e([(0,o.PrimaryGeneratedColumn)(),t("design:type",Number)],i.prototype,"id",void 0),e([(0,o.Column)("char",{length:21}),t("design:type",String)],i.prototype,"uid",void 0),e([(0,o.Column)("varchar",{length:255}),t("design:type",String)],i.prototype,"name",void 0),e([(0,o.Column)("varchar",{length:50,nullable:!0}),t("design:type",String)],i.prototype,"entity",void 0),e([(0,o.Column)("int",{nullable:!0,comment:"-1: all, 0: none"}),t("design:type",Number)],i.prototype,"entity_id",void 0),e([(0,o.Column)("jsonb",{nullable:!0}),t("design:type",Array)],i.prototype,"entity_ids",void 0),e([(0,o.Column)("enum",{enum:n.AUDIT_ACTION,nullable:!0}),t("design:type",String)],i.prototype,"action",void 0),e([(0,o.Column)("int",{nullable:!0}),t("design:type",Number)],i.prototype,"user_id",void 0),e([(0,o.Column)("int",{nullable:!0}),t("design:type",Number)],i.prototype,"target_user_id",void 0),e([(0,o.Column)("jsonb",{nullable:!0}),t("design:type",Object)],i.prototype,"changes",void 0),e([(0,o.Column)("varchar",{length:45,nullable:!0}),t("design:type",String)],i.prototype,"ip_address",void 0),e([(0,o.Column)("varchar",{length:255,nullable:!0}),t("design:type",String)],i.prototype,"user_agent",void 0),e([(0,o.Column)("varchar",{length:255,nullable:!0}),t("design:type",String)],i.prototype,"description",void 0),e([(0,o.Column)("jsonb",{nullable:!0}),t("design:type",Object)],i.prototype,"meta",void 0),e([(0,o.Column)("timestamptz"),t("design:type",Date)],i.prototype,"occurred_at",void 0),e([(0,o.CreateDateColumn)({type:"timestamptz"}),t("design:type",Date)],i.prototype,"created_at",void 0),exports.LogsAudit=i=e([(0,o.Entity)("logs_audit"),(0,o.Index)(["uid"]),(0,o.Index)(["name","entity_id"]),(0,o.Index)(["user_id","name","entity_id"])],i);
|
|
@@ -6,8 +6,11 @@ declare class Relations {
|
|
|
6
6
|
export declare class NotificationRecipient extends Relations {
|
|
7
7
|
id: number;
|
|
8
8
|
notification_id: number;
|
|
9
|
+
type: string;
|
|
9
10
|
user_id: number;
|
|
10
11
|
recipient: string;
|
|
12
|
+
title: string;
|
|
13
|
+
content: string;
|
|
11
14
|
variables: Record<string, any>;
|
|
12
15
|
status: NOTIFICATION_STATUS;
|
|
13
16
|
sent_at: Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var t=this&&this.__decorate||function(t,e,i,o){var n,a=arguments.length,r=a<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,i,o);else for(var p=t.length-1;p>=0;p--)(n=t[p])&&(r=(a<3?n(r):a>3?n(e,i,r):n(e,i))||r);return a>3&&r&&Object.defineProperty(e,i,r),r},e=this&&this.__metadata||function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)};Object.defineProperty(exports,"__esModule",{value:!0}),exports.NotificationRecipient=void 0;const i=require("typeorm"),o=require("../../enums.common"),n=require("./notification.entity");class Relations{}t([(0,i.ManyToOne)(()=>n.Notification,t=>t.recipients),(0,i.JoinColumn)({name:"notification_id"}),e("design:type",n.Notification)],Relations.prototype,"notification",void 0);let a=class NotificationRecipient extends Relations{};exports.NotificationRecipient=a,t([(0,i.PrimaryGeneratedColumn)(),e("design:type",Number)],a.prototype,"id",void 0),t([(0,i.Column)("int"),e("design:type",Number)],a.prototype,"notification_id",void 0),t([(0,i.Column)("int"),e("design:type",Number)],a.prototype,"user_id",void 0),t([(0,i.Column)("varchar",{length:100,nullable:!0}),e("design:type",String)],a.prototype,"recipient",void 0),t([(0,i.Column)("jsonb",{nullable:!0}),e("design:type",Object)],a.prototype,"variables",void 0),t([(0,i.Column)("enum",{enum:o.NOTIFICATION_STATUS}),e("design:type",String)],a.prototype,"status",void 0),t([(0,i.Column)("timestamptz",{nullable:!0}),e("design:type",Date)],a.prototype,"sent_at",void 0),t([(0,i.Column)("timestamptz",{nullable:!0}),e("design:type",Date)],a.prototype,"read_at",void 0),t([(0,i.Column)("timestamptz",{nullable:!0}),e("design:type",Date)],a.prototype,"failed_at",void 0),t([(0,i.Column)("varchar",{length:255,nullable:!0}),e("design:type",String)],a.prototype,"reason_failed",void 0),t([(0,i.CreateDateColumn)({type:"timestamptz"}),e("design:type",Date)],a.prototype,"created_at",void 0),exports.NotificationRecipient=a=t([(0,i.Entity)("notification_recipients"),(0,i.Index)(["notification_id","status"]),(0,i.Index)(["user_id"])],a);
|
|
1
|
+
var t=this&&this.__decorate||function(t,e,i,o){var n,a=arguments.length,r=a<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,i,o);else for(var p=t.length-1;p>=0;p--)(n=t[p])&&(r=(a<3?n(r):a>3?n(e,i,r):n(e,i))||r);return a>3&&r&&Object.defineProperty(e,i,r),r},e=this&&this.__metadata||function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)};Object.defineProperty(exports,"__esModule",{value:!0}),exports.NotificationRecipient=void 0;const i=require("typeorm"),o=require("../../enums.common"),n=require("./notification.entity");class Relations{}t([(0,i.ManyToOne)(()=>n.Notification,t=>t.recipients),(0,i.JoinColumn)({name:"notification_id"}),e("design:type",n.Notification)],Relations.prototype,"notification",void 0);let a=class NotificationRecipient extends Relations{};exports.NotificationRecipient=a,t([(0,i.PrimaryGeneratedColumn)(),e("design:type",Number)],a.prototype,"id",void 0),t([(0,i.Column)("int"),e("design:type",Number)],a.prototype,"notification_id",void 0),t([(0,i.Column)("varchar",{length:25,nullable:!0}),e("design:type",String)],a.prototype,"type",void 0),t([(0,i.Column)("int"),e("design:type",Number)],a.prototype,"user_id",void 0),t([(0,i.Column)("varchar",{length:100,nullable:!0}),e("design:type",String)],a.prototype,"recipient",void 0),t([(0,i.Column)("varchar",{length:255,nullable:!0}),e("design:type",String)],a.prototype,"title",void 0),t([(0,i.Column)("text",{nullable:!0}),e("design:type",String)],a.prototype,"content",void 0),t([(0,i.Column)("jsonb",{nullable:!0}),e("design:type",Object)],a.prototype,"variables",void 0),t([(0,i.Column)("enum",{enum:o.NOTIFICATION_STATUS}),e("design:type",String)],a.prototype,"status",void 0),t([(0,i.Column)("timestamptz",{nullable:!0}),e("design:type",Date)],a.prototype,"sent_at",void 0),t([(0,i.Column)("timestamptz",{nullable:!0}),e("design:type",Date)],a.prototype,"read_at",void 0),t([(0,i.Column)("timestamptz",{nullable:!0}),e("design:type",Date)],a.prototype,"failed_at",void 0),t([(0,i.Column)("varchar",{length:255,nullable:!0}),e("design:type",String)],a.prototype,"reason_failed",void 0),t([(0,i.CreateDateColumn)({type:"timestamptz"}),e("design:type",Date)],a.prototype,"created_at",void 0),exports.NotificationRecipient=a=t([(0,i.Entity)("notification_recipients"),(0,i.Index)(["notification_id","status"]),(0,i.Index)(["user_id"]),(0,i.Index)(["type"])],a);
|
package/dist/dto/file.dto.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,t,o,i){var r,
|
|
1
|
+
var e=this&&this.__decorate||function(e,t,o,i){var r,s=arguments.length,l=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,i);else for(var p=e.length-1;p>=0;p--)(r=e[p])&&(l=(s<3?r(l):s>3?r(t,o,l):r(t,o))||l);return s>3&&l&&Object.defineProperty(t,o,l),l},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FileThumbnailDto=exports.FileDto=void 0;const o=require("@nestjs/swagger"),i=require("class-transformer");class FileMetaDto{}e([(0,i.Expose)(),t("design:type",Number)],FileMetaDto.prototype,"width",void 0),e([(0,i.Expose)(),t("design:type",Number)],FileMetaDto.prototype,"height",void 0);class FileDto{}exports.FileDto=FileDto,e([(0,i.Expose)(),t("design:type",Number)],FileDto.prototype,"id",void 0),e([(0,i.Expose)(),t("design:type",String)],FileDto.prototype,"original_name",void 0),e([(0,i.Expose)(),t("design:type",String)],FileDto.prototype,"mime_type",void 0),e([(0,i.Expose)(),t("design:type",Number)],FileDto.prototype,"size",void 0),e([(0,i.Expose)(),(0,i.Transform)(({obj:e})=>`${process.env.CDN_URL||""}/uploads/${e.target}/${e.path}/${e.file_name}`),t("design:type",String)],FileDto.prototype,"full_url",void 0),e([(0,i.Expose)(),(0,i.Transform)(({obj:e})=>{var t;return(null===(t=e.mime_type)||void 0===t?void 0:t.startsWith("image/"))?`${process.env.CDN_URL||""}/thumbnails/${e.target}/${e.path}/sm/${e.file_name}`:void 0}),t("design:type",String)],FileDto.prototype,"thumbnail_small",void 0),e([(0,i.Expose)(),(0,i.Transform)(({obj:e})=>{var t;return(null===(t=e.mime_type)||void 0===t?void 0:t.startsWith("image/"))?`${process.env.CDN_URL||""}/thumbnails/${e.target}/${e.path}/md/${e.file_name}`:void 0}),t("design:type",String)],FileDto.prototype,"thumbnail_medium",void 0),e([(0,i.Expose)(),(0,i.Type)(()=>FileMetaDto),(0,i.Transform)(({obj:e})=>e.meta),t("design:type",FileMetaDto)],FileDto.prototype,"meta",void 0);class FileThumbnailDto extends((0,o.PickType)(FileDto,["thumbnail_small","thumbnail_medium"])){}exports.FileThumbnailDto=FileThumbnailDto;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,t,i,a){var n,
|
|
1
|
+
var e=this&&this.__decorate||function(e,t,i,a){var n,c=arguments.length,s=c<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,i):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,a);else for(var o=e.length-1;o>=0;o--)(n=e[o])&&(s=(c<3?n(s):c>3?n(t,i,s):n(t,i))||s);return c>3&&s&&Object.defineProperty(t,i,s),s},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},i=this&&this.__awaiter||function(e,t,i,a){return new(i||(i=Promise))(function(n,c){function fulfilled(e){try{step(a.next(e))}catch(e){c(e)}}function rejected(e){try{step(a.throw(e))}catch(e){c(e)}}function step(e){e.done?n(e.value):function adopt(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((a=a.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.EventNotificationService=void 0;const a=require("@nestjs/common"),n=require("../../notifications");let c=class EventNotificationService{constructor(e,t){this.notificationService=e,this.notificationSendService=t}send(e){return i(this,void 0,void 0,function*(){if(null==e?void 0:e.web){const t=yield this.notificationSendService.send({type:"web",recipients:e.web.recipients,template_key:e.web.template_key,variables:e.web.variables});console.log("📧 [EVENT-NOTIFICATION] Web 발송 결과:",t)}if(null==e?void 0:e.email){yield this.notificationService.create({type:"email",template_key:e.email.template_key,recipients:e.email.recipients,variables:e.email.variables});const t=yield this.notificationSendService.send({type:"email",recipients:e.email.recipients,subject:e.email.subject,body:e.email.body,template_key:e.email.template_key,variables:e.email.variables});console.log("📧 [EVENT-NOTIFICATION] Email 발송 결과:",t)}if(null==e?void 0:e.kakao){yield this.notificationService.create({type:"kakao",template_key:e.kakao.template_key,recipients:e.kakao.recipients,variables:e.kakao.variables});const t=yield this.notificationSendService.send({type:"kakao",recipients:e.kakao.recipients,template_key:e.kakao.template_key,variables:e.kakao.variables});console.log("📱 [EVENT-NOTIFICATION] Kakao 발송 결과:",t)}if(null==e?void 0:e.sms){yield this.notificationService.create({type:"sms",template_key:e.sms.template_key,recipients:e.sms.recipients,variables:e.sms.variables});const t=yield this.notificationSendService.send({type:"sms",recipients:e.sms.recipients,content:e.sms.content,template_key:e.sms.template_key,variables:e.sms.variables});console.log("📱 [EVENT-NOTIFICATION] SMS 발송 결과:",t)}if(null==e?void 0:e.slack){yield this.notificationService.create({type:"slack",template_key:e.slack.template_key,recipients:[{user_id:0,recipient:e.slack.channel}],variables:e.slack.variables});const t=yield this.notificationSendService.send({type:"slack",channel:e.slack.channel,content:e.slack.content,template_key:e.slack.template_key,variables:e.slack.variables});console.log("📢 [EVENT-NOTIFICATION] Slack 발송 결과:",t)}})}};exports.EventNotificationService=c,exports.EventNotificationService=c=e([(0,a.Injectable)(),t("design:paramtypes",[n.NotificationService,n.NotificationSendService])],c);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,t,i,
|
|
1
|
+
var e=this&&this.__decorate||function(e,t,i,r){var n,o=arguments.length,s=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,r);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,i,s):n(t,i))||s);return o>3&&s&&Object.defineProperty(t,i,s),s},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},i=this&&this.__param||function(e,t){return function(i,r){t(i,r,e)}},r=this&&this.__awaiter||function(e,t,i,r){return new(i||(i=Promise))(function(n,o){function fulfilled(e){try{step(r.next(e))}catch(e){o(e)}}function rejected(e){try{step(r.throw(e))}catch(e){o(e)}}function step(e){e.done?n(e.value):function adopt(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((r=r.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.EventStorageService=void 0;const n=require("@nestjs/common"),o=require("@nestjs/typeorm"),s=require("nanoid"),a=require("typeorm"),d=require("../../database/entities");let u=class EventStorageService{constructor(e,t,i){this.eventLogRepository=e,this.auditLogRepository=t,this.dataSource=i}store(e){return r(this,void 0,void 0,function*(){var t,i,r;const n=(null===(t=e.user)||void 0===t?void 0:t.user_id)||0,o=e.name,d=new Date,u=new Date(d.getTime()-3e4);if(yield this.eventLogRepository.findOne({where:{user_id:n,name:o,occurred_at:(0,a.MoreThanOrEqual)(u)},order:{occurred_at:"DESC"}}))return;const c=this.eventLogRepository.create({uid:e.uid||(0,s.nanoid)(),name:e.name,user_id:n,ip_address:null===(i=e.user)||void 0===i?void 0:i.ip_address,user_agent:null===(r=e.user)||void 0===r?void 0:r.user_agent,occurred_at:e.timestamp||new Date});yield this.eventLogRepository.save(c)})}storeAuditEvent(e){return r(this,void 0,void 0,function*(){yield this.dataSource.transaction(t=>r(this,void 0,void 0,function*(){var i,r,n;const o=t.create(d.LogsAudit,{uid:e.uid||(0,s.nanoid)(),name:e.name,user_id:(null===(i=e.user)||void 0===i?void 0:i.user_id)||0,target_user_id:e.target_user_id,entity:e.entity,entity_id:e.entity_id,entity_ids:e.entity_ids,action:e.action,changes:e.changes,ip_address:null===(r=e.user)||void 0===r?void 0:r.ip_address,user_agent:null===(n=e.user)||void 0===n?void 0:n.user_agent,occurred_at:e.timestamp||new Date,meta:e.meta});yield t.save(o)}))})}};exports.EventStorageService=u,exports.EventStorageService=u=e([(0,n.Injectable)(),i(0,(0,o.InjectRepository)(d.LogsEvent)),i(1,(0,o.InjectRepository)(d.LogsAudit)),t("design:paramtypes",[a.Repository,a.Repository,a.DataSource])],u);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,t,r,s){var o
|
|
1
|
+
var e=this&&this.__decorate||function(e,t,r,s){var c,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,s);else for(var p=e.length-1;p>=0;p--)(c=e[p])&&(n=(o<3?c(n):o>3?c(t,r,n):c(t,r))||n);return o>3&&n&&Object.defineProperty(t,r,n),n},t=this&&this.__rest||function(e,t){var r={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var c=0;for(s=Object.getOwnPropertySymbols(e);c<s.length;c++)t.indexOf(s[c])<0&&Object.prototype.propertyIsEnumerable.call(e,s[c])&&(r[s[c]]=e[s[c]])}return r};Object.defineProperty(exports,"__esModule",{value:!0}),exports.SuccessInterceptor=void 0;const r=require("@nestjs/common"),s=require("rxjs/operators");let c=class SuccessInterceptor{intercept(e,r){return r.handle().pipe((0,s.map)(e=>{try{const{audit:r}=e,s=t(e,["audit"]);return e&&(e.access_token||e.refresh_token)?Object.assign({success:!0},s):e&&void 0!==e.response?{success:!0,data:s.response}:void 0===e.response?{success:!0,data:s}:{success:!0}}catch(e){return{success:!0}}}))}};exports.SuccessInterceptor=c,exports.SuccessInterceptor=c=e([(0,r.Injectable)()],c);
|
|
@@ -6,6 +6,13 @@ export interface NotificationRecipient {
|
|
|
6
6
|
variables?: Record<string, any>;
|
|
7
7
|
}
|
|
8
8
|
export interface NotificationOptions {
|
|
9
|
+
web?: {
|
|
10
|
+
recipients: NotificationRecipient[];
|
|
11
|
+
title?: string;
|
|
12
|
+
content?: string;
|
|
13
|
+
template_key?: string;
|
|
14
|
+
variables?: Record<string, any>;
|
|
15
|
+
};
|
|
9
16
|
email?: {
|
|
10
17
|
recipients: NotificationRecipient[];
|
|
11
18
|
subject?: string;
|
|
@@ -15,7 +22,7 @@ export interface NotificationOptions {
|
|
|
15
22
|
};
|
|
16
23
|
slack?: {
|
|
17
24
|
channel: string;
|
|
18
|
-
|
|
25
|
+
content?: string;
|
|
19
26
|
template_key?: string;
|
|
20
27
|
variables?: Record<string, any>;
|
|
21
28
|
};
|
|
@@ -26,12 +33,25 @@ export interface NotificationOptions {
|
|
|
26
33
|
};
|
|
27
34
|
sms?: {
|
|
28
35
|
recipients: NotificationRecipient[];
|
|
29
|
-
|
|
36
|
+
content?: string;
|
|
30
37
|
template_key?: string;
|
|
31
38
|
variables?: Record<string, any>;
|
|
32
39
|
};
|
|
33
40
|
}
|
|
34
41
|
export type NotificationPayload = {
|
|
42
|
+
type: 'web';
|
|
43
|
+
recipients: Array<{
|
|
44
|
+
recipient: string;
|
|
45
|
+
user_id: number;
|
|
46
|
+
title?: string;
|
|
47
|
+
content?: string;
|
|
48
|
+
variables?: Record<string, any>;
|
|
49
|
+
}>;
|
|
50
|
+
title?: string;
|
|
51
|
+
content?: string;
|
|
52
|
+
template_key?: string;
|
|
53
|
+
variables?: Record<string, any>;
|
|
54
|
+
} | {
|
|
35
55
|
type: 'email';
|
|
36
56
|
recipients: Array<{
|
|
37
57
|
recipient: string;
|
|
@@ -49,7 +69,7 @@ export type NotificationPayload = {
|
|
|
49
69
|
user_id: number;
|
|
50
70
|
variables?: Record<string, any>;
|
|
51
71
|
}>;
|
|
52
|
-
|
|
72
|
+
content?: string;
|
|
53
73
|
template_key?: string;
|
|
54
74
|
variables?: Record<string, any>;
|
|
55
75
|
} | {
|
|
@@ -64,7 +84,7 @@ export type NotificationPayload = {
|
|
|
64
84
|
} | {
|
|
65
85
|
type: 'slack';
|
|
66
86
|
channel: string;
|
|
67
|
-
|
|
87
|
+
content?: string;
|
|
68
88
|
template_key?: string;
|
|
69
89
|
variables?: Record<string, any>;
|
|
70
90
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,i,t,o){var r,c=arguments.length,n=c<3?i:null===o?o=Object.getOwnPropertyDescriptor(i,t):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,i,t,o);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(c<3?r(n):c>3?r(i,t,n):r(i,t))||n);return c>3&&n&&Object.defineProperty(i,t,n),n};Object.defineProperty(exports,"__esModule",{value:!0}),exports.NotificationModule=void 0;const i=require("@nestjs/common"),t=require("@nestjs/typeorm"),o=require("../database/entities"),r=require("./services");let c=class NotificationModule{};exports.NotificationModule=c,exports.NotificationModule=c=e([(0,i.Global)(),(0,i.Module)({imports:[t.TypeOrmModule.forFeature([o.Config,o.Notification,o.NotificationRecipient])],providers:[r.NotificationService,r.NotificationSendService,r.MessageTemplateService,r.EmailService,r.KakaoService,r.SmsService,r.SlackService],exports:[r.NotificationSendService,r.NotificationService]})],c);
|
|
1
|
+
var e=this&&this.__decorate||function(e,i,t,o){var r,c=arguments.length,n=c<3?i:null===o?o=Object.getOwnPropertyDescriptor(i,t):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,i,t,o);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(c<3?r(n):c>3?r(i,t,n):r(i,t))||n);return c>3&&n&&Object.defineProperty(i,t,n),n};Object.defineProperty(exports,"__esModule",{value:!0}),exports.NotificationModule=void 0;const i=require("@nestjs/common"),t=require("@nestjs/typeorm"),o=require("../database/entities"),r=require("./services");let c=class NotificationModule{};exports.NotificationModule=c,exports.NotificationModule=c=e([(0,i.Global)(),(0,i.Module)({imports:[t.TypeOrmModule.forFeature([o.Config,o.Notification,o.NotificationRecipient])],providers:[r.NotificationService,r.NotificationSendService,r.MessageTemplateService,r.EmailService,r.KakaoService,r.SmsService,r.SlackService,r.WebNotificationService],exports:[r.NotificationSendService,r.NotificationService]})],c);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__createBinding||(Object.create?function(e,r,t,i){void 0===i&&(i=t);var o=Object.getOwnPropertyDescriptor(r,t);o&&!("get"in o?!r.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,i,o)}:function(e,r,t,i){void 0===i&&(i=t),e[i]=r[t]}),r=this&&this.__exportStar||function(r,t){for(var i in r)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||e(t,r,i)};Object.defineProperty(exports,"__esModule",{value:!0}),r(require("./notification.service"),exports),r(require("./notification-send.service"),exports),r(require("./message-template.service"),exports),r(require("./email.service"),exports),r(require("./kakao.service"),exports),r(require("./sms.service"),exports),r(require("./slack.service"),exports);
|
|
1
|
+
var e=this&&this.__createBinding||(Object.create?function(e,r,t,i){void 0===i&&(i=t);var o=Object.getOwnPropertyDescriptor(r,t);o&&!("get"in o?!r.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,i,o)}:function(e,r,t,i){void 0===i&&(i=t),e[i]=r[t]}),r=this&&this.__exportStar||function(r,t){for(var i in r)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||e(t,r,i)};Object.defineProperty(exports,"__esModule",{value:!0}),r(require("./notification.service"),exports),r(require("./notification-send.service"),exports),r(require("./message-template.service"),exports),r(require("./email.service"),exports),r(require("./kakao.service"),exports),r(require("./sms.service"),exports),r(require("./slack.service"),exports),r(require("./web.service"),exports);
|
|
@@ -3,13 +3,17 @@ import { Config } from '../../database/entities';
|
|
|
3
3
|
export declare class MessageTemplateService {
|
|
4
4
|
private configRepository;
|
|
5
5
|
constructor(configRepository: Repository<Config>);
|
|
6
|
-
getTemplate(type: 'email' | 'sms' | 'slack' | 'kakao', templateKey: string): Promise<any>;
|
|
6
|
+
getTemplate(type: 'web' | 'email' | 'sms' | 'slack' | 'kakao', templateKey: string): Promise<any>;
|
|
7
7
|
getTemplates(): Promise<Record<string, any>>;
|
|
8
8
|
updateTemplates(templates: any): Promise<void>;
|
|
9
9
|
renderTemplate(template: {
|
|
10
|
+
title: string;
|
|
10
11
|
content: string;
|
|
11
12
|
variables: string[];
|
|
12
13
|
required_vars: string[];
|
|
13
14
|
default_vars: Record<string, any>;
|
|
14
|
-
}, variables: Record<string, any>):
|
|
15
|
+
}, variables: Record<string, any>): {
|
|
16
|
+
title: string;
|
|
17
|
+
content: string;
|
|
18
|
+
};
|
|
15
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,i);else for(var s=e.length-1;s>=0;s--)(n=e[s])&&(a=(o<3?n(a):o>3?n(t,r,a):n(t,r))||a);return o>3&&a&&Object.defineProperty(t,r,a),a},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}},i=this&&this.__awaiter||function(e,t,r,i){return new(r||(r=Promise))(function(n,o){function fulfilled(e){try{step(i.next(e))}catch(e){o(e)}}function rejected(e){try{step(i.throw(e))}catch(e){o(e)}}function step(e){e.done?n(e.value):function adopt(e){return e instanceof r?e:new r(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((i=i.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.MessageTemplateService=void 0;const n=require("@nestjs/common"),o=require("@nestjs/typeorm"),a=require("typeorm"),s=require("../../database/entities");let
|
|
1
|
+
var e=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,i);else for(var s=e.length-1;s>=0;s--)(n=e[s])&&(a=(o<3?n(a):o>3?n(t,r,a):n(t,r))||a);return o>3&&a&&Object.defineProperty(t,r,a),a},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}},i=this&&this.__awaiter||function(e,t,r,i){return new(r||(r=Promise))(function(n,o){function fulfilled(e){try{step(i.next(e))}catch(e){o(e)}}function rejected(e){try{step(i.throw(e))}catch(e){o(e)}}function step(e){e.done?n(e.value):function adopt(e){return e instanceof r?e:new r(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((i=i.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.MessageTemplateService=void 0;const n=require("@nestjs/common"),o=require("@nestjs/typeorm"),a=require("typeorm"),s=require("../../database/entities");let l=class MessageTemplateService{constructor(e){this.configRepository=e}getTemplate(e,t){return i(this,void 0,void 0,function*(){var r;return null===(r=(yield this.getTemplates())[e])||void 0===r?void 0:r[t]})}getTemplates(){return i(this,void 0,void 0,function*(){const e=yield this.configRepository.findOne({where:{key:"message_templates",is_active:!0}});return(null==e?void 0:e.value)||{}})}updateTemplates(e){return i(this,void 0,void 0,function*(){yield this.configRepository.update({key:"message_templates"},{value:e,updated_at:new Date})})}renderTemplate(e,t){var r;const i=e.required_vars.filter(r=>{var i;return void 0===t[r]&&void 0===(null===(i=e.default_vars)||void 0===i?void 0:i[r])});if(i.length>0)throw new Error(`Missing required variables: ${i.join(", ")}`);return{title:null===(r=e.title)||void 0===r?void 0:r.replace(/\{\{(\w+)\}\}/g,(r,i)=>{var n;return void 0!==t[i]?t[i]:void 0!==(null===(n=e.default_vars)||void 0===n?void 0:n[i])?e.default_vars[i]:""}),content:e.content.replace(/\{\{(\w+)\}\}/g,(r,i)=>{var n;return void 0!==t[i]?t[i]:void 0!==(null===(n=e.default_vars)||void 0===n?void 0:n[i])?e.default_vars[i]:""})}}};exports.MessageTemplateService=l,exports.MessageTemplateService=l=e([(0,n.Injectable)(),r(0,(0,o.InjectRepository)(s.Config)),t("design:paramtypes",[a.Repository])],l);
|
|
@@ -1,17 +1,24 @@
|
|
|
1
|
+
import { DataSource } from 'typeorm';
|
|
1
2
|
import { NotificationPayload } from '..';
|
|
2
3
|
import { EmailService } from './email.service';
|
|
3
4
|
import { KakaoService } from './kakao.service';
|
|
4
5
|
import { MessageTemplateService } from './message-template.service';
|
|
5
6
|
import { SlackService } from './slack.service';
|
|
6
7
|
import { SmsService } from './sms.service';
|
|
8
|
+
import { WebNotificationService } from './web.service';
|
|
7
9
|
export declare class NotificationSendService {
|
|
8
10
|
private readonly emailService;
|
|
9
11
|
private readonly smsService;
|
|
10
12
|
private readonly kakaoService;
|
|
11
13
|
private readonly slackService;
|
|
14
|
+
private readonly webNotificationService;
|
|
12
15
|
private readonly messageTemplateService;
|
|
13
|
-
|
|
14
|
-
|
|
16
|
+
private readonly dataSource;
|
|
17
|
+
constructor(emailService: EmailService, smsService: SmsService, kakaoService: KakaoService, slackService: SlackService, webNotificationService: WebNotificationService, messageTemplateService: MessageTemplateService, dataSource: DataSource);
|
|
18
|
+
send(payload: NotificationPayload): Promise<any[] | import("@aws-sdk/client-ses").SendEmailCommandOutput | {
|
|
19
|
+
success: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
private sendWeb;
|
|
15
22
|
private sendEmail;
|
|
16
23
|
private sendSms;
|
|
17
24
|
private sendKakao;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,t,i,
|
|
1
|
+
var e=this&&this.__decorate||function(e,t,i,r){var s,n=arguments.length,a=n<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,r);else for(var c=e.length-1;c>=0;c--)(s=e[c])&&(a=(n<3?s(a):n>3?s(t,i,a):s(t,i))||a);return n>3&&a&&Object.defineProperty(t,i,a),a},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},i=this&&this.__awaiter||function(e,t,i,r){return new(i||(i=Promise))(function(s,n){function fulfilled(e){try{step(r.next(e))}catch(e){n(e)}}function rejected(e){try{step(r.throw(e))}catch(e){n(e)}}function step(e){e.done?s(e.value):function adopt(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((r=r.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.NotificationSendService=void 0;const r=require("@nestjs/common"),s=require("typeorm"),n=require("./email.service"),a=require("./kakao.service"),c=require("./message-template.service"),o=require("./slack.service"),l=require("./sms.service"),d=require("./web.service");let p=class NotificationSendService{constructor(e,t,i,r,s,n,a){this.emailService=e,this.smsService=t,this.kakaoService=i,this.slackService=r,this.webNotificationService=s,this.messageTemplateService=n,this.dataSource=a}send(e){return i(this,void 0,void 0,function*(){switch(e.type){case"web":return this.sendWeb(e);case"email":return this.sendEmail(e);case"sms":return this.sendSms(e);case"kakao":return this.sendKakao(e);case"slack":return this.sendSlack(e)}})}sendWeb(e){return i(this,void 0,void 0,function*(){const t=[];for(const i of e.recipients){let r,s;if(e.template_key){const t=yield this.messageTemplateService.getTemplate("web",e.template_key);if(!t)throw new Error("Template not found");const n=Object.assign(Object.assign({},e.variables),i.variables);r=this.messageTemplateService.renderTemplate(t,n).title||e.title||"",s=this.messageTemplateService.renderTemplate(t,n).content}else{if(!e.title||!e.content)throw new Error("title, content is required");r=e.title,s=e.content}t.push({recipient:i.recipient,user_id:i.user_id,title:r,content:s,variables:i.variables})}return yield this.webNotificationService.send(Object.assign(Object.assign({},e),{recipients:t}))})}sendEmail(e){return i(this,void 0,void 0,function*(){const t=[];for(const i of e.recipients){let r,s;if(e.template_key){const t=yield this.messageTemplateService.getTemplate("email",e.template_key);if(!t)throw new Error("Template not found");const n=Object.assign(Object.assign({},e.variables),i.variables);r=this.messageTemplateService.renderTemplate(t,n).content,s=t.subject}else{if(!e.subject||!e.body)throw new Error("subject, body is required");r=e.body,s=e.subject}t.push({recipient:i.recipient,user_id:i.user_id,subject:s,text:r,variables:i.variables})}return yield this.emailService.send(t)})}sendSms(e){return i(this,void 0,void 0,function*(){const t=[];for(const i of e.recipients){let r;if(e.template_key){const t=yield this.messageTemplateService.getTemplate("sms",e.template_key);if(!t)throw new Error("Template not found");const s=Object.assign(Object.assign({},e.variables),i.variables);r=this.messageTemplateService.renderTemplate(t,s).content}else{if(!e.content)throw new Error("content is required");r=e.content}t.push({recipient:i.recipient,user_id:i.user_id,content:r,variables:i.variables})}return yield this.smsService.send(t)})}sendKakao(e){return i(this,void 0,void 0,function*(){const t=[];for(const i of e.recipients){let r;if(!e.template_key)throw new Error("template_key is required");const s=yield this.messageTemplateService.getTemplate("kakao",e.template_key);if(!s)throw new Error("Template not found");const n=Object.assign(Object.assign({},e.variables),i.variables);r=this.messageTemplateService.renderTemplate(s,n).content,t.push({recipient:i.recipient,user_id:i.user_id,sender_key:s.sender_key,template_code:s.template_code,message:r})}return yield this.kakaoService.send(t)})}sendSlack(e){return i(this,void 0,void 0,function*(){let t;if(e.template_key){const i=yield this.messageTemplateService.getTemplate("slack",e.template_key);if(!i)throw new Error("Template not found");t=this.messageTemplateService.renderTemplate(i,e.variables||{}).content}else{if(!e.content)throw new Error("content is required");t=e.content}return[yield this.slackService.send(e.channel,t)]})}};exports.NotificationSendService=p,exports.NotificationSendService=p=e([(0,r.Injectable)(),t("design:paramtypes",[n.EmailService,l.SmsService,a.KakaoService,o.SlackService,d.WebNotificationService,c.MessageTemplateService,s.DataSource])],p);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,t,i,n){var o,r=arguments.length,c=r<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,i,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(c=(r<3?o(c):r>3?o(t,i,c):o(t,i))||c);return r>3&&c&&Object.defineProperty(t,i,c),c},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},i=this&&this.__param||function(e,t){return function(i,n){t(i,n,e)}},n=this&&this.__awaiter||function(e,t,i,n){return new(i||(i=Promise))(function(o,r){function fulfilled(e){try{step(n.next(e))}catch(e){r(e)}}function rejected(e){try{step(n.throw(e))}catch(e){r(e)}}function step(e){e.done?o(e.value):function adopt(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.NotificationService=void 0;const o=require("@nestjs/common"),r=require("@nestjs/
|
|
1
|
+
var e=this&&this.__decorate||function(e,t,i,n){var o,r=arguments.length,c=r<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,i,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(c=(r<3?o(c):r>3?o(t,i,c):o(t,i))||c);return r>3&&c&&Object.defineProperty(t,i,c),c},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},i=this&&this.__param||function(e,t){return function(i,n){t(i,n,e)}},n=this&&this.__awaiter||function(e,t,i,n){return new(i||(i=Promise))(function(o,r){function fulfilled(e){try{step(n.next(e))}catch(e){r(e)}}function rejected(e){try{step(n.throw(e))}catch(e){r(e)}}function step(e){e.done?o(e.value):function adopt(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.NotificationService=void 0;const o=require("@nestjs/common"),r=require("@nestjs/config"),c=require("@nestjs/typeorm"),s=require("typeorm"),a=require("../../database/entities"),f=require("../../enums.common");let u=class NotificationService{constructor(e,t,i){this.notificationRepository=e,this.notificationRecipientRepository=t,this.configService=i}create(e){return n(this,arguments,void 0,function*({type:e,template_key:t,title:i,content:n,recipients:o,variables:r}){const c=this.getSenderByType(e),s=yield this.notificationRepository.save({type:e,template_key:t,title:i,content:n,sender:c,status:f.NOTIFICATION_STATUS.PENDING}),a=o.map(t=>this.notificationRecipientRepository.create({notification_id:s.id,type:e,user_id:t.user_id,recipient:t.recipient,title:i,content:n,variables:t.variables,status:f.NOTIFICATION_STATUS.PENDING}));return yield this.notificationRecipientRepository.save(a),{notification:s,recipients:a}})}getSenderByType(e){switch(e){case"web":return"system";case"email":return this.configService.get("EMAIL_FROM")||"noreply@example.com";case"sms":return this.configService.get("SMS_FROM")||"";case"kakao":return this.configService.get("KAKAO_FROM")||"";case"slack":return this.configService.get("SLACK_CHANNEL")||"";default:return""}}findAll(){return n(this,void 0,void 0,function*(){return this.notificationRepository.find({relations:["recipients"],order:{created_at:"DESC"}})})}find(e){return n(this,void 0,void 0,function*(){return this.notificationRepository.findOne({where:{id:e},relations:["recipients"]})})}resend(e,t){return n(this,void 0,void 0,function*(){const i=yield this.notificationRecipientRepository.find({where:t?{notification_id:e,user_id:t}:{notification_id:e}});for(const e of i)e.status=f.NOTIFICATION_STATUS.PENDING,e.failed_at=null,e.reason_failed=null,yield this.notificationRecipientRepository.save(e);return i})}markAsRead(e,t){return n(this,void 0,void 0,function*(){const i=yield this.notificationRecipientRepository.findOne({where:{notification_id:e,user_id:t}});return i&&(i.status=f.NOTIFICATION_STATUS.READ,i.read_at=new Date,yield this.notificationRecipientRepository.save(i)),i})}};exports.NotificationService=u,exports.NotificationService=u=e([(0,o.Injectable)(),i(0,(0,c.InjectRepository)(a.Notification)),i(1,(0,c.InjectRepository)(a.NotificationRecipient)),t("design:paramtypes",[s.Repository,s.Repository,r.ConfigService])],u);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ConfigService } from '@nestjs/config';
|
|
2
|
+
import { DataSource } from 'typeorm';
|
|
3
|
+
import { NotificationPayload } from '../index';
|
|
4
|
+
export declare class WebNotificationService {
|
|
5
|
+
private readonly configService;
|
|
6
|
+
private readonly dataSource;
|
|
7
|
+
private readonly logger;
|
|
8
|
+
constructor(configService: ConfigService, dataSource: DataSource);
|
|
9
|
+
send(payload: NotificationPayload & {
|
|
10
|
+
type: 'web';
|
|
11
|
+
}): Promise<{
|
|
12
|
+
success: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
private sendToUser;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e,t=this&&this.__decorate||function(e,t,i,n){var o,r=arguments.length,c=r<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,i,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(c=(r<3?o(c):r>3?o(t,i,c):o(t,i))||c);return r>3&&c&&Object.defineProperty(t,i,c),c},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},n=this&&this.__awaiter||function(e,t,i,n){return new(i||(i=Promise))(function(o,r){function fulfilled(e){try{step(n.next(e))}catch(e){r(e)}}function rejected(e){try{step(n.throw(e))}catch(e){r(e)}}function step(e){e.done?o(e.value):function adopt(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.WebNotificationService=void 0;const o=require("@nestjs/common"),r=require("@nestjs/config"),c=require("typeorm"),s=require("../../database/entities"),a=require("../../enums.common");let l=e=class WebNotificationService{constructor(t,i){this.configService=t,this.dataSource=i,this.logger=new o.Logger(e.name)}send(e){return n(this,void 0,void 0,function*(){const{recipients:t,title:i,content:n,template_key:o,variables:r}=e,c=yield this.dataSource.getRepository(s.Notification).save({type:"web",template_key:o,status:a.NOTIFICATION_STATUS.SENT});try{for(const e of t)yield this.sendToUser({notification_id:c.id,user_id:e.user_id,recipient:e.recipient,title:e.title||i||"",content:e.content||n||"",template_key:o,variables:Object.assign(Object.assign({},r),e.variables)});return{success:!0}}catch(e){throw this.logger.error("웹 알림 발송 실패:",e),e}})}sendToUser(e){return n(this,arguments,void 0,function*({notification_id:e,user_id:t,recipient:i,title:n,content:o,template_key:r,variables:c}){yield this.dataSource.getRepository(s.NotificationRecipient).save({notification_id:e,user_id:t,recipient:i,title:n,content:o,template_key:r,variables:c,status:a.NOTIFICATION_STATUS.SENT,type:"web"});const l={user_id:t,title:n,content:o,timestamp:(new Date).toISOString(),variables:c};return this.logger.log(`웹 알림 발송: 사용자 ${t}에게 "${n}" 전송`),l})}};exports.WebNotificationService=l,exports.WebNotificationService=l=e=t([(0,o.Injectable)(),i("design:paramtypes",[r.ConfigService,c.DataSource])],l);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__decorate||function(e,t,i,o){var r,n=arguments.length,s=n<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,o);else for(var d=e.length-1;d>=0;d--)(r=e[d])&&(s=(n<3?r(s):n>3?r(t,i,s):r(t,i))||s);return n>3&&s&&Object.defineProperty(t,i,s),s},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},i=this&&this.__param||function(e,t){return function(i,o){t(i,o,e)}},o=this&&this.__awaiter||function(e,t,i,o){return new(i||(i=Promise))(function(r,n){function fulfilled(e){try{step(o.next(e))}catch(e){n(e)}}function rejected(e){try{step(o.throw(e))}catch(e){n(e)}}function step(e){e.done?r(e.value):function adopt(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((o=o.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.RoleService=void 0;const r=require("@nestjs/common"),n=require("@nestjs/typeorm"),s=require("typeorm"),d=require("../database/entities"),a=require("../utils");let c=class RoleService{constructor(e,t){this.repository=e,this.dataSource=t}validatePermissions(e){throw new r.BadRequestException("validatePermissions must be implemented in app service")}validateRoleLimit(){return o(this,void 0,void 0,function*(){throw new r.BadRequestException("validateRoleLimit must be implemented in app service")})}checkRoleUsage(e){return o(this,void 0,void 0,function*(){throw new r.BadRequestException("checkRoleUsage must be implemented in app service")})}create(e){return o(this,void 0,void 0,function*(){if(!e.permissions||0===e.permissions.length)throw new r.BadRequestException("Permissions are required");yield this.validateRoleLimit();if(yield this.repository.findOne({where:{name:e.name}}))throw new r.ConflictException("Role name already exists");this.validatePermissions(e.permissions);const t=(yield this.repository.count())+1;return yield this.repository.save({name:e.name,description:e.description,permissions:e.permissions,sort:t})})}findAll(e){return o(this,void 0,void 0,function*(){const{_page:t,_limit:i,_keyword:o,_group:r,_sort:n}=e;let s=this.repository.createQueryBuilder("roles").select(["roles"]).orderBy("roles.sort","ASC");s=(0,a.applyFiltersAndSorting)(s,{_keyword:o,_group:r,_sort:n,keywordFields:["name"],aliasName:"roles"});return yield(0,a.paginate)(s,{page:t,limit:i})})}findOne(e){return o(this,void 0,void 0,function*(){const t=yield this.repository.findOne({where:{id:e}});if(!t)throw new r.NotFoundException(`Role with ID ${e} not found`);return t})}update(e,t){return o(this,void 0,void 0,function*(){const i=yield this.repository.findOne({where:{id:e}});if(!i)throw new r.NotFoundException(`Role with ID ${e} not found`);if(i.is_system)throw new r.BadRequestException("Cannot update system role");t.permissions&&this.validatePermissions(t.permissions),yield this.repository.update(e,{name:t.name,description:t.description,permissions:t.permissions||void 0});return yield this.repository.findOne({where:{id:e}})})}remove(e){return o(this,void 0,void 0,function*(){const t=yield this.repository.findOne({where:{id:e}});if(!t)throw new r.NotFoundException(`Role with ID ${e} not found`);if(t.is_system||t.is_default)throw new r.BadRequestException("Cannot delete system or default role");yield this.checkRoleUsage(e),yield this.repository.delete(e)})}};exports.RoleService=c,exports.RoleService=c=e([(0,r.Injectable)(),i(0,(0,n.InjectRepository)(d.Role)),t("design:paramtypes",[s.Repository,s.DataSource])],c);
|
|
1
|
+
var e=this&&this.__decorate||function(e,t,i,o){var r,n=arguments.length,s=n<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,o);else for(var d=e.length-1;d>=0;d--)(r=e[d])&&(s=(n<3?r(s):n>3?r(t,i,s):r(t,i))||s);return n>3&&s&&Object.defineProperty(t,i,s),s},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},i=this&&this.__param||function(e,t){return function(i,o){t(i,o,e)}},o=this&&this.__awaiter||function(e,t,i,o){return new(i||(i=Promise))(function(r,n){function fulfilled(e){try{step(o.next(e))}catch(e){n(e)}}function rejected(e){try{step(o.throw(e))}catch(e){n(e)}}function step(e){e.done?r(e.value):function adopt(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((o=o.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.RoleService=void 0;const r=require("@nestjs/common"),n=require("@nestjs/typeorm"),s=require("typeorm"),d=require("../database/entities"),a=require("../utils");let c=class RoleService{constructor(e,t){this.repository=e,this.dataSource=t}validatePermissions(e){throw new r.BadRequestException("validatePermissions must be implemented in app service")}validateRoleLimit(){return o(this,void 0,void 0,function*(){throw new r.BadRequestException("validateRoleLimit must be implemented in app service")})}checkRoleUsage(e){return o(this,void 0,void 0,function*(){throw new r.BadRequestException("checkRoleUsage must be implemented in app service")})}create(e){return o(this,void 0,void 0,function*(){if(!e.permissions||0===e.permissions.length)throw new r.BadRequestException("Permissions are required");yield this.validateRoleLimit();if(yield this.repository.findOne({where:{name:e.name}}))throw new r.ConflictException("Role name already exists");this.validatePermissions(e.permissions);const t=(yield this.repository.count())+1;return yield this.repository.save({name:e.name,description:e.description,permissions:e.permissions,sort:t})})}findAll(e){return o(this,void 0,void 0,function*(){const{_page:t,_limit:i,_keyword:o,_group:r,_sort:n}=e;let s=this.repository.createQueryBuilder("roles").select(["roles"]).orderBy("roles.sort","ASC");s=(0,a.applyFiltersAndSorting)(s,{_keyword:o,_group:r,_sort:n,keywordFields:["name"],aliasName:"roles"});return yield(0,a.paginate)(s,{page:t,limit:i})})}findOne(e){return o(this,void 0,void 0,function*(){const t=yield this.repository.findOne({where:{id:e}});if(!t)throw new r.NotFoundException(`Role with ID ${e} not found`);return t})}update(e,t){return o(this,void 0,void 0,function*(){const i=yield this.repository.findOne({where:{id:e}});if(!i)throw new r.NotFoundException(`Role with ID ${e} not found`);if(i.is_system)throw new r.BadRequestException("Cannot update system role");t.permissions&&this.validatePermissions(t.permissions),yield this.repository.update(e,{name:t.name,description:t.description,permissions:t.permissions||void 0});return yield this.repository.findOne({where:{id:e}})})}remove(e){return o(this,void 0,void 0,function*(){const t=yield this.repository.findOne({where:{id:e}});if(!t)throw new r.NotFoundException(`Role with ID ${e} not found`);if(t.is_system||t.is_default)throw new r.BadRequestException("Cannot delete system or default role");return yield this.checkRoleUsage(e),yield this.repository.delete(e),t})}};exports.RoleService=c,exports.RoleService=c=e([(0,r.Injectable)(),i(0,(0,n.InjectRepository)(d.Role)),t("design:paramtypes",[s.Repository,s.DataSource])],c);
|