Skip to content

Commit e5ee060

Browse files
authored
feat: add user agreement about agree collect RTC data (#851)
* feat: add user agreement about agree collect RTC data * feat: add user agreement about agree collect RTC data
1 parent a0604cc commit e5ee060

File tree

11 files changed

+451
-0
lines changed

11 files changed

+451
-0
lines changed

src/dao/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { UserPhoneModel } from "../model/user/Phone";
1919
import { UserSensitiveModel } from "../model/user/Sensitive";
2020
import { UserEmailModel } from "../model/user/Email";
2121
import { UserPmiModel } from "../model/user/Pmi";
22+
import { UserAgreementModel } from "../model/user/Agreement";
2223

2324
export const UserDAO = DAOImplement(UserModel) as ReturnType<DAO<UserModel>>;
2425

@@ -42,6 +43,8 @@ export const UserSensitiveDAO = DAOImplement(UserSensitiveModel) as ReturnType<
4243

4344
export const UserPmiDAO = DAOImplement(UserPmiModel) as ReturnType<DAO<UserPmiModel>>;
4445

46+
export const UserAgreementDAO = DAOImplement(UserAgreementModel) as ReturnType<DAO<UserAgreementModel>>;
47+
4548
export const RoomDAO = DAOImplement(RoomModel) as ReturnType<DAO<RoomModel>>;
4649

4750
export const RoomUserDAO = DAOImplement(RoomUserModel) as ReturnType<DAO<RoomUserModel>>;

src/model/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { OAuthUsersModel } from "./oauth/oauth-users";
2020
import { UserSensitiveModel } from "./user/Sensitive";
2121
import { UserEmailModel } from "./user/Email";
2222
import { UserPmiModel } from "./user/Pmi";
23+
import { UserAgreementModel } from "./user/Agreement";
2324
import { PartnerModel } from "./partner/Partner";
2425
import { PartnerRoomModel } from "./partner/PartnerRoom";
2526

@@ -34,6 +35,7 @@ export type Model =
3435
| UserEmailModel
3536
| UserSensitiveModel
3637
| UserPmiModel
38+
| UserAgreementModel
3739
| RoomModel
3840
| RoomUserModel
3941
| RoomPeriodicConfigModel

src/model/user/Agreement.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Column, Entity, Index } from "typeorm";
2+
import { Content } from "../Content";
3+
4+
@Entity({
5+
name: "user_agreement",
6+
})
7+
export class UserAgreementModel extends Content {
8+
@Index("user_agreement_user_uuid_uindex", {
9+
unique: true,
10+
})
11+
@Column({
12+
length: 40,
13+
})
14+
user_uuid: string;
15+
16+
@Column({
17+
default: false,
18+
})
19+
is_agree_collect_data: boolean;
20+
21+
@Index("user_agreement_is_delete_index")
22+
@Column({
23+
default: false,
24+
})
25+
is_delete: boolean;
26+
}

src/thirdPartyService/TypeORMService.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { OAuthSecretsModel } from "../model/oauth/oauth-secrets";
2323
import { OAuthUsersModel } from "../model/oauth/oauth-users";
2424
import { UserEmailModel } from "../model/user/Email";
2525
import { UserPmiModel } from "../model/user/Pmi";
26+
import { UserAgreementModel } from "../model/user/Agreement";
2627
import { PartnerModel } from "../model/partner/Partner";
2728
import { PartnerRoomModel } from "../model/partner/PartnerRoom";
2829

