Skip to content

Commit 2cfc173

Browse files
committed
Support guest access games
1 parent 7563717 commit 2cfc173

36 files changed

+664
-375
lines changed

.graphqlrc.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ projects:
33
schema:
44
- ${API_BASE:http://localhost:8080}/schema:
55
method: GET
6-
documents: packages/webapp/src/services/schema.graphql
6+
documents: packages/webapp/src/services/{schema,common}.graphql
77
webappguest:
88
schema:
99
- ${API_BASE:http://localhost:8080}/guestschema:
1010
method: GET
11-
documents: packages/webapp/src/services/guest.graphql
11+
documents: packages/webapp/src/services/{guest,common}.graphql

packages/server/src/schemas/root.rs

+24
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub struct QueryRoot;
2323

2424
#[juniper::graphql_object(Context = Context)]
2525
impl QueryRoot {
26+
#[deprecated]
2627
fn games(_context: &Context) -> FieldResult<Vec<ScGame>> {
2728
let conn = DB_POOL.get().unwrap();
2829
Ok(get_games(&conn))
@@ -32,13 +33,15 @@ impl QueryRoot {
3233
Ok(get_recent_ids(&conn, context.user_id))
3334
}
3435
fn top_games(_context: &Context) -> FieldResult<Vec<i32>> {
36+
// TODO: 个性化推荐
3537
let conn = DB_POOL.get().unwrap();
3638
Ok(get_top_ids(&conn))
3739
}
3840
fn favorites(context: &Context) -> FieldResult<Vec<i32>> {
3941
let conn = DB_POOL.get().unwrap();
4042
Ok(get_favorites(&conn, context.user_id))
4143
}
44+
#[deprecated]
4245
fn comments(_context: &Context, input: ScCommentsReq) -> FieldResult<Vec<ScComment>> {
4346
let conn = DB_POOL.get().unwrap();
4447
Ok(get_comments(&conn, input.game_id))
@@ -59,6 +62,7 @@ impl QueryRoot {
5962
let conn = DB_POOL.get().unwrap();
6063
Ok(get_friends(&conn, context.user_id))
6164
}
65+
#[deprecated]
6266
fn rooms(_context: &Context) -> FieldResult<Vec<ScRoom>> {
6367
let conn = DB_POOL.get().unwrap();
6468
Ok(get_rooms(&conn))
@@ -433,6 +437,26 @@ impl GuestQueryRoot {
433437
fn hello() -> FieldResult<String> {
434438
Ok("guest".to_owned())
435439
}
440+
441+
fn games(_context: &GuestContext) -> FieldResult<Vec<ScGame>> {
442+
let conn = DB_POOL.get().unwrap();
443+
Ok(get_games(&conn))
444+
}
445+
446+
fn top_games(_context: &GuestContext) -> FieldResult<Vec<i32>> {
447+
let conn = DB_POOL.get().unwrap();
448+
Ok(get_top_ids(&conn))
449+
}
450+
451+
fn comments(_context: &GuestContext, input: ScCommentsReq) -> FieldResult<Vec<ScComment>> {
452+
let conn = DB_POOL.get().unwrap();
453+
Ok(get_comments(&conn, input.game_id))
454+
}
455+
456+
fn rooms(_context: &GuestContext) -> FieldResult<Vec<ScRoom>> {
457+
let conn = DB_POOL.get().unwrap();
458+
Ok(get_rooms(&conn))
459+
}
436460
}
437461

438462
pub struct GuestMutationRoot;

packages/webapp/codegen.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ generates:
44
schema:
55
- ${API_BASE:http://localhost:8080}/schema:
66
method: GET
7-
documents: "src/**/schema.graphql"
7+
documents: "src/**/{schema,common}.graphql"
88
plugins:
99
- typescript
1010
- typescript-operations
@@ -20,7 +20,7 @@ generates:
2020
schema:
2121
- ${API_BASE:http://localhost:8080}/guestschema:
2222
method: GET
23-
documents: "src/**/guest.graphql"
23+
documents: "src/**/{guest,common}.graphql"
2424
plugins:
2525
- typescript
2626
- typescript-operations

packages/webapp/src/app.ts

+19-6
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ import {
3030
toggleSettingsState,
3131
SearchCommand,
3232
} from 'src/configure';
33-
import { enterPubRoom, getAccount, getFriends, getGames, subscribeEvent } from 'src/services/api';
33+
import { enterPubRoom, getAccount, getFriends, getGameIds, subscribeEvent } from 'src/services/api';
34+
import { getGames } from 'src/services/guest-api';
3435
import { i18n } from 'src/i18n/basic';
3536
import { clearLobbyMessage, friendStore, toggleFriendChatState } from 'src/store';
3637
import { ScFriendStatus } from 'src/generated/graphql';
@@ -157,17 +158,29 @@ export class AppRootElement extends GemElement {
157158
this.#scrollPosition.clear();
158159
this.contentRef.element?.scrollTo(0, 0);
159160
clearLobbyMessage();
160-
return forever(getGames);
161+
getGames();
162+
if (configure.user) {
163+
getGameIds();
164+
}
161165
},
162166
() => [i18n.currentLanguage],
163167
);
164-
forever(getAccount);
165-
forever(getFriends);
168+
this.effect(
169+
() => {
170+
if (configure.user) {
171+
getAccount();
172+
getFriends();
173+
const subscription = subscribeEvent();
174+
return () => {
175+
subscription.return?.();
176+
};
177+
}
178+
},
179+
() => [configure.user?.id],
180+
);
166181
addEventListener('keydown', this.#globalShortcut);
167-
const subscription = subscribeEvent();
168182
return () => {
169183
removeEventListener('keydown', this.#globalShortcut);
170-
subscription.return?.();
171184
};
172185
};
173186

packages/webapp/src/auth.ts

+7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ export const gotoRedirectUri = () => {
1616
}
1717
};
1818

19+
export const gotoLogin = () => {
20+
history.push({
21+
path: createPath(routes.login),
22+
query: new QueryString({ [queryKeys.REDIRECT_URI]: window.location.href }),
23+
});
24+
};
25+
1926
export const logout = () => {
2027
if (matchRoute(routes.login)) return;
2128
deleteUser();

packages/webapp/src/generated/graphql.ts

+73-96
Original file line numberDiff line numberDiff line change
@@ -483,46 +483,41 @@ export type Subscription = {
483483
event: ScNotifyMessage;
484484
};
485485

486-
export type ScGamePartFragment = { __typename?: 'ScGame', id: number, name: string, description: string, preview: string, createdAt: number, updatedAt: number, rom: string, screenshots: Array<string>, platform?: ScGamePlatform, kind?: ScGameKind, series?: ScGameSeries, maxPlayer?: number };
487-
488-
export type ScMessagePartFragment = { __typename?: 'ScMessage', id: number, body: string, targetId: number, userId: number, createdAt: number, updatedAt: number };
489-
490-
export type ScLobbyMessagePartFragment = { __typename?: 'ScLobbyMessage', createdAt: number, userId: number, username: string, nickname: string, text: string };
491-
492-
export type ScLobbyInfoPartFragment = { __typename?: 'ScLobbyInfo', lobbyUserCount: number, onlineUserCount: number };
493-
494486
export type ScRoomBasicPartFragment = { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number };
495487

496-
export type ScInvitePartFragment = { __typename?: 'ScInvite', id: number, targetId: number, userId: number, createdAt: number, updatedAt: number, room: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } };
488+
export type ScAccountPartFragment = { __typename?: 'ScUser', id: number, username: string, nickname: string, settings?: string, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } };
497489

498490
export type ScUserBasicPartFragment = { __typename?: 'ScUserBasic', id: number, username: string, nickname: string, status: ScUserStatus, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } };
499491

500-
export type ScAccountPartFragment = { __typename?: 'ScUser', id: number, username: string, nickname: string, settings?: string, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } };
501-
502492
export type ScRoomPartFragment = { __typename?: 'ScRoom', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number, screenshot?: string, users: Array<{ __typename?: 'ScUserBasic', id: number, username: string, nickname: string, status: ScUserStatus, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } }> };
503493

494+
export type ScGamePartFragment = { __typename?: 'ScGame', id: number, name: string, description: string, preview: string, createdAt: number, updatedAt: number, rom: string, screenshots: Array<string>, platform?: ScGamePlatform, kind?: ScGameKind, series?: ScGameSeries, maxPlayer?: number };
495+
504496
export type ScCommentPartFragment = { __typename?: 'ScComment', gameId: number, body: string, like: boolean, createdAt: number, updatedAt: number, user: { __typename?: 'ScUserBasic', id: number, username: string, nickname: string, status: ScUserStatus, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } } };
505497

506-
export type ScRecordPartFragment = { __typename?: 'ScRecord', playTotal: number, lastPlayStartAt: number, lastPlayEndAt?: number };
498+
export type ScMessagePartFragment = { __typename?: 'ScMessage', id: number, body: string, targetId: number, userId: number, createdAt: number, updatedAt: number };
507499

508-
export type ScFriendPartFragment = { __typename?: 'ScFriend', createdAt: number, status: ScFriendStatus, unreadMessageCount: number, user: { __typename?: 'ScUserBasic', id: number, username: string, nickname: string, status: ScUserStatus, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } } };
500+
export type ScLobbyMessagePartFragment = { __typename?: 'ScLobbyMessage', createdAt: number, userId: number, username: string, nickname: string, text: string };
509501

510-
export type GetGamesQueryVariables = Exact<{ [key: string]: never; }>;
502+
export type ScLobbyInfoPartFragment = { __typename?: 'ScLobbyInfo', lobbyUserCount: number, onlineUserCount: number };
511503

504+
export type ScInvitePartFragment = { __typename?: 'ScInvite', id: number, targetId: number, userId: number, createdAt: number, updatedAt: number, room: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } };
512505

