Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

explicit video refs: shared operations, models, route shapes #134

Open
wants to merge 8 commits into
base: osdiab/feature/explicit-video-refs
Choose a base branch
from
27 changes: 27 additions & 0 deletions packages/shared/src/models/MediaReference.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
export interface MediaReferenceDefinition<Content> {
id: string;
content: Content & { url: string };
}

export enum MediaReferenceKind {
IMAGE = "IMAGE",
VIDEO = "VIDEO"
}

export interface MediaReferenceContent<Kind extends MediaReferenceKind> {
kind: Kind;
url: string;
}

export interface VideoReferenceContent
extends MediaReferenceContent<MediaReferenceKind.VIDEO> {
thumbnailUrl: string;
}
export type VideoReference = MediaReferenceDefinition<VideoReferenceContent>;

export type ImageReferenceContent = MediaReferenceContent<
MediaReferenceKind.IMAGE
>;
export type ImageReference = MediaReferenceDefinition<ImageReferenceContent>;

export type MediaReference = ImageReference | VideoReference;
6 changes: 4 additions & 2 deletions packages/shared/src/models/Member.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { OperationId } from "./identifiers";
import { Omit } from "../helpers/Omit";

export interface PublicMemberFields {
id: string;
Expand All @@ -7,12 +8,13 @@ export interface PublicMemberFields {
identity_video_url: string;
invite_confirmed: boolean;
username: string;
operationsFlaggingThisMember: OperationId[];
operationsFlaggingThisMember?: OperationId[];
}

export interface PrivateMemberFields {
email_address: string;
email_address_is_verified: string;
email_address_is_verified: boolean;
}

export type Member = PublicMemberFields & PrivateMemberFields;
export type MemberToBeCreated = Omit<Member, "created_at" | "id">;
45 changes: 42 additions & 3 deletions packages/shared/src/models/Operation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// TODO: change all to_uid to to_member_id
import { MemberId, MemberUsername, OperationId } from "./identifiers";
import { VideoReference } from "./MediaReference";

export enum OperationType {
CREATE_MEMBER = "CREATE_MEMBER",
Expand All @@ -18,7 +19,19 @@ export interface CreateMemberPayload {
full_name: string;
request_invite_from_member_id?: MemberId;
username: MemberUsername;
videoReference: VideoReference;
}
// START [video-reference] legacy types
export interface LegacyCreateMemberPayload {
full_name: string;
request_invite_from_member_id?: MemberId;
username: MemberUsername;
video_url: string;
}
export type LegacyCompatCreateMemberPayload = CreateMemberPayload &
LegacyCreateMemberPayload;
// END [video-reference] legacy types

export interface EditMemberPayload {
full_name?: string;
username?: string;
Expand All @@ -37,14 +50,31 @@ export interface RequestVerificationPayload {
invite_token?: string;
}
export interface VerifyPayload {
to_uid: MemberId;
videoReference: VideoReference;
}
// START [video-reference] legacy types
export interface LegacyVerifyPayload {
to_uid: MemberId;
video_url: string;
}
export type LegacyCompatVerifyPayload = VerifyPayload & LegacyVerifyPayload;
// END [video-reference] legacy types

export interface InvitePayload {
invite_token: string;
is_joint_video: boolean;
videoReference: VideoReference;
}
// START [video-reference] legacy types
export interface LegacyInvitePayload {
invite_token: string;
is_joint_video: boolean;
video_token: string;
}
export type LegacyCompatInvitePayload = InvitePayload & LegacyInvitePayload;
// END [video-reference] legacy types

export interface TrustPayload {
to_uid: MemberId;
}
Expand All @@ -62,6 +92,7 @@ export interface MintReferralBonusPayload {
invited_member_id: MemberId;
}
export type MintPayload = MintBasicIncomePayload | MintReferralBonusPayload;
// TODO: support media metadata. Deferring for now to not interfere with tipping
export interface GivePayload {
to_uid: MemberId;
amount: string;
Expand All @@ -83,8 +114,11 @@ export interface SavedOperationBase {

interface CreateMemberOperationMetadata {
op_code: OperationType.CREATE_MEMBER;
data: CreateMemberPayload;
// TODO: [video-reference] legacy - once apps updated, use CreateMemberPayload
// data: CreateMemberPayload;
data: LegacyCompatCreateMemberPayload;
}

export type CreateMemberOperation = SavedOperationBase &
CreateMemberOperationMetadata;
export type CreateMemberOperationToBeCreated = ToSaveOperationBase &
Expand Down Expand Up @@ -128,15 +162,20 @@ export type RequestVerificationOperationToBeCreated = ToSaveOperationBase &

interface VerifyOperationMetadata {
op_code: OperationType.VERIFY;
data: VerifyPayload;
// TODO: [video-reference] legacy - once apps updated, use VerifyPayload
// data: VerifyPayload;
data: LegacyCompatVerifyPayload;
}

export type VerifyOperation = SavedOperationBase & VerifyOperationMetadata;
export type VerifyOperationToBeCreated = ToSaveOperationBase &
VerifyOperationMetadata;

interface InviteOperationMetadata {
op_code: OperationType.INVITE;
data: InvitePayload;
// TODO: [video-reference] legacy - once apps updated, use InvitePayload
// data: InviteMemberPayload;
data: LegacyCompatInvitePayload;
}
export type InviteOperation = SavedOperationBase & InviteOperationMetadata;
export type InviteOperationToBeCreated = ToSaveOperationBase &
Expand Down
9 changes: 8 additions & 1 deletion packages/shared/src/routes/me/definitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
} from "../ApiEndpoint/ApiResponse";
import { ApiLocationDefinition } from "../ApiEndpoint/ApiCall";
import { MintPayload, EditMemberPayload } from "../../models/Operation";
import { VideoReference } from "../../models/MediaReference";

export type EditMemberApiLocation = ApiLocationDefinition<
ApiEndpointUri.EDIT_MEMBER,
Expand Down Expand Up @@ -53,17 +54,23 @@ export const sendInviteApiLocation: SendInviteApiLocation = {
method: HttpVerb.POST,
authenticated: true
};
export interface SendInviteApiBody {
inviteEmail: string;
isJointVideo: boolean;
videoReference: VideoReference["content"];
}
export type SendInviteApiCall = ApiCallDefinition<
SendInviteApiLocation["uri"],
SendInviteApiLocation["method"],
SendInviteApiLocation["authenticated"],
void,
{ inviteEmail: string; videoToken: string; isJointVideo: boolean }
SendInviteApiBody
>;
export type SendInviteApiResponse = ApiResponseDefinition<
201,
MessageApiResponseBody
>;

export type SendInviteApiEndpoint = ApiEndpointDefinition<
ApiEndpointName.SEND_INVITE,
SendInviteApiCall,
Expand Down
23 changes: 14 additions & 9 deletions packages/shared/src/routes/members/definitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
ResolveFlagMemberPayload
} from "../../models/Operation";
import { Omit } from "../../helpers/Omit";
import { VideoReference } from "../../models/MediaReference";

export type ListMembersApiLocation = ApiLocationDefinition<
ApiEndpointUri.GET_MEMBERS,
Expand Down Expand Up @@ -116,19 +117,20 @@ export const createMemberApiLocation: CreateMemberApiLocation = {
method: HttpVerb.POST,
authenticated: true
};
export interface CreateMemberApiCallBody {
fullName: string;
emailAddress: string;
username: string;
inviteToken?: string;
subscribeToNewsletter?: boolean;
videoReference: VideoReference["content"];
}
export type CreateMemberApiCall = ApiCallDefinition<
CreateMemberApiLocation["uri"],
CreateMemberApiLocation["method"],
CreateMemberApiLocation["authenticated"],
void,
{
fullName: string;
emailAddress: string;
videoToken: string;
username: string;
inviteToken?: string;
subscribeToNewsletter?: boolean;
}
CreateMemberApiCallBody
>;
export type CreateMemberApiResponse = ApiResponseDefinition<
201,
Expand All @@ -151,12 +153,15 @@ export const verifyMemberApiLocation: VerifyMemberApiLocation = {
method: HttpVerb.POST,
authenticated: true
};
export interface VerifyMemberApiCallBody {
videoReference: VideoReference["content"];
}
export type VerifyMemberApiCall = ApiCallDefinition<
VerifyMemberApiLocation["uri"],
VerifyMemberApiLocation["method"],
VerifyMemberApiLocation["authenticated"],
{ memberId: MemberId },
{ videoToken: string }
VerifyMemberApiCallBody
>;
export type VerifyMemberApiResponse = ApiResponseDefinition<
201,
Expand Down