Files
2025-07-01 12:42:28 +07:00

210 lines
4.8 KiB
Go

package mongo
import (
patient "api-poliklinik/pkg/models/mongo/insertpatient"
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
"log"
"time"
)
func (s *DatabaseService) GetNextRekamMedikNumber() (string, error) {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
filter := bson.M{"_id": "RekamMedik"}
update := bson.M{"$inc": bson.M{"seq": 1}}
opts := options.FindOneAndUpdate().SetUpsert(true).SetReturnDocument(options.After)
var result struct {
Seq int `bson:"seq"`
}
err := s.DBMongo.Collection("counters").FindOneAndUpdate(ctx, filter, update, opts).Decode(&result)
if err != nil {
log.Println("Error generating rekamedik number:", err)
return "", err
}
// Format nomor menjadi 7 digit, misalnya "0002032"
return fmt.Sprintf("%012d", result.Seq), nil
}
func (s *DatabaseService) InsertPatient(req patient.Patient) error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
_, err := s.DBMongo.Collection("patient").InsertOne(ctx, req)
if err != nil {
log.Println(err)
return err
}
return nil
}
func (s *DatabaseService) InsertPatientmongo(req *patient.Patient) error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// Jika ID belum diinisialisasi, set ID baru
if req.ID.IsZero() {
req.ID = primitive.NewObjectID()
}
result, err := s.DBMongo.Collection("patient").InsertOne(ctx, req)
if err != nil {
log.Println(err)
return err
}
// Mengambil ID yang dihasilkan dan memasukkannya kembali ke struct
if oid, ok := result.InsertedID.(primitive.ObjectID); ok {
req.ID = oid
}
return nil
}
func (s *DatabaseService) GetPatientByIdentifier(display string, value string) ([]*patient.Patient, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
filter := bson.M{
"identifier": bson.M{
"$elemMatch": bson.M{
"type.coding.display": display,
"value": value,
},
},
}
cursor, err := s.DBMongo.Collection("patient").Find(ctx, filter)
if err != nil {
log.Println(err)
return nil, err
}
defer cursor.Close(ctx)
var results []*patient.Patient
if err = cursor.All(ctx, &results); err != nil {
log.Println(err)
return nil, err
}
return results, nil
}
//filter := bson.M{
//"identifier": bson.M{
//"$elemMatch": bson.M{
//"type.coding.display": display,
//"value": value,
//},
//},
//}
func (s *DatabaseService) GetAllDataPatient(limit int64, skip int64) ([]*patient.Patient, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
findOptions := options.Find()
findOptions.SetLimit(limit)
findOptions.SetSkip(skip)
findOptions.SetSort(bson.D{{"_id", -1}})
filter := bson.M{
"active": true,
}
dataUser, err := s.DBMongo.Collection("patient").Find(ctx, filter, findOptions)
if err != nil {
log.Println(err)
}
var users []*patient.Patient
err = dataUser.All(ctx, &users)
if err != nil {
log.Println(err)
return nil, err
}
return users, nil
}
func (s *DatabaseService) UpdatePatient(id string, req *patient.UpdatePatient) error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// Konversi id menjadi ObjectID
objectID, err := primitive.ObjectIDFromHex(id)
if err != nil {
log.Println(err)
return err
}
req.ID = "" // Kosongkan ID agar tidak ikut terupdate
filter := bson.M{"_id": objectID}
update := bson.M{
"$set": req,
}
_, err = s.DBMongo.Collection("patient").UpdateOne(ctx, filter, update)
if err != nil {
log.Println(err)
return err
}
return nil
}
func (s *DatabaseService) DeletePatient(id string, req *patient.DeletePatient) error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// Konversi id menjadi ObjectID
objectID, err := primitive.ObjectIDFromHex(id)
if err != nil {
log.Println(err)
return err
}
req.ID = "" // Kosongkan ID agar tidak ikut terupdate
filter := bson.M{"_id": objectID}
update := bson.M{
"$set": bson.M{
"active": req.Active,
},
}
_, err = s.DBMongo.Collection("patient").UpdateOne(ctx, filter, update)
if err != nil {
log.Println(err)
return err
}
return nil
}
func (s *DatabaseService) GetPasienByid(id string) ([]*patient.Patient, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
objectID, err := primitive.ObjectIDFromHex(id)
filter := bson.M{
"_id": objectID,
}
cursor, err := s.DBMongo.Collection("patient").Find(ctx, filter)
if err != nil {
log.Println(err)
return nil, err
}
defer cursor.Close(ctx)
var results []*patient.Patient
if err = cursor.All(ctx, &results); err != nil {
log.Println(err)
return nil, err
}
return results, nil
}