513-
export type GetGamesQuery = { __typename?: 'QueryRoot', topGames: Array<number>, favorites: Array<number>, recentGames: Array<number>, games: Array<{ __typename?: 'ScGame', id: number, name: string, description: string, preview: string, createdAt: number, updatedAt: number, rom: string, screenshots: Array<string>, platform?: ScGamePlatform, kind?: ScGameKind, series?: ScGameSeries, maxPlayer?: number }> };
506+
export type ScRecordPartFragment = { __typename?: 'ScRecord', playTotal: number, lastPlayStartAt: number, lastPlayEndAt?: number };
507+
508+
export type ScFriendPartFragment = { __typename?: 'ScFriend', createdAt: number, status: ScFriendStatus, unreadMessageCount: number, user: { __typename?: 'ScUserBasic', id: number, username: string, nickname: string, status: ScUserStatus, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } } };
514509

515-
export type GetRoomsQueryVariables = Exact<{ [key: string]: never; }>;
510+
export type GetGameIdsQueryVariables = Exact<{ [key: string]: never; }>;
516511

517512

518-
export type GetRoomsQuery = { __typename?: 'QueryRoot', rooms: Array<{ __typename?: 'ScRoom', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number, screenshot?: string, users: Array<{ __typename?: 'ScUserBasic', id: number, username: string, nickname: string, status: ScUserStatus, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } }> }> };
513+
export type GetGameIdsQuery = { __typename?: 'QueryRoot', topGames: Array<number>, favorites: Array<number>, recentGames: Array<number> };
519514