@@ -44,6 +45,7 @@ export const dataSource = new DataSource({
4445
UserEmailModel,
4546
UserSensitiveModel,
4647
UserPmiModel,
48+
UserAgreementModel,
4749
RoomModel,
4850
RoomUserModel,
4951
RoomPeriodicConfigModel,

src/v1/controller/user/Router.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import { BindingGithub } from "./binding/platform/github/Binding";
1717
import { BindingGoogle } from "./binding/platform/google/Binding";
1818
import { BindingEmail } from "./binding/platform/email/Binding";
1919
import { BindingApple } from "./binding/platform/apple/Binding";
20+
import { AgreementSet } from "./agreement/Set";
21+
import { AgreementGet } from "./agreement/Get";
22+
import { AgreementGetToRtc } from "./agreement/GetToRtc";
2023

2124
export const userRouters: Readonly<Array<ControllerClass<any, any>>> = Object.freeze([
2225
Rename,
@@ -38,4 +41,7 @@ export const userRouters: Readonly<Array<ControllerClass<any, any>>> = Object.fr
3841
DeleteAccount,
3942
UploadAvatarStart,
4043
UploadAvatarFinish,
44+
AgreementSet,
45+
AgreementGet,
46+
AgreementGetToRtc
4147
]);
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { AbstractController, ControllerClassParams } from "../../../../abstract/controller";
2+
import { Status } from "../../../../constants/Project";
3+
import { Controller } from "../../../../decorator/Controller";
4+
import { FastifySchema, Response, ResponseError } from "../../../../types/Server";
5+
6+
import { ServiceUserAgreement } from "../../../service/user/UserAgreement";
7+
8+
@Controller<RequestType, ResponseType>({
9+
method: "post",
10+
path: "user/agreement/get",
11+
auth: true,
12+
})
13+
export class AgreementGet extends AbstractController<RequestType, ResponseType> {
14+
public static readonly schema: FastifySchema<RequestType> = {
15+
};
16+
17+
public readonly svc: {
18+
userAgreement: ServiceUserAgreement;
19+
};
20+
21+
public constructor(params: ControllerClassParams) {
22+
super(params);
23+
24+
this.svc = {
25+
userAgreement: new ServiceUserAgreement(this.userUUID),
26+
};
27+
}
28+
29+
public async execute(): Promise<Response<ResponseType>> {
30+
const isAgree = await this.svc.userAgreement.isAgreeCollectData();
31+
return {
32+
status: Status.Success,
33+
data: {
34+
isAgree
35+
}
36+
}
37+
}
38+
39+
public errorHandler(error: Error): ResponseError {
40+
return this.autoHandlerError(error);
41+
}
42+
}
43+
44+
interface RequestType {
45+
querystring: {
46+
uid: string;
47+
};
48+
}
49+
50+
interface ResponseType {
51+
isAgree: boolean;
52+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import { RoomUserDAO } from "../../../../dao";
2+
import { AbstractController, ControllerClassParams } from "../../../../abstract/controller";
3+
import { Status } from "../../../../constants/Project";
4+
import { Controller } from "../../../../decorator/Controller";
5+
import { FastifySchema, Response, ResponseError } from "../../../../types/Server";
6+
7+
import { ServiceUserAgreement } from "../../../service/user/UserAgreement";
8+
9+
@Controller<RequestType, ResponseType>({
10+
method: "get",
11+
path: "private-polic/get",
12+
auth: false,
13+
skipAutoHandle: true,
14+
})
15+
export class AgreementGetToRtc extends AbstractController<RequestType, ResponseType> {
16+
public static readonly schema: FastifySchema<RequestType> = {
17+
querystring: {
18+
type: "object",
19+
required: ["uid"],
20+
properties: {
21+
uid: {
22+
type: "string"
23+
},
24+
room_uuid: {
25+
type: "string"
26+
}
27+
},
28+
},
29+
};
30+
31+
public readonly svc: {
32+
userAgreement: ServiceUserAgreement;
33+
};
34+
35+
public constructor(params: ControllerClassParams) {
36+
super(params);
37+
38+
this.svc = {
39+
userAgreement: new ServiceUserAgreement(this.userUUID),
40+
};
41+
}
42+
43+
public async execute(): Promise<Response<ResponseType>> {
44+
const rtcUidstr = this.querystring.uid;
45+
const room_uuid = this.querystring.room_uuid;
46+
const rtcUids = rtcUidstr.split(",");
47+
const listMap:Map<string, boolean> = new Map();
48+
if (rtcUids.length > 0) {
49+
for (const rtc_uid of rtcUids) {
50+
const roomUserInfo = await RoomUserDAO().findOne(["user_uuid"], {
51+
rtc_uid,
52+
room_uuid
53+
});
54+
if (roomUserInfo) {
55+
const bol = await ServiceUserAgreement.hasCollectData(roomUserInfo.user_uuid);
56+
if (bol) {
57+
const isAgree = await ServiceUserAgreement.isAgreeCollectData(roomUserInfo.user_uuid);
58+
listMap.set(rtc_uid, isAgree);
59+
} else {
60+
// 默认就是同意
61+
listMap.set(rtc_uid, true);
62+
}
63+
} else {
64+
// 查不到用户则默认不同意
65+
listMap.set(rtc_uid, false);
66+
}
67+
}
68+
}
69+
return {
70+
status: Status.Success,
71+
data: Object.fromEntries(listMap)
72+
}
73+
}
74+
75+
public errorHandler(error: Error): ResponseError {
76+
return this.autoHandlerError(error);
77+
}
78+
}
79+
80+
interface RequestType {
81+
querystring: {
82+
uid: string;
83+
room_uuid: string;
84+
};
85+
}
86+
87+
interface ResponseType {
88+
[key: string]: boolean;
89+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { AbstractController, ControllerClassParams } from "../../../../abstract/controller";
2+
import { Status } from "../../../../constants/Project";
3+
import { Controller } from "../../../../decorator/Controller";
4+
import { FastifySchema, Response, ResponseError } from "../../../../types/Server";
5+
6+
import { ServiceUserAgreement } from "../../../service/user/UserAgreement";
7+
8+
@Controller<RequestType, ResponseType>({
9+
method: "post",
10+
path: "user/agreement/set",
11+
auth: true,
12+
})
13+
export class AgreementSet extends AbstractController<RequestType, ResponseType> {
14+
public static readonly schema: FastifySchema<RequestType> = {
15+
body: {
16+
type: "object",
17+
required: ["is_agree_collect_data"],
18+
properties: {
19+
is_agree_collect_data: {
20+
type: "boolean"
21+
},
22+
},
23+
},
24+
};
25+
26+
public readonly svc: {
27+
userAgreement: ServiceUserAgreement;
28+
};
29+
30+
public constructor(params: ControllerClassParams) {
31+
super(params);
32+
33+
this.svc = {
34+
userAgreement: new ServiceUserAgreement(this.userUUID),
35+
};
36+
}
37+
38+
public async execute(): Promise<Response<ResponseType>> {
39+
await this.svc.userAgreement.set(this.body.is_agree_collect_data);
40+
return {
41+
status: Status.Success,
42+
data: {
43+
userUUID: this.userUUID
44+
}
45+
};
46+
}
47+
48+
public errorHandler(error: Error): ResponseError {
49+
return this.autoHandlerError(error);
50+
}
51+
}
52+
53+
interface RequestType {
54+
body: {
55+
is_agree_collect_data: boolean;
56+
};
57+
}
58+
59+
interface ResponseType {
60+
userUUID: string;
61+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { UserAgreementDAO } from "../../../dao";
2+
import { DeleteResult, EntityManager, InsertResult } from "typeorm";
3+
import { UpdateResult } from "typeorm/query-builder/result/UpdateResult";
4+
5+
export class ServiceUserAgreement {
6+
constructor(private readonly userUUID: string) {}
7+
public async isAgreeCollectData(): Promise<boolean> {
8+
const bol = await ServiceUserAgreement.hasCollectData(this.userUUID);
9+
if (bol) {
10+
const isAgree = await ServiceUserAgreement.isAgreeCollectData(this.userUUID);
11+
return isAgree;
12+
}
13+
return true;
14+
}
15+
public async hasCollectData(): Promise<boolean> {
16+
return await ServiceUserAgreement.hasCollectData(this.userUUID);
17+
}
18+
public static async isAgreeCollectData(userUUID: string): Promise<boolean> {
19+
const result = await UserAgreementDAO().findOne(["is_agree_collect_data"], {
20+
user_uuid: userUUID,
21+
});
22+
return Boolean(result && result.is_agree_collect_data);
23+
}
24+
public static async hasCollectData(userUUID: string): Promise<boolean> {
25+
const result = await UserAgreementDAO().findOne(["user_uuid"], {
26+
user_uuid: userUUID,
27+
});
28+
return Boolean(result);
29+
}
30+
public async set(
31+
is_agree_collect_data: boolean,
32+
t?: EntityManager,
33+
): Promise<InsertResult|UpdateResult> {
34+
const has = await this.hasCollectData();
35+
if (!has) {
36+
return await this.create(is_agree_collect_data, t);
37+
}
38+
return await this.update(is_agree_collect_data, t);
39+
}
40+
public async create(
41+
is_agree_collect_data: boolean,
42+
t?: EntityManager,
43+
): Promise<InsertResult> {
44+
return await UserAgreementDAO(t).insert({
45+
user_uuid: this.userUUID,
46+
is_agree_collect_data,
47+
});
48+
}
49+
public async update(is_agree_collect_data: boolean, t?: EntityManager): Promise<UpdateResult> {
50+
return await UserAgreementDAO(t).update(
51+
{
52+
is_agree_collect_data,
53+
},
54+
{
55+
user_uuid: this.userUUID,
56+
},
57+
);
58+
}
59+
60+
public async physicalDeletion(t?: EntityManager): Promise<DeleteResult> {
61+
return await UserAgreementDAO(t).physicalDeletion({
62+
user_uuid: this.userUUID,
63+
});
64+
}
65+
}

0 commit comments

Comments
 (0)