diff --git a/Dockerfile.media b/Dockerfile.media index 91f0e67..a69bc66 100644 --- a/Dockerfile.media +++ b/Dockerfile.media @@ -14,6 +14,7 @@ RUN go build -o /app /usr/src/app/cmd/media_service/main.go FROM alpine:3.19 COPY --from=build /app /app EXPOSE 8080 +EXPOSE 8081 CMD ["/app"] diff --git a/migrations/2406170339_create_image_table.up.sql b/migrations/2406170339_create_image_table.up.sql index ffe8f64..fdc229e 100644 --- a/migrations/2406170339_create_image_table.up.sql +++ b/migrations/2406170339_create_image_table.up.sql @@ -1,5 +1,5 @@ CREATE TABLE tmp_file( - fileId uuid PRIMARY KEY, + file_id uuid PRIMARY KEY, path varchar(100) NOT NULL , expected_usage int8 NOT NULL , uploader uuid references user_identity(user_id) NOT NULL, @@ -7,7 +7,7 @@ CREATE TABLE tmp_file( ); CREATE TABLE confirmed_file( - fileId uuid PRIMARY KEY, + file_id uuid PRIMARY KEY, path varchar(100) NOT NULL , usage int8 NOT NULL , uploader uuid references user_identity(user_id) NOT NULL, diff --git a/migrations/2406210105_default_avatar.down.sql b/migrations/2406210105_default_avatar.down.sql index d1756b4..30dd842 100644 --- a/migrations/2406210105_default_avatar.down.sql +++ b/migrations/2406210105_default_avatar.down.sql @@ -1 +1,3 @@ -ALTER TABLE user_identity DROP COLUMN avatar_url; \ No newline at end of file +ALTER TABLE user_identity DROP COLUMN avatar_id; +DELETE FROM confirmed_file WHERE file_id = '00000000-0000-0000-0000-000000000000'; +DELETE FROM user_identity WHERE user_id = '00000000-0000-0000-0000-000000000000'; diff --git a/migrations/2406210105_default_avatar.up.sql b/migrations/2406210105_default_avatar.up.sql index 355ec2b..fc2e0d7 100644 --- a/migrations/2406210105_default_avatar.up.sql +++ b/migrations/2406210105_default_avatar.up.sql @@ -1 +1,18 @@ -ALTER TABLE user_identity ADD COLUMN avatar_url VARCHAR(255) DEFAULT '/default_avatar.png' NOT NULL; \ No newline at end of file +INSERT INTO user_identity(user_id, name) VALUES ('00000000-0000-0000-0000-000000000000', 'system'); +INSERT INTO confirmed_file( + file_id, + path, + usage, + uploader, + uploaded_at, + confirmed_at +) VALUES ( + '00000000-0000-0000-0000-000000000000', + '/default_avatar.png', + 1, + '00000000-0000-0000-0000-000000000000', + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP +); + +ALTER TABLE user_identity ADD COLUMN avatar_id uuid DEFAULT '00000000-0000-0000-0000-000000000000' NOT NULL; \ No newline at end of file diff --git a/services/api/controllers/group/get_members.go b/services/api/controllers/group/get_members.go index a2e7653..319ab2c 100644 --- a/services/api/controllers/group/get_members.go +++ b/services/api/controllers/group/get_members.go @@ -34,9 +34,10 @@ func (s Service) GetGroupMembers(ctx context.Context, req *monify.GetGroupMember fileService := ctx.Value(lib.FileServiceContextKey{}).(infra.FileService) rows, err := db.QueryContext(ctx, ` - SELECT gm.user_id, gm.group_member_id, ui.name, ui.avatar_url + SELECT gm.user_id, gm.group_member_id, ui.name, cf.path FROM group_member gm LEFT JOIN user_identity ui on gm.user_id = ui.user_id + LEFT JOIN confirmed_file cf on ui.avatar_id = cf.file_id WHERE group_id = $1 `, groupId) if err != nil { diff --git a/services/api/controllers/user/get.go b/services/api/controllers/user/get.go index c9d6adb..e3ebfbc 100644 --- a/services/api/controllers/user/get.go +++ b/services/api/controllers/user/get.go @@ -9,6 +9,7 @@ import ( "google.golang.org/grpc/status" "monify/lib" monify "monify/protobuf/gen/go" + "monify/services/api/infra" ) func (Service) GetUserInfo(ctx context.Context, req *monify.GetUserInfoRequest) (*monify.GetUserInfoResponse, error) { @@ -20,7 +21,11 @@ func (Service) GetUserInfo(ctx context.Context, req *monify.GetUserInfoRequest) logger := ctx.Value(lib.LoggerContextKey{}).(*zap.Logger) response := monify.GetUserInfoResponse{} - err := db.QueryRowContext(ctx, "SELECT name, avatar_url FROM user_identity WHERE user_id = $1", userId).Scan(&response.Name, &response.AvatarUrl) + err := db.QueryRowContext(ctx, ` + SELECT name, cf.path + FROM user_identity + LEFT JOIN confirmed_file cf on user_identity.avatar_id = cf.file_id + WHERE user_id = $1`, userId).Scan(&response.Name, &response.AvatarUrl) if err != nil { if err == sql.ErrNoRows { return nil, status.Error(codes.NotFound, "Not found") @@ -28,5 +33,7 @@ func (Service) GetUserInfo(ctx context.Context, req *monify.GetUserInfoRequest) logger.Error("failed to get user info", zap.Error(err)) return nil, status.Error(codes.Internal, "Internal") } + fileService := ctx.Value(lib.FileServiceContextKey{}).(infra.FileService) + response.AvatarUrl = fileService.GetUrl(response.AvatarUrl) return &response, nil } diff --git a/services/api/infra/resources.go b/services/api/infra/resources.go index 5e3d46e..8e500b6 100644 --- a/services/api/infra/resources.go +++ b/services/api/infra/resources.go @@ -4,6 +4,8 @@ import ( "database/sql" "go.uber.org/zap" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + monify "monify/protobuf/gen/go" ) type Resources struct { @@ -24,10 +26,17 @@ func SetupResources(config Config) Resources { panic(err) } - grpc.NewClient("") + conn, err := grpc.NewClient("media_service:8081", grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + panic(err) + } return Resources{ DBConn: dbConn, Logger: logger, KafkaWriters: kafkaWriters, + FileService: FileService{ + config: config, + client: monify.NewMediaServiceClient(conn), + }, } } diff --git a/services/media/handler.go b/services/media/handler.go index 76238b8..8d2cc09 100644 --- a/services/media/handler.go +++ b/services/media/handler.go @@ -129,6 +129,6 @@ func extractFileNameSuffix(fileName string) string { func StoreTmpFile(ctx context.Context, file media.TmpFile) error { db := ctx.Value(lib.DatabaseContextKey{}).(*sql.DB) - _, err := db.ExecContext(ctx, "INSERT INTO tmp_file (fileid, path, uploader, expected_usage, uploaded_at) VALUES ($1, $2, $3, $4, $5)", file.Id, file.Path, file.Uploader, file.ExpectedUsage, file.UploadedAt) + _, err := db.ExecContext(ctx, "INSERT INTO tmp_file (file_id, path, uploader, expected_usage, uploaded_at) VALUES ($1, $2, $3, $4, $5)", file.Id, file.Path, file.Uploader, file.ExpectedUsage, file.UploadedAt) return err } diff --git a/services/media/service.go b/services/media/service.go index a5fc336..e97c779 100644 --- a/services/media/service.go +++ b/services/media/service.go @@ -18,7 +18,7 @@ type Service struct { func (Service) ConfirmImageUsage(ctx context.Context, req *monify.ConfirmFileUsageRequest) (*monify.MEmpty, error) { db := ctx.Value(lib.DatabaseContextKey{}).(*sql.DB) tmpImage := media.TmpFile{} - err := db.QueryRowContext(ctx, "SELECT path, expected_usage, uploader, uploaded_at FROM tmp_file WHERE fileid = $1", req.FileId).Scan(&tmpImage.Path, &tmpImage.ExpectedUsage, &tmpImage.Uploader, &tmpImage.UploadedAt) + err := db.QueryRowContext(ctx, "SELECT path, expected_usage, uploader, uploaded_at FROM tmp_file WHERE file_id = $1", req.FileId).Scan(&tmpImage.Path, &tmpImage.ExpectedUsage, &tmpImage.Uploader, &tmpImage.UploadedAt) if err != nil { if err == sql.ErrNoRows { return nil, status.Errorf(codes.NotFound, "image not found") @@ -26,18 +26,18 @@ func (Service) ConfirmImageUsage(ctx context.Context, req *monify.ConfirmFileUsa return nil, status.Errorf(codes.Internal, "error getting image: %v", err) } - _, err = db.ExecContext(ctx, "INSERT INTO confirmed_file (fileid, path, \"usage\", uploader, uploaded_at, confirmed_at) VALUES ($1, $2, $3, $4, $5, $6)", req.FileId, tmpImage.Path, tmpImage.ExpectedUsage, tmpImage.Uploader, tmpImage.UploadedAt, time.Now()) + _, err = db.ExecContext(ctx, "INSERT INTO confirmed_file (file_id, path, \"usage\", uploader, uploaded_at, confirmed_at) VALUES ($1, $2, $3, $4, $5, $6)", req.FileId, tmpImage.Path, tmpImage.ExpectedUsage, tmpImage.Uploader, tmpImage.UploadedAt, time.Now()) if err != nil { return nil, status.Errorf(codes.Internal, "error inserting image: %v", err) } - _, _ = db.ExecContext(ctx, "DELETE FROM tmp_file WHERE fileid = $1", req.FileId) + _, _ = db.ExecContext(ctx, "DELETE FROM tmp_file WHERE file_id = $1", req.FileId) return &monify.MEmpty{}, nil } func (Service) GetFileUrl(ctx context.Context, req *monify.GetFileUrlRequest) (*monify.GetFileUrlResponse, error) { db := ctx.Value(lib.DatabaseContextKey{}).(*sql.DB) var path string - err := db.QueryRowContext(ctx, "SELECT path FROM confirmed_file WHERE fileid = $1", req.FileId).Scan(&path) + err := db.QueryRowContext(ctx, "SELECT path FROM confirmed_file WHERE file_id = $1", req.FileId).Scan(&path) if err != nil { if err == sql.ErrNoRows { return nil, status.Errorf(codes.NotFound, "image not found")