520-
export type GetCommentsQueryVariables = Exact<{
515+
export type GetRecordQueryVariables = Exact<{
521516
gameId: Scalars['Int'];
522517
}>;
523518

524519

525-
export type GetCommentsQuery = { __typename?: 'QueryRoot', comments: Array<{ __typename?: 'ScComment', gameId: number, body: string, like: boolean, createdAt: number, updatedAt: number, user: { __typename?: 'ScUserBasic', id: number, username: string, nickname: string, status: ScUserStatus, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } } }>, record?: { __typename?: 'ScRecord', playTotal: number, lastPlayStartAt: number, lastPlayEndAt?: number } };
520+
export type GetRecordQuery = { __typename?: 'QueryRoot', record?: { __typename?: 'ScRecord', playTotal: number, lastPlayStartAt: number, lastPlayEndAt?: number } };
526521

527522
export type GetFriendsQueryVariables = Exact<{ [key: string]: never; }>;
528523

@@ -682,47 +677,6 @@ export type EventSubscriptionVariables = Exact<{ [key: string]: never; }>;
682677

683678
export type EventSubscription = { __typename?: 'Subscription', event: { __typename?: 'ScNotifyMessage', deleteRoom?: number, deleteInvite?: number, deleteFriend?: number, login?: boolean, newMessage?: { __typename?: 'ScMessage', id: number, body: string, targetId: number, userId: number, createdAt: number, updatedAt: number }, lobbyMessage?: { __typename?: 'ScLobbyMessage', createdAt: number, userId: number, username: string, nickname: string, text: string }, newGame?: { __typename?: 'ScGame', id: number, name: string, description: string, preview: string, createdAt: number, updatedAt: number, rom: string, screenshots: Array<string>, platform?: ScGamePlatform, kind?: ScGameKind, series?: ScGameSeries, maxPlayer?: number }, updateRoom?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number }, newInvite?: { __typename?: 'ScInvite', id: number, targetId: number, userId: number, createdAt: number, updatedAt: number, room: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } }, applyFriend?: { __typename?: 'ScFriend', createdAt: number, status: ScFriendStatus, unreadMessageCount: number, user: { __typename?: 'ScUserBasic', id: number, username: string, nickname: string, status: ScUserStatus, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } } }, acceptFriend?: { __typename?: 'ScFriend', createdAt: number, status: ScFriendStatus, unreadMessageCount: number, user: { __typename?: 'ScUserBasic', id: number, username: string, nickname: string, status: ScUserStatus, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } } }, updateUser?: { __typename?: 'ScUserBasic', id: number, username: string, nickname: string, status: ScUserStatus, playing?: { __typename?: 'ScRoomBasic', id: number, gameId: number, private: boolean, host: number, createdAt: number, updatedAt: number } }, sendSignal?: { __typename?: 'ScSignal', userId: number, json: string }, voiceSignal?: { __typename?: 'ScVoiceSignal', roomId: number, json: string } } };
684679

685-
export const ScGamePart = `
686-
fragment ScGamePart on ScGame {
687-
id
688-
name
689-
description
690-
preview
691-
createdAt
692-
updatedAt
693-
rom
694-
screenshots
695-
platform
696-
kind
697-
series
698-
maxPlayer
699-
}
700-
`;
701-
export const ScMessagePart = `
702-
fragment ScMessagePart on ScMessage {
703-
id
704-
body
705-
targetId
706-
userId
707-
createdAt
708-
updatedAt
709-
}
710-
`;
711-
export const ScLobbyMessagePart = `
712-
fragment ScLobbyMessagePart on ScLobbyMessage {
713-
createdAt
714-
userId
715-
username
716-
nickname
717-
text
718-
}
719-
`;
720-
export const ScLobbyInfoPart = `
721-
fragment ScLobbyInfoPart on ScLobbyInfo {
722-
lobbyUserCount
723-
onlineUserCount
724-
}
725-
`;
726680
export const ScRoomBasicPart = `
727681
fragment ScRoomBasicPart on ScRoomBasic {
728682
id
@@ -733,18 +687,6 @@ export const ScRoomBasicPart = `
733687
updatedAt
734688
}
735689
`;
736-
export const ScInvitePart = `
737-
fragment ScInvitePart on ScInvite {
738-
id
739-
room {
740-
...ScRoomBasicPart
741-
}
742-
targetId
743-
userId
744-
createdAt
745-
updatedAt
746-
}
747-
`;
748690
export const ScAccountPart = `
749691
fragment ScAccountPart on ScUser {
750692
id
@@ -781,6 +723,22 @@ export const ScRoomPart = `
781723
screenshot
782724
}
783725
`;
726+
export const ScGamePart = `
727+
fragment ScGamePart on ScGame {
728+
id
729+
name
730+
description
731+
preview
732+
createdAt
733+
updatedAt
734+
rom
735+
screenshots
736+
platform
737+
kind
738+
series
739+
maxPlayer
740+
}
741+
`;
784742
export const ScCommentPart = `
785743
fragment ScCommentPart on ScComment {
786744
user {
@@ -793,6 +751,43 @@ export const ScCommentPart = `
793751
updatedAt
794752
}
795753
`;
754+
export const ScMessagePart = `
755+
fragment ScMessagePart on ScMessage {
756+
id
757+
body
758+
targetId
759+
userId
760+
createdAt
761+
updatedAt
762+
}
763+
`;
764+
export const ScLobbyMessagePart = `
765+
fragment ScLobbyMessagePart on ScLobbyMessage {
766+
createdAt
767+
userId
768+
username
769+
nickname
770+
text
771+
}
772+
`;
773+
export const ScLobbyInfoPart = `
774+
fragment ScLobbyInfoPart on ScLobbyInfo {
775+
lobbyUserCount
776+
onlineUserCount
777+
}
778+
`;
779+
export const ScInvitePart = `
780+
fragment ScInvitePart on ScInvite {
781+
id
782+
room {
783+
...ScRoomBasicPart
784+
}
785+
targetId
786+
userId
787+
createdAt
788+
updatedAt
789+
}
790+
`;
796791
export const ScRecordPart = `
797792
fragment ScRecordPart on ScRecord {
798793
playTotal
@@ -810,38 +805,20 @@ export const ScFriendPart = `
810805
unreadMessageCount
811806
}
812807
`;
813-
export const GetGames = `
814-
query getGames {
815-
games {
816-
...ScGamePart
817-
}
808+
export const GetGameIds = `
809+
query getGameIds {
818810
topGames
819811
favorites
820812
recentGames
821813
}
822-
${ScGamePart}`;
823-
export const GetRooms = `
824-
query getRooms {
825-
rooms {
826-
...ScRoomPart
827-
}
828-
}
829-
${ScRoomPart}
830-
${ScUserBasicPart}
831-
${ScRoomBasicPart}`;
832-
export const GetComments = `
833-
query getComments($gameId: Int!) {
834-
comments(input: {gameId: $gameId}) {
835-
...ScCommentPart
836-
}
814+
`;
815+
export const GetRecord = `
816+
query getRecord($gameId: Int!) {
837817
record(input: {gameId: $gameId}) {
838818
...ScRecordPart
839819
}
840820
}
841-
${ScCommentPart}
842-
${ScUserBasicPart}
843-
${ScRoomBasicPart}
844-
${ScRecordPart}`;
821+
${ScRecordPart}`;
845822
export const GetFriends = `
846823
query getFriends {
847824
friends {

0 commit comments

Comments
 (0)